with instruccion example cte consulta common comando sql sql-server sql-server-2005 tsql common-table-expression

sql - instruccion - La sintaxis incorrecta cerca de la palabra clave ''con''... la declaración anterior debe terminarse con un punto y coma



with as() sql (4)

Mladen Prajdic sugirió esto como una solución para "con xmlnamespaces", funciona muy bien.

http://itknowledgeexchange.techtarget.com/sql-server/using-xmlnamespaces-within-a-function/

Estoy usando SQL Server 2005. Tengo 2 cláusulas WITH en mi procedimiento almacenado

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

Pero el error ocurre

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?


No funciona para mi

En mi caso, estoy usando el valor CTE dentro de la cláusula RETORNO de una función definida por el usuario con valores 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


Olvídate de agregar un ";" a la declaración anterior, como dice el mensaje de error. Solo hágase el hábito de codificarlo siempre como: "; CON" y estará bien ...

;WITH SomeClause1 AS ( SELECT .... )

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

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


Use una coma para separar los CTE

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