关键字'with'... previous语句附近的语法不正确必须以分号结束

时间:2009-09-17 14:08:25

标签: sql sql-server sql-server-2005 tsql common-table-expression

我正在使用SQL Server 2005。我的存储过程中有2个WITH子句

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

但是错误发生了

关键字'with'附近的语法不正确。如果此语句是公用表表达式或xmlnamespaces子句,则必须以分号结束前一个语句。

我有什么选择?有什么分配器我不知道吗?

5 个答案:

答案 0 :(得分:63)

使用逗号分隔CTE

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

答案 1 :(得分:13)

忘记添加“;”到前面的语句,就像错误消息所说的那样。只是习惯于总是将其编码为:“; WITH”,你会很好......

;WITH SomeClause1 AS
(
  SELECT ....
)

但是,您必须使用逗号连接多个CTE,但“; WITH”之前始终有一个分号:

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

答案 2 :(得分:1)

Mladen Prajdic建议将此作为“使用xmlnamespaces”的解决方案,效果很好。

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

答案 3 :(得分:0)

对我不起作用。

在我的情况下,我在表值用户定义函数的RETURN子句中使用CTE值。如果我在BEGIN-END中包装RETURN子句,我得到相同的错误消息,但是一个裸的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  

答案 4 :(得分:0)

尝试升级SQL Server数据库COMPATIBILITY_LEVEL

ALTER DATABASE DatabaseName SET COMPATIBILITY_LEVEL = 130

参考链接:-https://docs.microsoft.com/en-us/sql/relational-databases/databases/view-or-change-the-compatibility-level-of-a-database?view=sql-server-ver15