質問

テーブルのデータに基づいてストアドプロシージャでXMLを生成したい。

次の挿入により、多くのノードを追加できますが、ハードコーディングするか、変数(sql:variable)を使用する必要があります:

SET @MyXml.modify('
      insert
         <myNode>
            {sql:variable("@MyVariable")}
         </myNode>
      into (/root[1]) ') 

したがって、テーブル内の各レコードをループし、必要な値を変数に入れて、上記のステートメントを実行できます。

しかし、selectステートメントと組み合わせてループを回避することでこれを行う方法はありますか?

編集以前は SELECT FOR XML を使用して同様のことを行いましたが、複数のテーブルのデータの階層を操作するときは常に読みにくいと感じています。生成されたXMLがより明示的で制御しやすい modify を使用する何かがあることを望んでいました。

役に立ちましたか?

解決

XMLパススカラー値関数のネストを試みましたか? ネスト手法を使用すると、SQLを非常に管理しやすい/読みやすい要素に分割できます

免責事項:次の例は、実際の例から変更されていますが、文字通りテストされていません

一般ユーザー向けの参照リンク

最も単純で最下位のネストされたノードの例

次の呼び出しを検討

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top