Неверный синтаксис рядом с ключевым словом 'with' ... предыдущий оператор должен заканчиваться точкой с запятой - PullRequest
34 голосов
/ 17 сентября 2009

Я использую SQL Server 2005. У меня есть 2 предложения WITH в моей хранимой процедуре

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

Но возникает ошибка

Неверный синтаксис рядом с ключевым словом «с». Если этот оператор является общим табличным выражением или предложением xmlnamespaces, предыдущий оператор должен заканчиваться точкой с запятой.

Какие у меня варианты? Есть ли сплиттер, о котором я не знаю?

Ответы [ 4 ]

63 голосов
/ 17 сентября 2009

Используйте запятую для разделения CTE

;WITH SomeClause1 AS
(
  SELECT ....
)
, SomeClause2 AS
(
  SELECT ....
)
13 голосов
/ 17 сентября 2009

Забудьте о добавлении ";" к предыдущему утверждению, как говорится в сообщении об ошибке. Просто привыкните всегда кодировать его так: «С», и все будет хорошо ...

;WITH SomeClause1 AS
(
  SELECT ....
)

однако вы должны соединить несколько CTE запятыми, но перед символом «; WITH» всегда стоит точка с запятой:

;WITH SomeClause1 AS
(
  SELECT ....
)
,SomeClause2 AS
(
  SELECT ....
)
1 голос
/ 08 апреля 2011

Младен Прайдич предложил это как решение для "с пространствами имен xml", прекрасно работает.

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

0 голосов
/ 15 июня 2010

У меня не работает.

В моем случае я использую значение CTE в предложении RETURN табличной пользовательской функции. Если я обертываю предложение RETURN в BEGIN-END, я получаю то же сообщение об ошибке, но голое предложение RETURN () работает нормально. Я считаю, что сообщение об ошибке неверно в этом случае.

Это работает:

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