3

私の会社の「連絡先」テーブルにフィールドがあります。そのテーブルには、XML タイプの列があります。列には、特定の連絡先に関するその他のデータが保持されます。例えば。

<contact>
<refno>123456</refno>
<special>a piece of custom data</special>
</contact>

以下のタグcontactは連絡先ごとに異なる可能性があるため、同じテーブル内のリレーショナル データ列と一緒にこれらのフラグメントをクエリする必要があります。

私は次のような構造を使用しました:

SELECT c.id AS ContactID,c.ContactName as ForeName,
c.xmlvaluesn.value('(contact/Ref)[1]', 'VARCHAR(40)') as ref,    
INNER JOIN ParticipantContactMap pcm ON c.id=pcm.contactid 
AND pcm.participantid=2140
WHERE xmlvaluesn.exist('/contact[Ref = "118985"]') = 1

この方法は正常に機能しますが、サーバーが応答するまでに時間がかかります。また、nodes() 関数を使用して XML ノードを解析し、exist() を使用して、探している値がノードに保持されているかどうかをテストしました。

XML列をクエリするより良い方法を知っている人はいますか??

4

5 に答える 5

3

1 回の書き込みと多数の読み取りを行っている場合は、書き込み時に解析ヒットを取得し、そのデータをよりクエリ可能な形式に変換します。最初の提案は、名前/値/連絡先 ID 列を使用して、それらを関連しているが別のテーブルに解析することです。

于 2008-09-09T17:52:44.540 に答える
1

私は、msdn xml のベスト プラクティスが xml blob 列の操作に役立つことを発見しました

于 2008-09-09T15:02:32.750 に答える
0

Xml用のXSDがある場合は、それをデータベースにインポートして、Xmlデータのインデックスを作成できます。

于 2008-09-13T07:12:53.890 に答える
0

@pauljette によって言及されたページに加えて、このページにはパフォーマンス最適化に関する優れたアドバイスがあります。

http://msdn.microsoft.com/en-us/library/ms345118.aspx

XML クエリのパフォーマンスを高速化するためにできることはたくさんありますが、適切にインデックス付けされたリレーショナル データほど優れたものにはなりません。1 つのドキュメントを選択し、そのドキュメント内だけでクエリを実行する場合は、かなりうまく処理できますが、クエリで何かを探すために一連の同様のドキュメントをスキャンする必要がある場合は、リレーショナル クエリ プランでのキー ルックアップのようなものです (つまり、遅い)。

于 2008-09-09T15:26:17.373 に答える
0

これを試して

SELECT * FROM conversionupdatelog WHERE convert(XML,colName).value('(/leads/lead/@LeadID=''xyz@airproducts.com'')[1]', 'varchar(max)')='true'

于 2014-01-30T10:24:31.103 に答える