2

SQLServerデータベースに2つの列を持つテーブルtblUserDataがあります。

tblUSerData(ID BIGINT, UserData XML)

XML構造は次のようになります。

<user>
   <name>
      Akshay
   </name>
   <age>
      23
   </age>
</user>

テーブルを読み取り、20歳以上のユーザーのレコードを返すようなストアドプロシージャを作成したいと思います。効率的な方法でデータのテーブルを解析する方法がわかりません。前もって感謝します。

4

3 に答える 3

6

クエリは、exist()メソッド(xmlデータ型)を使用して記述できます。

select ID
from tblUserData
where UserData.exist('/user[age > 20]') = 1

SQL Server 2012 SP1からは、選択的XMLインデックス(SXI)を使用でき、上記のクエリをサポートするインデックスは次のようになります。

create selective xml index sxi_UserData on tblUserData(UserData)
for (
    u = '/user' as xquery 'node()' singleton,
    a = '/user/age' as xquery 'xs:double' singleton
    )

選択的XMLインデックスを使用するには、sp_db_selective_xml_index(Transact-SQL)を使用して有効にする必要があります。

詳細については、BobBeaucheminによる多数のブログ投稿をご覧ください。

于 2013-03-06T14:00:36.417 に答える
2

tblUserDataの各行に含まれるユーザーノードは1つだけであり、そのユーザーの1つの年齢ノードを使用できると仮定します。

WHERE   UserData.value('user[1]/age[1]', 'int') > 20

SQLフィドルの例

于 2013-03-06T11:47:46.853 に答える
0

そこで、テーブルtblUserDataを作成し、年齢が20歳を超えるユーザーを抽出するクエリを作成しました。

提供されているxml構造を使用しました

<user>
  <name>
    Akshay
 </name>
 <age>
    23
 </age>
</user>

テーブルtblUserData(ID BIGINT、

UserData xml)

insert into tblUserData values (1, '<user>   <name>      Akshay   </name>   <age>         23   </age> </user>')

insert into tblUserData values (2, '<user>   <name>      Tom   </name>   <age>      26   </age> </user>')

以下は、20歳以上のユーザーを抽出するクエリです。

 select node.value('name[1]', 'varchar(255)') as userName, node.value('age[1]','int')      as    age
 from dbo.tblUserData tblu
 CROSS APPLY UserData.nodes('/user') nodes(node)

 where node.value('age[1]', 'int') > 20
于 2013-03-06T12:08:47.703 に答える