在SQL Server中结合CTE“WITH”和“WITH XMLNAMESPACES ....”

时间:2010-09-10 13:58:56

标签: 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

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

  

Msg 156,Level 15,State 1,Line 2
  关键字“WITH”附近的语法不正确。
  消息319,级别15,状态1,行2   附近的语法不正确   关键字'with'。如果这个陈述是   公用表表达式,   xmlnamespaces子句或更改   跟踪上下文子句,前一个   声明必须以a终止   分号。

所以我尝试用分号前面加上第二个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
  ';'附近的语法不正确。

然后我尝试将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
  关键字附近的语法不正确   '用'。
  消息319,级别15,状态1,行4   附近的语法不正确   关键字'with'。如果这个陈述是   公用表表达式,   xmlnamespaces子句或更改   跟踪上下文子句,前一个   声明必须以a终止   分号。
  Msg 102,Level 15,State 1,Line 21
  ')'附近的语法不正确。

那我该怎么办?

1 个答案:

答案 0 :(得分: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

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