wake-up-neo.com

Falsche Syntax in der Nähe des Schlüsselworts 'with' ... vorherige Anweisung muss mit einem Semikolon abgeschlossen werden

Ich verwende SQL Server 2005. Ich habe 2 WITH-Klauseln in meiner gespeicherten Prozedur

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

Der Fehler tritt jedoch auf

Falsche Syntax in der Nähe des Schlüsselworts 'with'. Wenn es sich bei dieser Anweisung um einen allgemeinen Tabellenausdruck oder eine Xmlnamespaces-Klausel handelt, muss die vorherige Anweisung mit einem Semikolon abgeschlossen werden.

Welche Möglichkeiten habe ich? Gibt es einen Splitter, von dem ich nichts weiß?

33
Duncan

Verwenden Sie ein Komma, um die CTEs zu trennen

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

Vergessen Sie das Hinzufügen eines ";" zur vorherigen Anweisung, wie die Fehlermeldung sagt. Gewöhnen Sie sich einfach daran, es immer zu codieren: "; WITH" und schon geht es Ihnen gut ...

;WITH SomeClause1 AS
(
  SELECT ....
)

sie müssen jedoch mehrere CTEs mit Kommas verbinden, das "; WITH" enthält jedoch immer ein Semikolon:

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

Mladen Prajdic schlug dies als Lösung für "mit xmlnamespaces" vor und funktioniert hervorragend.

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

1
fritz

Funktioniert nicht für mich.

In meinem Fall verwende ich den CTE-Wert innerhalb der RETURN-Klausel einer benutzerdefinierten Funktion mit Tabellenwert. Wenn ich die RETURN-Klausel in BEGIN-END einhülle, erhalte ich dieselbe Fehlermeldung, aber eine bloße RETURN () -Klausel funktioniert einwandfrei. Ich glaube, dass die Fehlermeldung in diesem Fall falsch ist.

Das funktioniert:

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