在SQL Server中,将CTE“WITH”和“WITH XMLNAMESPACES…”结合使用

42

有人成功创建了一个包含 WITH XMLNAMESPACES 声明的 SQL Server T-SQL 中的公共表表达式(CTE)吗?

似乎两个 WITH 关键字都坚持要求它们是“T-SQL批处理中的第一条语句”,但这并不真正起作用...

我尝试过:

WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
WITH CTEQuery AS
(
SELECT (list of fields)
    FROM dbo.MyTable
    WHERE (conditions)
)
SELECT * FROM CTEQuery

没起作用 :-( (语法错误)

消息156,级别15,状态1,第2行
关键字'WITH'附近的语法不正确。
消息319,级别15,状态1,第2行
关键字'with'附近的语法不正确。如果这个语句是一个常用表达式、一个xmlnamespaces子句或者一个更改跟踪上下文子句,则前面的语句必须以分号结尾。

所以我试着在第二个WITH之前加了一个分号:

WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
;WITH CTEQuery AS
(
SELECT (list of fields)
    FROM dbo.MyTable
    WHERE (conditions)
)
SELECT * FROM CTEQuery

我尝试了以下代码:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near ';'。

接着我试着将 WITH XMLNAMESPACES 放入 CTE 中:

WITH CTEQuery AS
(
   WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
   SELECT (list of fields)
      FROM dbo.MyTable
      WHERE (conditions)
)
SELECT * FROM CTEQuery

我尝试过这个:

Msg 156,Level 15,State 1,Line 4
关键字 'WITH' 附近的语法不正确。
Msg 319,Level 15,State 1,Line 4
关键字 'with' 附近的语法不正确。如果此语句是通用表达式、xmlnamespaces 子句或更改跟踪上下文子句,则必须使用分号终止前面的语句。
Msg 102,Level 15,State 1,Line 21
附近的语法不正确 ')'。

那么我该怎么做呢?

1个回答

65

使用逗号替换第二个WITH,例如:

WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
,CTEQuery AS
(
SELECT (list of fields)
    FROM dbo.MyTable
    WHERE (conditions)
)
SELECT * FROM CTEQuery

如果您想要多个CTE表达式,可以使用相同的方法。您只需要指定一次 WITH , 然后所有其他的 WITH 块都使用逗号而不是关键字。


6
在任何公共表达式(CTE)之前,必须先定义XML名称空间(XMLNAMESPACES)。 - Gabrielius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接