2016-07-25 79 views
0

使用declare我有這樣的查詢:在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結合來模擬視圖中的變量。如果數字的生成方式太頻繁,可以考慮爲它們建立一個單獨的(和索引的)表格。

這是我認爲你在找的東西。我忽略了CTE,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 

產生輸出:

status name 
12  dbo 
0  db_accessadmin 
0  db_securityadmin 
0  db_ddladmin 

也經由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 

也經由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