过滤XML属性上的SQL查询

时间:2015-12-09 09:25:21

标签: sql xml

我的sql数据库中有一个包含xml数据的列otar.Results。 以下是xml数据的示例:

<certInformationList>
  <certItem layoutSeqOrSealDescrID="1" qxCertInformation="8;20021" />
  <certItem layoutSeqOrSealDescrID="2" qxCertInformation="" />
  <certItem layoutSeqOrSealDescrID="3" qxCertInformation="3308ASX1D1I1S1V4AAR5AE00910WA3WK1M5C1Q8P1W1" />
  <certItem layoutSeqOrSealDescrID="4" qxCertInformation="2014-04-29" />
  <certItem layoutSeqOrSealDescrID="5" qxCertInformation="13:07:43" />
  <certItem layoutSeqOrSealDescrID="6" qxCertInformation="" />
  <certItem layoutSeqOrSealDescrID="7" qxCertInformation="" />
  <certItem layoutSeqOrSealDescrID="8" qxCertInformation="" />
  <certItem layoutSeqOrSealDescrID="9" qxCertInformation="" />
  <certItem layoutSeqOrSealDescrID="10" qxCertInformation="9150077-263" />
  <certItem layoutSeqOrSealDescrID="11" qxCertInformation="260201" />
  <certItem layoutSeqOrSealDescrID="12" qxCertInformation="" />
  <certItem layoutSeqOrSealDescrID="13" qxCertInformation="" />
  <certItem layoutSeqOrSealDescrID="14" qxCertInformation="" />
  <certItem layoutSeqOrSealDescrID="15" qxCertInformation="" />
  <certItem layoutSeqOrSealDescrID="16" qxCertInformation="" />
  <certItem layoutSeqOrSealDescrID="17" qxCertInformation="" />
  <certItem layoutSeqOrSealDescrID="18" qxCertInformation="" />
</certInformationList>

我想过滤我的查询,以便我可以获取layoutSeqOrSealDescrID="1"qxCertInformation="8;20021&#34;

的记录

我已经尝试了

otar.Results.exist('/certInformationList/certItem[layoutSeqOrSealDescrID="1" and qxCertInformation="8;20021"]') = 1

但它没有返回任何记录。

注意:我必须能够动态构建查询

非常感谢任何帮助。

祝你好运 约翰

2 个答案:

答案 0 :(得分:0)

在属性名称的开头使用@来引用XPath中的属性,否则它将被误解为同名的子元素:

/certInformationList/certItem[@layoutSeqOrSealDescrID="1" and @qxCertInformation="8;20021"]

答案 1 :(得分:0)

有一个包含两个记录的表,一个是你的例子(shortend!),第二个是改变了“8; 20021”。只有第一个回到选择中:

DECLARE @otar TABLE(id INT, Results XML);
INSERT INTO @otar VALUES
 (1,'<certInformationList>
        <certItem layoutSeqOrSealDescrID="1" qxCertInformation="8;20021" />
     </certInformationList>')
,(2,'<certInformationList>
        <certItem layoutSeqOrSealDescrID="1" qxCertInformation="8;20022" />
     </certInformationList>');

SELECT *
FROM @otar AS o
WHERE o.Results.exist('//certItem[@layoutSeqOrSealDescrID="1" and @qxCertInformation="8;20021"]')=1;