2009-09-17 12 views
30

Im utilizzando SQL Server 2005. Ho 2 con clausole nel mio stored procedureSintassi errata vicino alla parola chiave 'con' ... l'istruzione precedente deve essere terminata con un punto e virgola

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

Ma l'errore si verifica

Sintassi non corretta in prossimità della parola chiave 'con'. Se questa istruzione è un'espressione di tabella comune o una clausola xmlnamespaces, l'istruzione precedente deve essere terminata con un punto e virgola.

Quali sono le mie opzioni? C'è qualche splitter che non conosco?

risposta

53

Utilizzare una virgola per separare CTE

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

stesso vale per l'istruzione MERGE di SQL Server 2008, troppo - ** ** deve essere terminato con un punto e virgola! –

+0

gbn, mi hai salvato la pelle. Stavo ricevendo questo errore su un componente di query in Delphi, è stato perplesso! Grazie ancora. E tu Duncan. –

13

Dimenticatevi di aggiunta di un ";" alla dichiarazione precedente, come dice il messaggio di errore. Basta avere l'abitudine di codifica sempre come: "; con" e starai bene ...

;WITH SomeClause1 AS 
(
    SELECT .... 
) 

tuttavia, è necessario collegare più CTE con virgole, ma il "; CON" ha sempre un punto e virgola prima:

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

Non funziona per me.

Nel mio caso sto utilizzando il valore CTE all'interno della clausola RETURN di una funzione definita dall'utente con valori di tabella. Se avvolgo la clausola RETURN in BEGIN-END, ottengo lo stesso messaggio di errore, ma una clausola RETURN() nuda funziona correttamente. Credo che il messaggio di errore non sia corretto in questo caso.

Questo funziona:

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 
Problemi correlati