2

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

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

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

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

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

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

4

3 に答える 3

7

FOR XML PATH スカラー値関数をネストしてみましたか? ネスト手法を使用すると、SQL を非常に管理しやすく読みやすい要素単位に分割できます。

免責事項:以下は、実際の例から適応されていますが、それ自体は文字通りテストされていません

一般視聴者向けの参照リンク

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

次の呼び出しを検討してください

DECLARE  @NestedInput_SpecificDogNameId int
SET @NestedInput_SpecificDogNameId = 99
SELECT [dbo].[udfGetLowestLevelNestedNode_SpecificDogName] 
(@NestedInput_SpecificDogNameId)

udfGetLowestLevelNestedNode_SpecificDogName が FOR XML PATH 句なしで書き込まれ、@NestedInput_SpecificDogName = 99 の場合、単一の行セット レコードが返されるとします。

@SpecificDogNameId 犬の名前
99 アストロ

しかし、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>
于 2008-09-29T14:21:17.107 に答える
1

sql:variable の代わりに sql:column を使用します。ここで詳細情報を見つけることができます: http://msdn.microsoft.com/en-us/library/ms191214.aspx

于 2010-03-15T14:36:33.317 に答える
1

具体的に何をしようとしているのか、もう少し詳しく教えていただけますか。テーブルのコンテンツに基づいて XML データを生成するだけですか、それともテーブルのデータを既存の xml 構造に追加するだけですか?

Jacob Sebastian によって書かれた SQLServer での XML に関する主題に関するすばらしい一連の記事があり、テーブル内のデータから XML を生成する基本から始まります。

于 2008-09-29T09:40:03.540 に答える