2016-06-15 9 views
0

Dies ist das erste Mal, dass ich versuche, eine Sicht in T-SQL erstellen, aber ich erhalte eine Fehlermeldung: CREATE VIEW muss die einzige Anweisung in der sein Stapel.Erstellen Sie Ansicht Fehler als Anweisung muss nur eine im Batch

Warum gibt es mir diesen Fehler und wie kann es behoben werden?

Ich schaute auf einige Beispiele, aber immer noch nicht ganz sicher, was ich tun muss.

CREATE PROCEDURE [dbo].[League_Table_Insert] 
    @LeagueName VARCHAR(30) 
AS 
SET NOCOUNT ON 
BEGIN 

    CREATE VIEW League_Table AS 
    SELECT 
     TeamName AS Team, 
     COUNT(*) Played, 
     COUNT(CASE WHEN HomeScore > AwayScore THEN 1 END) Wins, 
     COUNT(CASE WHEN AwayScore > HomeScore THEN 1 END) Losses, 
     COUNT(CASE WHEN HomeScore = AwayScore THEN 1 END) Draws, 
     SUM(HomeScore) Goals_Scored, 
     SUM(AwayScore) Goals_Against, 
     SUM(HomeScore) - SUM(AwayScore) Goal_Difference, 
     SUM(
       CASE WHEN HomeScore > AwayScore THEN 3 ELSE 0 END 
      + CASE WHEN HomeScore = AwayScore THEN 1 ELSE 0 END 
     ) Points 

    FROM 
    (
     SELECT TeamName, HomeScore, AwayScore FROM dbo.Team t INNER JOIN dbo.Fixture f ON t.TeamID = f.HomeTeamID INNER JOIN dbo.League l ON f.LeagueID = l.LeagueID WHERE LeagueName = @LeagueName 
     UNION ALL 
     SELECT TeamName, HomeScore, AwayScore FROM dbo.Team t INNER JOIN dbo.Fixture f ON t.TeamID = f.HomeTeamID INNER JOIN dbo.League l ON f.LeagueID = l.LeagueID WHERE LeagueName = @LeagueName 
    ) matches 

    GROUP BY TeamName 
    ORDER BY Points DESC, Goal_Difference DESC; 
+0

Bitte zeigen Sie Ihre en Reifenabfrage. Außerdem können Sie eine Variable in einer Ansicht nicht verwenden. –

+0

Sie können nicht @Variable verwenden, um Ansicht zu erstellen. –

+0

@FelixPamittan das ist die gesamte Abfrage, ich habe gerade erstellt erstellen auf der Oberseite, aber ich nehme an, dass das falsch ist? –

Antwort

3

Sie können keine VIEW innerhalb einer Funktion erstellen. Sie können auch keine Variable in einem VIEW verwenden. Was Sie wollen, ist eine Tabellenwertfunktion. Hier ist ein Skript erstellen für eine Inline-Tabellenwertfunktion (iTVF):

CREATE FUNCTION dbo.League_Table (
    @LeagueName  VARCHAR(MAX) 
) 
RETURNS TABLE 
AS 
RETURN 

SELECT 
    TeamName AS Team, 
    COUNT(*) Played, 
    COUNT(CASE WHEN HomeScore > AwayScore THEN 1 END) Wins, 
    COUNT(CASE WHEN AwayScore > HomeScore THEN 1 END) Losses, 
    COUNT(CASE WHEN HomeScore = AwayScore THEN 1 END) Draws, 
    SUM(HomeScore) Goals_Scored, 
    SUM(AwayScore) Goals_Against, 
    SUM(HomeScore) - SUM(AwayScore) Goal_Difference, 
    SUM(
      CASE WHEN HomeScore > AwayScore THEN 3 ELSE 0 END 
     + CASE WHEN HomeScore = AwayScore THEN 1 ELSE 0 END 
    ) Points 

FROM 
(
    SELECT TeamName, HomeScore, AwayScore FROM dbo.Team t INNER JOIN dbo.Fixture f ON t.TeamID = f.HomeTeamID INNER JOIN dbo.League l ON f.LeagueID = l.LeagueID WHERE LeagueName = @LeagueName 
    UNION ALL 
    SELECT TeamName, HomeScore, AwayScore FROM dbo.Team t INNER JOIN dbo.Fixture f ON t.TeamID = f.HomeTeamID INNER JOIN dbo.League l ON f.LeagueID = l.LeagueID WHERE LeagueName = @LeagueName 
) matches 

GROUP BY TeamName; 

Bitte beachte, dass ich die ORDER BY Klausel entfernt, da es nicht in Inline-Funktionen erlaubt ist. Andernfalls erhalten Sie eine Fehlermeldung erhalten, die besagt:

Die ORDER BY-Klausel ist ungültig, Ansichten, Inline-Funktionen, abgeleitete Tabellen, Unterabfragen und allgemeine Tabellenausdrücke, es sei denn, TOP, OFFSET oder FOR XML wird auch angegeben .

Dann, es zu benutzen:

SELECT * 
FROM dbo.League_Table('Sample League Name') s 
ORDER BY Points DESC, Goal_Difference DESC; 
0

MSDN Dokumentation eindeutig fest unter:

Die folgenden Aussagen können nicht überall im Körper einer gespeicherten Prozedur

CREATE verwendet werden AGGREGATE
SCHEMA erstellen
SET SHOWPLAN_TEXT
CREATE DEFAULT
CREATE oder ALTER TRIGGER
SET SHOWPLAN_XML
CREATE oder ALTER FUNCTION
CREATE oder ALTER VIEW
USE database_name
CREATE oder ALTER PROCEDURE
SET parseonly
CREATE RULE
SET SHOWPLAN_ALL

Verwandte Themen