在xml列中使用两个属性进行查询

时间:2013-07-24 04:28:40

标签: sql sql-server sql-server-2008-r2

我看过一些使用单个属性查询的示例,但对如何使用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%”和value ='DEF'的行

2 个答案:

答案 0 :(得分:2)

使用CTE(公用表格式)尝试这样的事情:

;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'

CTE基本上占用DocumentStore中的每一行并获取所有<component> XML节点的列表(作为XML),并从这些XML节点中提取Namevalue属性。然后,CTE将此信息显示为关系表 - 列名为CompNameCompValue。您可以轻松地从CTE中进行选择,并使用正常的T-SQL语句和条件

答案 1 :(得分:1)

这是使用XQuery的方法:

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

这将返回表中包含XML文档的所有行,其中一个节点的Name属性包含“ENCOUNT_DXDESC”,值属性为“DEF”