1

SQL サーバー列に xml データ型として格納されている xml ノードの値を取得しようとしています。たとえば、私の xml 列のデータは次のとおりです。

<fields>
<field id="StudentName">John Smith</field>
<field id="StudentID">1310021003</field>
<field id="SchoolName">Little Kid Elementary School</field>
</fields>

StudentID を取得したい。以下のスクリプトを実行すると、null になります。

select MyColumnName.value('(/fields/field/@StudentID)[1]', 'varchar(20)') as StudentId from MyTable

[おまけの質問] - 可能であれば、studentid でテーブルをクエリしたいと思います。次に例を示します。select * from MyTable where MyColumnName.value('(/fields/field/@StudentID)[1]', 'varchar(20)') = '1310021003'

4

1 に答える 1

2

まず、これはテスト環境になります。

declare @MyTable table (MyColumnName xml)

insert into @MyTable 
select '<fields>
<field id="StudentName">John Smith</field>
<field id="StudentID">1310021003</field>
<field id="SchoolName">Little Kid Elementary School</field>
</fields>' union all

select '<fields>
<field id="StudentName">John Smith</field>
<field id="StudentID">2343343434</field>
<field id="SchoolName">Little Kid Elementary School</field>
</fields>'

xml からデータを取得するには、次のvalue()関数を使用します。

select
    MyColumnName.value('(fields/field[@id="StudentID"]/text())[1]', 'nvarchar(max)') as StudentID
from @MyTable

出力:

StudentID
-----------
1310021003
2343343434

xml データでフィルタリングするには、exist()関数を使用します

select
    *
from @MyTable
where MyColumnName.exist('fields/field[@id="StudentID" and text()=1310021003]') = 1

出力:

MyColumnName
-----------
<fields>
    <field id="StudentName">John Smith</field>
    <field id="StudentID">1310021003</field>
    <field id="SchoolName">Little Kid Elementary School</field>
</fields>
于 2013-11-06T06:23:32.387 に答える