2016-07-25 10 views
0

ich eine Abfrage wie diese:die Verwendung in SQL Server Ansicht Deklarieren

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 

Ich habe versucht, es zu schaffen Tabellenwertfunktion kann aber nicht bekommen, dass, wie mit Variablen in der Tabelle bewerten Funktion Erklärung zu manipulieren.

Während ich versuchte, zu schaffen Tabellenwertfunktion als:

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

ich einen Blick machen wollen, aber Declare Aussage erlaubt es mir nicht. Wie kann ich es sehen?

+5

eine Ansicht können Parameter nicht haben, das ist es. Sie müssen etwas anderes erstellen, wie eine Tabellenwertfunktion. Wenn Sie Probleme haben, eine Tabellenwertfunktion zu erstellen, geben Sie den entsprechenden Code und die Fehler ein, die Sie erhalten. – Paolo

+0

@Paolo Ich habe die versuchte Abfrage für Tabellenwertfunktion gegeben – maliks

+0

Denken Sie darüber nach, was eine Sicht ist. Es ist eine statische virtuelle Tabelle in der Datenbank. Per Definition können Parameter nicht da sein, da dies etwas anderes wäre. –

Antwort

0

Ihre Funktion Skript verfehlt ein BEGIN:

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

hier ist die Syntax Bezug auf msdn

0

Maliks, nehme ich an, einige waren mit Ihrem SQL verwirrt. Es war nicht sofort ersichtlich, dass Sie einen rekursiven CTE verwenden, um Jahre in einem Bereich zu generieren. There are lots of awesome ways, um eine Folge von Ganzzahlen (oder Zahlen im Allgemeinen) zu generieren, die mit einem CTE kombiniert werden können, um Variablen in einer Ansicht zu emulieren. Wenn Zahlen zu oft generiert werden, sollten Sie eine separate (und indizierte) Tabelle für sie erstellen.

Hier ist, was ich denke, dass Sie gesucht haben. Ich überspringe die CTEs, rank und die Gruppierung, die Sie in Ihrer Frage nicht definiert haben. Sie können es ändern, wie Sie wollen:

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 

Allgemeiner hier ist eine Beispielansicht Abfrage, die CTE verwendet, um schön interne variable Konstruktion zu emulieren. Sie können es in Ihrer Version von SQL Server testen.

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 

Nachgeben Ausgang:

status name 
12  dbo 
0  db_accessadmin 
0  db_securityadmin 
0  db_ddladmin 

auch über 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 

auch über 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 
Verwandte Themen