3

ストアド プロシージャ (SQL Server 2008) に XML 変数があり、そのサンプル値は

<parent_node>
   <category>Low</category>
   <category>Medium</category>
   <category>High</category>
</parent_node>

各カテゴリを取得し、個別のレコードとしてテーブルに挿入する必要があります。XMLで反復して個々のノード値を取得する方法は?

ストアド プロシージャを呼び出して、各カテゴリを入力パラメーターとして送信したい場合、どうすればよいでしょうか? ストアド プロシージャはレガシー プロシージャであり、一度に 1 つのカテゴリのみを受け入れます。この方法で呼び出し手順を実行しようとしています。

  1. xml 変数から単一のカテゴリを取得するループ。
  2. 現在のカテゴリでストアド プロシージャを呼び出します。
  3. 次のカテゴリに移動します。
  4. リストに値が含まれるまでループします。

どんな助けでも大歓迎です。

4

2 に答える 2

5

このようなもの?

DECLARE @XmlVariable XML = '<parent_node>
                              <category>Low</category>
                              <category>Medium</category>
                              <category>High</category>
                            </parent_node>'

INSERT INTO dbo.YourTargetTable(CategoryColumn)
  SELECT 
     XTbl.Cats.value('.', 'varchar(50)')
  FROM 
     @XmlVariable.nodes('/parent_node/category') AS XTbl(Cats)

更新:古いレガシーストアドプロシージャを使用する必要があり、それを変更できない場合(これが私の好ましい方法です)、行ごとのアゴナイジング(RBAR)ループを自分で行う必要があります。テーブル変数:

-- declare temporary work table
DECLARE @RbarTable TABLE (CategoryName VARCHAR(50))

-- insert values into temporary work table
INSERT INTO @RbarTable(CategoryName)
  SELECT 
     XTbl.Cats.value('.', 'varchar(50)')
  FROM 
     @XmlVariable.nodes('/parent_node/category') AS XTbl(Cats)

-- declare a single category
DECLARE @CategoryNameToBeInserted VARCHAR(50)

-- get the first category
SELECT TOP 1 @CategoryNameToBeInserted = CategoryName FROM @RbarTable

-- as long as we have data
WHILE @CategoryNameToBeInserted IS NOT NULL
BEGIN
    -- execute your stored procedure here.....    
    EXEC sp_executesql N'dbo.YourStoredProcedure @CategoryName', 
                       N'@CategoryName VARCHAR(50)', 
                       @CategoryName = @CategoryNameToBeInserted

    -- delete the category we just inserted from the temporary work table
    DELETE FROM @RbarTable WHERE CategoryName = @CategoryNameToBeInserted

    -- see if we still have more categories to insert    
    SET @CategoryNameToBeInserted = NULL
    SELECT TOP 1 @CategoryNameToBeInserted = CategoryName FROM @RbarTable ORDER BY CategoryName
END
于 2013-05-11T16:23:49.943 に答える
0

SQL Server の XML では、常に複数の方法があります。XML ドキュメントのサイズとクエリの回数に応じて、sp_xml_preparedocumentドキュメントを解析し、それを参照するためのハンドルを提供してから、何度でもクエリを実行できる方法を使用することをお勧めします。あなたはしたい。その方法は次のとおりです。

declare @xml xml = '
<parent_node>
   <category>Low</category>
   <category>Medium</category>
   <category>High</category>
</parent_node>'
declare @xml_handle int

exec sp_xml_preparedocument @xml_handle output, @xml

select value from openxml(@xml_handle, '/parent_node/category', 2) with (value varchar(100) 'text()') x

exec sp_xml_removedocument @xml_handle
于 2013-05-11T16:28:52.457 に答える