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 ....
)