我看过一些使用单个属性查询的示例,但对如何使用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'的行
答案 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节点中提取Name
和value
属性。然后,CTE将此信息显示为关系表 - 列名为CompName
和CompValue
。您可以轻松地从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”