web-dev-qa-db-fra.com

Syntaxe incorrecte près du mot clé 'with' ... l'instruction précédente doit être terminée par un point-virgule

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?

33
Duncan

Utilisez une virgule pour séparer les CTE

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

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

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/

1
fritz

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  
0
Cornan