38

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

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

但是发生错误

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

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

4

4 回答 4

70

使用逗号分隔 CTE

;WITH SomeClause1 AS
(
  SELECT ....
)
, SomeClause2 AS
(
  SELECT ....
)
于 2009-09-17T14:10:36.967 回答
17

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

;WITH SomeClause1 AS
(
  SELECT ....
)

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

;WITH SomeClause1 AS
(
  SELECT ....
)
,SomeClause2 AS
(
  SELECT ....
)
于 2009-09-17T18:51:18.120 回答
2

尝试升级 SQL Server 数据库 COMPATIBILITY_LEVEL

ALTER DATABASE 数据库名称集 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-版本 15

于 2020-11-07T12:16:52.383 回答
1

对我不起作用。

在我的例子中,我在表值用户定义函数的 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  
于 2010-06-15T16:41:14.513 回答