J'utilise SQL Server 2005. J'ai 2 WITH Clauses dans ma procédure stockée
WITH SomeClause1 AS
(
SELECT ....
)
WITH SomeClause2 AS
(
SELECT ....
)
Mais l'erreur se produit
Syntaxe incorrecte près du mot clé 'with'. Si cette instruction est une expression de table commune ou une clause xmlnamespaces, l'instruction précédente doit être terminée par un point-virgule.
Quelles sont mes options? Y a-t-il un séparateur que je ne connais pas?
Utilisez une virgule pour séparer les CTE
;WITH SomeClause1 AS
(
SELECT ....
)
, SomeClause2 AS
(
SELECT ....
)
Oubliez l'ajout d'un ";" à la déclaration précédente, comme dit le message d'erreur. Prenez l'habitude de toujours le coder comme suit: "; WITH" et tout ira bien ...
;WITH SomeClause1 AS
(
SELECT ....
)
cependant, vous devez connecter plusieurs CTE avec des virgules, mais le "; WITH" est toujours précédé d'un point-virgule:
;WITH SomeClause1 AS
(
SELECT ....
)
,SomeClause2 AS
(
SELECT ....
)
Mladen Prajdic a suggéré cela comme une solution pour "avec xmlnamespaces", fonctionne très bien.
http://itknowledgeexchange.techtarget.com/sql-server/using-xmlnamespaces-within-a-function/
Ca ne marche pas pour moi.
Dans mon cas, j'utilise la valeur CTE dans la clause RETURN d'une fonction définie par l'utilisateur sous forme de table. Si j'emballe la clause RETURN dans BEGIN-END, j'obtiens le même message d'erreur, mais une clause nue RETURN () fonctionne correctement. Je crois que le message d'erreur est incorrect dans ce cas.
Cela marche:
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