在SQL Server中结合CTE"WITH"和"WITH XMLNAMESPACES ...."

mar*_*c_s 31 sql-server common-table-expression

有没有人设法在SQL Server的T-SQL中创建一个CTE,其中还包含一个WITH XMLNAMESPACES声明?

似乎两个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
Run Code Online (Sandbox Code Playgroud)

没用了:-((语法错误)

消息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
Run Code Online (Sandbox Code Playgroud)

得到了这个:

消息102,级别15,状态1,行2
'''附近的语法不正确.

然后我尝试将其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
Run Code Online (Sandbox Code Playgroud)

得到了这个:

消息156,级别15,状态1,行4
关键字"WITH"附近的语法不正确.
消息319,级别15,状态1,行4
关键字'with'附近的语法不正确.如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号终止先前的语句.
消息102,级别15,状态1,行21
''''附近的语法不正确.

那我该怎么办呢?

Gre*_*ech 48

使用逗号而不是第二个WITH,例如

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

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

  • 并且必须首先在任何`CTE`之前定义`XMLNAMESPACES`. (3认同)