最後の更新:
OK、質問がより明確になったので、彼が解決策です-うまくいけば!!
DECLARE @errors xml
SET @errors = '<errors><error>Message 1</error></errors>'
DECLARE @newErrors XML
SELECT @newErrors = (SELECT text AS 'error'
FROM dbo.my_table
FOR XML PATH(''), ELEMENTS)
SELECT @errors, @newErrors
SET @errors.modify('insert sql:variable("@newErrors") as last into (/errors)[1]')
SELECT @errors
これは私に与えます
先頭の @errors
<errors><error>Message 1</error></errors>
「魔法の」SELECTの後の@newError:
<error>Message 2</error><error>Message 3</error>
UPDATE後の@エラー:
<errors>
<error>Message 1</error>
<error>Message 2</error>
<error>Message 3</error>
</errors>
それはあなたが探しているものですか?? :-)
(古い回答-OPが探していたものではありません.....)
SQL XQueryの関数を確認する必要があります。.nodes()
これは、XPath 式に基づいて、XML 変数を XML ノードのリストに分割します (これは、XML 内のノードの列挙がある可能性が高いポイントを参照します)。同じ構造)、「仮想」テーブルと列名を与えます。
その「Table.Column」要素に基づいて、その XML ノードから単一の値 (属性またはサブ要素のいずれか) を選択でき、これらを「アトミック」値 (INT、VARCHAR(x) など、必要なものは何でも) として取得できます。 . これらの値をテーブルに挿入できます。
INSERT dbo.YourTable(col1, col2, col3, ..., colN)
SELECT
Error.Column.value('@attr1[1]', 'varchar(20)'),
Error.Column.value('subitem[1]', 'int'),
.....
Error.Column.value('subitemN[1]', 'DateTime')
FROM
@xmldata.nodes('/error') AS Error(Column)
更新:では、反対のことをしたい - リレーショナル データを XML に変換する - それはさらに簡単です :-)
DECLARE @NewXmlContent XML
SELECT @NewXmlContent =
(SELECT
col1 as '@ID',
col2 as 'SomeElement',
.....
colN as 'LastElement'
FROM
dbo.YourTable
WHERE
....
FOR XML PATH('element'), ROOT('root')
)
UPDATE YourOtherTable
SET XmlField.modify('insert sql:variable("@NewXmlContent")
as last into (/XPath)[1]')
WHERE (some condition)
これにより、@NewXmlContent に次のようなものが表示されます。
<root>
<element ID="(value of col1)">
<SomeElement>(value of col2)</SomeElement>
.....
<LastElement>(value of colN)</LastElement>
</element>
</root>
呼び出しを伴う UPDATE ステートメントは、.modify()
そのコンテンツをデータベース内の既存の XML フィールドに実際に挿入します。これは、既存の XML 列に XML コンテンツを取得する唯一の方法です。挿入される XML フラグメント内の別の XML 列を直接参照する方法はありません。
新しい "FOR XML PATH" 構文は非常に強力で柔軟性があり、ほぼ何でも実行できます。
もちろん、それを XML 変数に簡単に格納することもできます。
マルク