Метод exist() (тип данных xml)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Возвращает значение типа bit, которое представляет одно из следующих состояний:

  • 1, означающее True, если выражение на языке XQuery при запросе возвращает непустой результат, то есть возвращается как минимум один узел XML.

  • 0, означающее False при возвращении пустого результата.

  • Значение NULL, если экземпляр типа xml, к которому был выполнен запрос, содержит значение NULL.

Синтаксис

exist (XQuery)   

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

XQuery
Выражение на языке XQuery, строковый литерал.

Замечания

Примечание.

Метод exist() возвращает 1 для выражения XQuery, которое возвращает непустой результат. Если указать функции true() или false() внутри метода exist(), то метод exist() возвратит 1, так как функции true() и false() возвращают логические значения True и False соответственно. То есть они возвращают не пустой результат. Поэтому функция exist() возвратит 1 (True), как показано в следующем примере:

DECLARE @x XML;  
SET @x='';  
SELECT @x.exist('true()');   

Примеры

В следующих примерах показано использование метода exist().

Пример: указание метода exist() по отношению к переменной типа xml

В следующем примере @x является переменной типа xml (нетипизированный xml), а @f является переменной целочисленного типа, которая хранит значение, возвращенное методом exist(). Метод exist() возвращает значение True (1), если значение даты, хранимое в экземпляре XML, равно 2002-01-01.

DECLARE @x XML;  
DECLARE @f BIT;  
SET @x = '<root Somedate = "2002-01-01Z"/>';  
SET @f = @x.exist('/root[(@Somedate cast as xs:date?) eq xs:date("2002-01-01Z")]');  
SELECT @f;  

В сравнении дат в методе exist() обратите внимание на следующее:

  • Код cast as xs:date? используется для приведения значения к типу xs:date с целью сравнения.

  • Значение атрибута @Somedate является нетипизированным. При сравнении это значение неявно приводится к типу правой части выражения сравнения, а именно — к типу xs:date.

  • Вместо выражения cast as xs:date() можно использовать функцию-конструктор xs:date(). Дополнительные сведения см. в статье Функции конструктора (XQuery).

Следующий пример отличается от предыдущего только наличием элемента <Somedate>.

DECLARE @x XML;  
DECLARE @f BIT;  
SET @x = '<Somedate>2002-01-01Z</Somedate>';  
SET @f = @x.exist('/Somedate[(text()[1] cast as xs:date ?) = xs:date("2002-01-01Z") ]')  
SELECT @f;  

Обратите внимание на следующие данные из предыдущего запроса:

  • Метод text() возвращает текстовый узел, содержащий нетипизированное значение 2002-01-01. (Тип XQuery — xdt:untypedAtomic.) Необходимо явно привести это типизированное значение от x к xsd:date, так как неявное приведение не поддерживается в этом случае.

Пример: применение метода exist() по отношению к типизированной переменной xml

В следующем примере иллюстрируется применение метода exist() к переменной типа xml. Это типизированная переменная XML, поскольку она указывает имя схемы коллекции пространства имен, ManuInstructionsSchemaCollection.

В этом примере переменной сначала присваивается документ с инструкциями по производству, а затем с помощью метода exist() проверяется, есть ли в этом документе элемент <Location>, у которого атрибут LocationID имеет значение 50.

Метод exist(), примененный к переменной @x, возвращает значение 1 (True), если документ с инструкциями по производству содержит элемент <Location> с атрибутом LocationID=50. В противном случае метод возвращает значение 0 (False).

DECLARE @x XML (Production.ManuInstructionsSchemaCollection);  
SELECT @x=Instructions  
FROM Production.ProductModel  
WHERE ProductModelID=67;  
--SELECT @x  
DECLARE @f INT;  
SET @f = @x.exist(' declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
    /AWMI:root/AWMI:Location[@LocationID=50]  
');  
SELECT @f;  

Пример: применение метода exist() по отношению к столбцу типа xml

В результате выполнения следующего запроса возвращаются идентификаторы моделей, описание каталогов для которых не включает спецификации, в элементе <Specifications>:

SELECT ProductModelID, CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
    <Product   
        ProductModelID= "{ sql:column("ProductModelID") }"   
        />  
') AS Result  
FROM Production.ProductModel  
WHERE CatalogDescription.exist('  
    declare namespace  pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     /pd:ProductDescription[not(pd:Specifications)]'  
    ) = 1;  

Обратите внимание на следующие данные из предыдущего запроса:

  • Предложение WHERE выбирает только те строки из таблицы ProductDescription, которые удовлетворяют условию, указанному для столбца типа xml CatalogDescription.

  • Метод exist() в предложении WHERE возвращает 1 (True), если XML не содержит ни одного элемента <Specifications>. Обратите внимание на использование функции not() (XQuery).

  • Функция sql:column() (XQuery) используется для импорта значения из столбца, тип которого отличается от XML.

  • Этот запрос возвращает пустой набор строк.

В этом запросе указаны методы query() и exist() типа xml, и оба эти метода объявляют одинаковые пространства имен в прологе запроса. В этом случае для объявления префикса и использования его в запросе можно использовать предложение WITH XMLNAMESPACES.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)  
SELECT ProductModelID, CatalogDescription.query('  
    <Product   
        ProductModelID= "{ sql:column("ProductModelID") }"   
        />  
') AS Result  
FROM Production.ProductModel  
WHERE CatalogDescription.exist('  
     /pd:ProductDescription[not(pd:Specifications)]'  
    ) = 1;  

См. также

Добавление пространств имен в запросы с WITH XMLNAMESPACES
Сравнение типизированного и нетипизированного XML
Создание экземпляров данных XML
Методы для типа данных XML
Язык обработки XML-данных (XML DML)