2015-12-09 3 views
1

У меня есть столбец otar.Results в моей базе данных sql, содержащей данные xml. Вот пример данных XML:Фильтровать SQL-запросы по атрибутам 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 "

Я пытался

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

Но он не возвращает никаких записей.

Примечание: Я должен иметь возможность динамически строить запрос

Любая помощь будет очень признательна.

С наилучшими пожеланиями Джон

ответ

0

Использование @ в начале имени атрибута для ссылки на атрибуты в XPath, в противном случае это будет неправильно понято, как дочерний элемент с таким же именем:

/certInformationList/certItem[@layoutSeqOrSealDescrID="1" and @qxCertInformation="8;20021"] 
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; 
+0

Спасибо, мне не хватало @ перед макетомSeqOrSealDescrID и qxCertInformation –