2016-07-25 27 views
0

で宣言し使用:私はこのようなクエリを持つSQL Serverのビュー

DECLARE @year_start INT 
DECLARE @year_end INT 

SET @year_start = 2005 
SET @year_end = 2014 

; WITH p_year AS 
(
    SELECT p_year = @year_start 

    UNION ALL 

    SELECT p_year = p_year + 1 
    FROM p_year 
    WHERE p_year < @year_end 
), 
Interval AS 
(--- 
), 
CTE AS 
(--- 
), 
CTE_1 AS 
(--- 
) 
SELECT something 
FROM CTE_1 
WHERE Rank <= 3 
ORDER BY something 

私が作成するテーブル値関数を使用して、それを試してみましたが、どのようにテーブル値関数の宣言で変数を操作するためのことを得ることができません。

私のように、テーブル値関数を作成しようとしたのに対し:

CREATE FUNCTION P_Count() 
RETURNS TABLE 
AS 
DECLARE ... 
... 

私はそれビュー作りたいけどDeclare文は私が可能ではありません。どのように私はそれをビューにすることができますか?

+5

経由ビューは、パラメータを持つことができない、それはそれです。あなたはテーブル値関数のような他のものを作らなければなりません。テーブル値関数を作成する際に問題がある場合は、関連するコードとエラーを投稿してください。 – Paolo

+0

@Paolo私はテーブル値関数の試したクエリを与えました – maliks

+0

ビューが何であるか考えてみてください。これは、データベース内の静的な仮想テーブルです。定義上、パラメータはそこに存在することはできません。 –

答えて

0

あなたの作成機能のスクリプトがBEGINをミス:ここ

CREATE FUNCTION P_Count() 
RETURNS @tableName TABLE (structure here) 
AS 
BEGIN 
    DECLARE... 
    ... 
    RETURN; 
END; 

msdn

0

Maliks上の構文のリファレンスで、私は考え、いくつかは、あなたのSQLと混同されました。範囲内の年を生成するために再帰的なCTEを使用することはすぐにはわかりませんでした。 There are lots of awesome waysを使用して、ビュー内の変数をエミュレートするためにCTEと組み合わせることができる整数のシーケンス(または一般的な数値)を生成します。数字があまりにも頻繁に生成される場合は、それらのために別個の(および索引付きの)表を作成することを検討してください。

ここがあなたが探していたと思います。私はCTEs、rankを省略し、あなたの質問に定義していないグループ分けします。あなたが望むようにそれを変更することができます。

WITH params AS (SELECT BegYr = 2005, EndYr=2014), 
nums AS (SELECT DISTINCT n = number FROM master..spt_values WHERE number>=0) 
SELECT Yr=BegYr + n FROM nums, params 
WHERE n <= EndYr - BegYr 

は、より一般的には、ここでうまく内部変数建設をエミュレートするCTEを使用するサンプル・ビュー・クエリです。使用しているバージョンのSQL Serverでテスト実行できます。出力が得

CREATE VIEW vwImportant_Users AS 
WITH params AS (
    SELECT 
    varType='%Admin%', 
    varMinStatus=1) 
SELECT status, name 
    FROM sys.sysusers, params 
    WHERE status > varMinStatus OR name LIKE varType 

SELECT * FROM vwImportant_Users 

JOIN

WITH params AS (SELECT varType='%Admin%', varMinStatus=1) 
SELECT status, name 
    FROM sys.sysusers INNER JOIN params ON 1=1 
    WHERE status > varMinStatus OR name LIKE varType 

を経由しても

status name 
12  dbo 
0  db_accessadmin 
0  db_securityadmin 
0  db_ddladmin 

CROSS APPLY

WITH params AS (SELECT varType='%Admin%', varMinStatus=1) 
SELECT status, name 
    FROM sys.sysusers CROSS APPLY params 
    WHERE status > varMinStatus OR name LIKE varType 
関連する問題