Метод exist() (тип данных xml)
Область применения: SQL Server
База данных SQL Azure Управляемый экземпляр SQL Azure
Возвращает значение типа bit, которое представляет одно из следующих состояний:
1, означающее True, если выражение на языке XQuery при запросе возвращает непустой результат, то есть возвращается как минимум один узел XML.
0, означающее False при возвращении пустого результата.
Значение NULL, если экземпляр типа xml, к которому был выполнен запрос, содержит значение NULL.
Синтаксис
exist (XQuery)
Аргументы
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)