2009-09-17 20 views
30

Im mit SQL Server 2005 beendet werden. Ich habe 2 MIT Klauseln in meiner gespeicherten ProzedurFalsche Syntax in der Nähe des Schlüsselwortes 'mit' ... vorherige Anweisung muss mit einem Semikolon

WITH SomeClause1 AS 
(
    SELECT .... 
) 
WITH SomeClause2 AS 
(
    SELECT .... 
) 

Aber der Fehler auftritt

falsche Syntax nahe dem Schlüsselwort ‚mit‘. Wenn diese Anweisung ein allgemeiner Tabellenausdruck oder eine xmlnamespaces-Klausel ist, muss die vorherige Anweisung mit einem Semikolon abgeschlossen werden.

Was sind meine Optionen? Gibt es einen Splitter, von dem ich nichts weiß?

Antwort

53

ein Komma verwenden CTEs

;WITH SomeClause1 AS 
(
    SELECT .... 
) 
, SomeClause2 AS 
(
    SELECT .... 
) 
+0

gleiche gilt für die MERGE-Anweisung SQL Server 2008, auch - es ** muss ** mit einem Semikolon abgeschlossen werden! –

+0

gbn, du hast meine Haut gerettet. Ich habe diesen Fehler bei einer Abfrage-Komponente in Delphi bekommen, war ratlos! Danke noch einmal. Und du Duncan. –

13

Vergessen Sie das Hinzufügen einer trennen ";" zur vorherigen Aussage, wie die Fehlermeldung sagt. Nehmen Sie einfach die Gewohnheit Codierung es immer so: „; mit“ und alles wird gut ...

;WITH SomeClause1 AS 
(
    SELECT .... 
) 

Sie müssen jedoch mehrere CTEs mit Komma, aber die Verbindung „die mit“ hat immer ein Semikolon davor:

;WITH SomeClause1 AS 
(
    SELECT .... 
) 
,SomeClause2 AS 
(
    SELECT .... 
) 
0

Funktioniert nicht für mich.

In meinem Fall verwende ich den CTE-Wert innerhalb der RETURN-Klausel einer Tabellenwert-benutzerdefinierten Funktion. Wenn ich die RETURN-Klausel in BEGIN-END umbrechen, erhalte ich die gleiche Fehlermeldung, aber eine leere RETURN() -Klausel funktioniert einwandfrei. Ich glaube, dass die Fehlermeldung in diesem Fall falsch ist.

Dies funktioniert:

CREATE FUNCTION [dbo].[ft_SplitStringOnChar] 
     (
     @s varchar(8000), 
     @sep char(1) 
    ) 

RETURNS TABLE 
AS 

RETURN (
    WITH Pieces(pn, start, stop) AS (
     SELECT 1, 1, CHARINDEX(@sep, @s) 
     UNION ALL 
     SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) 
     FROM Pieces 
     WHERE stop > 0 
    ) 
    SELECT pn AS TokenNumber, 
     SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS TokenString 
    FROM Pieces 
) 

GO 

This does not: 

CREATE FUNCTION [dbo].[ft_SplitStringOnChar] 
     (
     @s varchar(8000), 
     @sep char(1) 
    ) 

RETURNS TABLE 
AS 
BEGIN 
; 
RETURN (
    WITH Pieces(pn, start, stop) AS (
     SELECT 1, 1, CHARINDEX(@sep, @s) 
     UNION ALL 
     SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) 
     FROM Pieces 
     WHERE stop > 0 
    ) 
    SELECT pn AS TokenNumber, 
     SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS TokenString 
    FROM Pieces 
) 
END 
GO 
Verwandte Themen