web-dev-qa-db-ja.com

SQL ServerでCTE "WITH"と "WITH XMLNAMESPACES ...."を組み合わせる

誰かがSQL ServerのT-SQLでWITH XMLNAMESPACES宣言も含む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句、または変更追跡コンテキスト句の場合、前のステートメントはセミコロンで終了する必要があります。

そこで、2番目の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

そしてこれを得た:

メッセージ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

そしてこれを得た:

メッセージ156、レベル15、状態1、行4
キーワード「WITH」付近の構文が正しくありません。
メッセージ319、レベル15、状態1、行4
キーワード「with」付近の構文が正しくありません。このステートメントが共通テーブル式、xmlnamespaces句、または変更追跡コンテキスト句の場合、前のステートメントはセミコロンで終了する必要があります。
メッセージ102、レベル15、状態1、行21
「)」付近の構文が正しくありません。

一体どうやってこれを行うのですか?

32
marc_s

2番目の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を指定する必要があるのは1回だけで、他のすべてのWITHブロックはキーワードの代わりにカンマを使用するだけです。

48
Greg Beech