1

私はスカラーxml変数を持っています:

DECLARED @XML xml =
'<rows>
    <row>
        <column1 attrib="" />
        <column2 attrib="" />
    </row>
    <!-- ... -->
</rows>';

各行のxmlがテーブルの新しいレコードに割り当てられるようにデータを分割したいと思います。

Id | ... | XML
1  |     | '<row><column1 attrib="" /><column2 attrib="" /></row>'
2  |     | etc.
3  |     | etc.

私はxqueryを完全に理解していないので、私が望むことを行う挿入ステートメントを書くのに苦労しています。

INSERT into MyTable( [XML])
SELECT @XML.query('row')

これで、何かが起こっていることがわかりましたが、意図したとおりに実行して複数の新しいレコードを挿入するのではなく、空の文字列を含む単一のレコードを列に挿入しているように見え[XML]ます。

何が得られないのですか?

明確化

を使用して、各行から内部テキスト、サブ要素、または属性を取得しようとはしていませんvalue(...)。要素全体をキャプチャして<row>、タイプの列に保存しようとしていますxml

私は実験しnodes(...)て思いついた:

INSERT into MyTable([XML])
SELECT C.query('*')
FROM @XML.nodes('rows/row') T(C)

これは私が望むものに近いですが、結果には外部<row>タグは含まれず、含まれる<column*>要素のみが含まれます。

4

2 に答える 2

1

.nodes(...)を使用してそれぞれを行として投影し、を使用し<row .../>て対象の属性を抽出する必要があります.value(...)。何かのようなもの:

insert into MyTable(XML)
select x.value('text()', 'nvarchar(max)') as XML
from @XML.nodes(N'/rows/row') t(x);

text()それぞれの内部テキストを選択します<row .../>。行から何を求めているかに応じて、適切な式(たとえば、node()または@attributeなど、XPathの例を参照)を使用する必要があります(この例では、空の要素がすべて含まれているため、まったく明確になりません...)。

于 2012-04-30T19:30:44.757 に答える
0

T-SQLスクリプト:

SET ANSI_WARNINGS ON;

DECLARE @x XML =
'<rows>
    <row Atr1="11" />
    <row Atr1="22" Atr2="B" />
    <row Atr1="33" Atr2="C" />
</rows>';

DECLARE @Table TABLE(Id INT NOT NULL, [XMLColumn] XML NOT NULL);

INSERT  @Table (Id, XMLColumn)
SELECT  ROW_NUMBER() OVER(ORDER BY @@SPID) AS Id,
        a.b.query('.') AS [XML]
FROM    @x.nodes('//rows/row') AS a(b);

SELECT  *
FROM    @Table t;

結果:

Id XMLColumn
-- --------------------------
1  <row Atr1="11" />
2  <row Atr1="22" Atr2="B" />
3  <row Atr1="33" Atr2="C" />
于 2012-04-30T20:05:27.390 に答える