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...

我想选择 Name like "ENCOUNT_DXDESC%" and value = 'DEF' 的行

4

2 回答 2

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 语句和条件

于 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

这将返回表中包含 XML 文档的所有行,该文档的节点具有包含“ENCOUNT_DXDESC”的 Name 属性和“DEF”的 value 属性

于 2013-07-24T05:05:56.967 回答