SQL Serverでは、テーブルから複数のノードをXMLに挿入できますか?
-
02-07-2019 - |
質問
テーブルのデータに基づいてストアドプロシージャでXMLを生成したい。
次の挿入により、多くのノードを追加できますが、ハードコーディングするか、変数(sql:variable)を使用する必要があります:
SET @MyXml.modify('
insert
<myNode>
{sql:variable("@MyVariable")}
</myNode>
into (/root[1]) ')
したがって、テーブル内の各レコードをループし、必要な値を変数に入れて、上記のステートメントを実行できます。
しかし、selectステートメントと組み合わせてループを回避することでこれを行う方法はありますか?
編集以前は SELECT FOR XML
を使用して同様のことを行いましたが、複数のテーブルのデータの階層を操作するときは常に読みにくいと感じています。生成されたXMLがより明示的で制御しやすい modify
を使用する何かがあることを望んでいました。
解決
XMLパススカラー値関数のネストを試みましたか? ネスト手法を使用すると、SQLを非常に管理しやすい/読みやすい要素に分割できます
免責事項:次の例は、実際の例から変更されていますが、文字通りテストされていません
一般ユーザー向けの参照リンク
- http://msdn2.microsoft.com/en -us / library / ms178107(SQL.90).aspx
- http://msdn2.microsoft.com/en -us / library / ms189885(SQL.90).aspx
最も単純で最下位のネストされたノードの例
次の呼び出しを検討
DECLARE @NestedInput_SpecificDogNameId int
SET @NestedInput_SpecificDogNameId = 99
SELECT [dbo].[udfGetLowestLevelNestedNode_SpecificDogName]
(@NestedInput_SpecificDogNameId)
udfGetLowestLevelNestedNode_SpecificDogNameがFOR XML PATH句なしで記述されていたとします。@ NestedInput_SpecificDogName = 99の場合、単一の行セットレコードを返します。
@SpecificDogNameId DogName 99 Astro
ただし、FOR XML PATH句を使用すると、
CREATE FUNCTION dbo.udfGetLowestLevelNestedNode_SpecificDogName
(
@NestedInput_SpecificDogNameId
)
RETURNS XML
AS
BEGIN
-- Declare the return variable here
DECLARE @ResultVar XML
-- Add the T-SQL statements to compute the return value here
SET @ResultVar =
(
SELECT
@SpecificDogNameId as "@SpecificDogNameId",
t.DogName
FROM tblDogs t
FOR XML PATH('Dog')
)
-- Return the result of the function
RETURN @ResultVar
END
ユーザー定義関数は次のXMLを生成します(@記号はSpecificDogNameIdフィールドを属性として返します)
<Dog SpecificDogNameId=99>Astro</Dog>
XMLタイプのユーザー定義関数のネスト
上記のudfGetLowestLevelNestedNode_SpecificDogNameなどのユーザー定義関数をネストして、複雑なXMLを生成する強力なメソッドを提供できます。
たとえば、関数
CREATE FUNCTION [dbo].[udfGetDogCollectionNode]()
RETURNS XML
AS
BEGIN
-- Declare the return variable here
DECLARE @ResultVar XML
-- Add the T-SQL statements to compute the return value here
SET @ResultVar =
(
SELECT
[dbo].[udfGetLowestLevelNestedNode_SpecificDogName]
(t.SpecificDogNameId)
FROM tblDogs t
FOR XML PATH('DogCollection') ELEMENTS
)
-- Return the result of the function
RETURN @ResultVar
END
として呼び出された場合
SELECT [dbo].[udfGetDogCollectionNode]()
複雑なXMLノードを生成する可能性があります(適切な基礎データが与えられる)
<DogCollection>
<Dog SpecificDogNameId="88">Dino</Dog>
<Dog SpecificDogNameId="99">Astro</Dog>
</DogCollection>
ここから、ネストされたツリーで上に向かって作業を続け、必要に応じて複雑なXML構造を構築できます
CREATE FUNCTION [dbo].[udfGetAnimalCollectionNode]()
RETURNS XML
AS
BEGIN
DECLARE @ResultVar XML
SET @ResultVar =
(
SELECT
dbo.udfGetDogCollectionNode(),
dbo.udfGetCatCollectionNode()
FOR XML PATH('AnimalCollection'), ELEMENTS XSINIL
)
RETURN @ResultVar
END
として呼び出された場合
SELECT [dbo].[udfGetAnimalCollectionNode]()
udfは、より複雑なXMLノードを生成する場合があります(適切な基礎データが与えられた場合)
<AnimalCollection>
<DogCollection>
<Dog SpecificDogNameId="88">Dino</Dog>
<Dog SpecificDogNameId="99">Astro</Dog>
</DogCollection>
<CatCollection>
<Cat SpecificCatNameId="11">Sylvester</Cat>
<Cat SpecificCatNameId="22">Tom</Cat>
<Cat SpecificCatNameId="33">Felix</Cat>
</CatCollection>
</AnimalCollection>
他のヒント
あなたがやろうとしていることを正確に教えてください。 テーブルの内容に基づいてXMLデータを生成するだけですか または、テーブルのデータを既存のxml構造に追加しますか?
XMLの主題に関するすばらしいシリーズがあります。 Jacob Sebastianによって作成されたSQLServerは、データからXMLを生成する基本で始まります。テーブル
sql:variableの代わりにsql:columnを使用します。詳細情報については、 http://msdn.microsoft.com/enをご覧ください。 -us / library / ms191214.aspx