我正在使用 SQL Server 2005 。我的存储过程中有 2 个 WITH 子句
WITH SomeClause1 AS
(
SELECT ....
)
WITH SomeClause2 AS
(
SELECT ....
)
但是发生错误
关键字“with”附近的语法不正确。如果此语句是公用表表达式或 xmlnamespaces 子句,则前面的语句必须以分号结束。
我有哪些选择?有没有我不知道的分离器?
我正在使用 SQL Server 2005 。我的存储过程中有 2 个 WITH 子句
WITH SomeClause1 AS
(
SELECT ....
)
WITH SomeClause2 AS
(
SELECT ....
)
但是发生错误
关键字“with”附近的语法不正确。如果此语句是公用表表达式或 xmlnamespaces 子句,则前面的语句必须以分号结束。
我有哪些选择?有没有我不知道的分离器?
使用逗号分隔 CTE
;WITH SomeClause1 AS
(
SELECT ....
)
, SomeClause2 AS
(
SELECT ....
)
忘记添加“;” 到前面的语句,就像错误消息说的那样。只要养成总是像这样编码的习惯:“;WITH”,你会没事的......
;WITH SomeClause1 AS
(
SELECT ....
)
但是,您必须用逗号连接多个 CTE,但“;WITH”之前总是有一个分号:
;WITH SomeClause1 AS
(
SELECT ....
)
,SomeClause2 AS
(
SELECT ....
)
尝试升级 SQL Server 数据库 COMPATIBILITY_LEVEL
ALTER DATABASE 数据库名称集 COMPATIBILITY_LEVEL = 130
对我不起作用。
在我的例子中,我在表值用户定义函数的 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