1

単一の属性を使用してクエリを実行する例をいくつか見ましたが、2 つの属性を使用する方法に困惑しています。

<componentcache>
  <component Name="CALC_TODAYDATELONG" value="MONDAY, MAY 06, 2013" />
  <component Name="CALC_OFFICENAME" value="DEFAULT OFFICE" />
  <component Name="STAFFINFO_FULLNAME" value="LEE LEE, JR" />
  <component Name="PATINFO_FULLNAME" value="JAYNE H DOE" />
  <component Name="PATINFO_BIRTHDATE" value="11/07/1901" />
  <component Name="PATINFO_PATIENTNO" value="AG000003" />  
  <component Name="ENCOUNT_DXDESC1" value="ABC" />
  <component Name="ENCOUNT_DXDESC2" value="DEF" />
  <component Name="ENCOUNT_DXDESC3" value="HIJK" />
</componentcache>

SELECT DocumentStoreID, DocTemplateID, PersonID, Document from DocumentStore
WHERE DataCache.value('/componentcache/component...

「ENCOUNT_DXDESC%」のような名前で値が「DEF」の行を選択したい

4

2 に答える 2

2

Try something like this using a CTE (Common Table Expression):

;WITH XmlDataValues AS
(
    SELECT 
        DocumentStoreID,
        CompName = XComp.value('@Name', 'varchar(50)'),
        CompValue = XComp.value('@value', 'varchar(50)')
    from 
        DocumentStore
    CROSS APPLY
        DataCache.nodes('/componentcache/component') XTbl(XComp)  
)   
SELECT * 
FROM XmlDataValues
WHERE CompName LIKE 'ENCOUNT%'
AND CompValue = 'DEF'

The CTE basically takes every row in DocumentStore and gets a list of all <component> XML nodes (as XML) and extracts Name and value attributes from those XML nodes. The CTE then surfaces this information like a relational table - with column names CompName and CompValue. You can easily select from the CTE and use normal T-SQL statements and conditions for that

于 2013-07-24T04:52:36.517 に答える
1

XQuery を使用した方法を次に示します。

SELECT DocumentStoreID, DocTemplateID, PersonID, Document from DocumentStore
WHERE DataCache.exist('/componentcache/component[contains(@Name, "ENCOUNT_DXDESC")][@value="DEF"]')=1

これにより、「ENCOUNT_DXDESC」を含む名前属性と「DEF」の値属性を持つノードを持つ XML ドキュメントを含むテーブル内のすべての行が返されます。

于 2013-07-24T05:05:56.967 に答える