2009-09-17 11 views
30

Im przy użyciu programu SQL Server 2005. Mam 2 z klauzulami w moim procedury przechowywanejNiepoprawna składnia w pobliżu słowa kluczowego "z" ... poprzednia instrukcja musi być zakończona średnikiem

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

Ale błąd występuje

Niepoprawna składnia w pobliżu słowo kluczowe „z”. Jeśli ta instrukcja jest typowym wyrażeniem tabelowym lub klauzulą ​​xmlnamespause, poprzednia instrukcja musi być zakończona średnikiem.

Jakie są moje opcje? Czy jest jakiś splitter, o którym nie wiem?

Odpowiedz

53

Używaj przecinka, aby oddzielić współczynniki CTE

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

samo dotyczy oświadczenie MERGE SQL Server 2008, za - to ** ** musi być zakończone średnikiem! –

+0

gbn, uratowałeś moją skórę. Otrzymałem ten błąd na składniku zapytania w Delphi, byłam zakłopotana! Dzięki jeszcze raz. A ty Duncan. –

13

Zapomnij o dodanie ";" do poprzedniego oświadczenia, podobnie jak komunikat o błędzie. Po prostu w zwyczaju zawsze kodowania to tak: „; z” i będzie dobrze ...

;WITH SomeClause1 AS 
(
    SELECT .... 
) 

jednak trzeba połączyć wiele współczynniki CTE z przecinkami, ale „; od” zawsze ma średnik przed nim:

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

Nie działa dla mnie.

W moim przypadku używam wartości WRT w klauzuli POWRÓT funkcji zdefiniowanej przez tabelę użytkownika. Jeśli otworzę klauzulę RETURN w BEGIN-END, otrzymam ten sam komunikat o błędzie, ale nieważna klauzula RETURN() działa poprawnie. Uważam, że komunikat o błędzie jest w tym przypadku niepoprawny.

to działa:

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 
Powiązane problemy