关键字“with”附近的语法不正确...上一条语句必须以分号结束

Posted

技术标签:

【中文标题】关键字“with”附近的语法不正确...上一条语句必须以分号结束【英文标题】:Incorrect syntax near the keyword 'with'...previous statement must be terminated with a semicolon 【发布时间】:2010-11-29 04:12:15 【问题描述】:

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

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

但出现错误

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

我有哪些选择?有没有我不知道的分离器?

【问题讨论】:

【参考方案1】:

使用逗号分隔 CTE

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

【讨论】:

SQL Server 2008 MERGE 语句也是如此 - 它必须以分号结束! gbn,你救了我的皮。我在 Delphi 的查询组件上遇到了这个错误,被难住了!再次感谢。还有你邓肯。【参考方案2】:

忘记添加“;”到前面的语句,就像错误消息说的那样。只要养成总是像这样编码的习惯:“;WITH”,你会没事的......

;WITH SomeClause1 AS
(
  SELECT ....
)

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

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

【讨论】:

【参考方案3】:

不适合我。

在我的例子中,我在表值用户定义函数的 RETURN 子句中使用 CTE 值。如果我将 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  

【讨论】:

【参考方案4】:

尝试升级 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

【讨论】:

以上是关于关键字“with”附近的语法不正确...上一条语句必须以分号结束的主要内容,如果未能解决你的问题,请参考以下文章

错误“关键字 'CONVERT' 附近的语法不正确”

关键字 UNION 附近的语法不正确

ExecuteNonQuery() 抛出“关键字‘用户’附近的语法不正确”

关键字“FOR”XML 附近的语法不正确

关键字“read”附近的语法不正确

关键字“或”附近的语法不正确