更新:より完全な例を示します。
提供された最初の 2 つの解決策は、私が言おうとしていたことと一致していました。場所がわかりません。ドキュメント ツリー全体を表示できる必要があります。したがって、 /Books/ をコンテキストとして指定したこれらの行に沿ったソリューションは機能しません。
SELECT x.query('.') FROM @xml.nodes('/Books/*[not(@ID) or @ID = 5]') x1(x)
より良い例の元の質問:
SQL Server 2005 の XQuery 実装を使用して、XML ドキュメント内のすべてのノードをそれぞれ 1 回だけ選択し、元の構造を維持する必要がありますが、特定の属性が欠落している場合、またはその属性に特定の値 (パラメーターによって渡される) がある場合のみです。また、クエリは、定義済みの深さで選択するのではなく、XML ドキュメント全体 (descendant-or-self 軸) で機能する必要があります。
つまり、個々のノードが結果のドキュメントに表示されるのは、そのノードとその先祖のすべてが属性を欠いている場合、または単一の特定の値を持つ属性を持っている場合のみです。
例えば:
これが XML の場合:
DECLARE @Xml XML
SET @Xml =
N'
<Library>
<Novels>
<Novel category="1">Novel1</Novel>
<Novel category="2">Novel2</Novel>
<Novel>Novel3</Novel>
<Novel category="4">Novel4</Novel>
</Novels>
<Encyclopedias>
<Encyclopedia>
<Volume>A-F</Volume>
<Volume category="2">G-L</Volume>
<Volume category="3">M-S</Volume>
<Volume category="4">T-Z</Volume>
</Encyclopedia>
</Encyclopedias>
<Dictionaries category="1">
<Dictionary>Webster</Dictionary>
<Dictionary>Oxford</Dictionary>
</Dictionaries>
</Library>
'
カテゴリのパラメーターが 1 の場合、次のようになります。
<Library>
<Novels>
<Novel category="1">Novel1</Novel>
<Novel>Novel3</Novel>
</Novels>
<Encyclopedias>
<Encyclopedia>
<Volume>A-F</Volume>
</Encyclopedia>
</Encyclopedias>
<Dictionaries category="1">
<Dictionary>Webster</Dictionary>
<Dictionary>Oxford</Dictionary>
</Dictionaries>
</Library>
カテゴリのパラメーターが 2 の場合、次のようになります。
<Library>
<Novels>
<Novel category="2">Novel2</Novel>
<Novel>Novel3</Novel>
</Novels>
<Encyclopedias>
<Encyclopedia>
<Volume>A-F</Volume>
<Volume category="2">G-L</Volume>
</Encyclopedia>
</Encyclopedias>
</Library>
XSLT がこの仕事に完全に適していることは知っていますが、オプションではありません。これを完全に SQL Server 2005 で実現する必要があります。完全に T-SQL で実行できる限り、XQuery を使用しない実装でも問題ありません。