2009-09-17 21 views
30

Im usando SQL Server 2005. Tengo 2 con cláusulas en mi procedimiento almacenadoSintaxis incorrecta cerca de la palabra clave 'con' ... la instrucción anterior debe terminarse con un punto y coma

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

Sin embargo, el error se produce

sintaxis incorrecta cerca de la palabra clave 'con'. Si esta instrucción es una expresión de tabla común o una cláusula xmlnamespaces, la instrucción anterior debe terminarse con un punto y coma.

¿Cuáles son mis opciones? ¿Hay algún divisor que no sepa?

Respuesta

53

utilizar una coma para separar las CTE

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

mismo ocurre con la instrucción MERGE SQL Server 2008, también - ** ** imprescindible terminar con un punto y coma! –

+0

gbn, has guardado mi escondite. ¡Estaba obteniendo este error en un componente de consulta en Delphi, estaba perplejo! Gracias de nuevo. Y tú Duncan. –

13

Olvídate de la adición de un ";" a la declaración anterior, como dice el mensaje de error. Acaba de obtener en el hábito de codificación de ella como: "; CON" y se le multa ...

;WITH SomeClause1 AS 
(
    SELECT .... 
) 

Sin embargo, se debe conectar múltiples CTE con comas, pero el "; CON" siempre tiene una punto y coma antes:

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

No funciona para mí.

En mi caso estoy usando el valor CTE dentro de la cláusula RETORNO de una función definida por el usuario de tabla. Si envuelvo la cláusula RETORNO en BEGIN-END recibo el mismo mensaje de error, pero una cláusula RETURN() desnuda funciona bien. Creo que el mensaje de error es incorrecto en este caso.

Esto funciona:

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 
Cuestiones relacionadas