Контекст выражения и вычисление запросов (XQuery)
Область применения: SQL Server
Контекст выражения представляет собой данные, используемые для анализа и оценки. Ниже приводятся две фазы оценки XQuery:
Статический контекст — это этап компиляции запросов. Иногда ошибки могут возникать в процессе такого статического анализа запроса, основанного на доступных данных.
Динамический контекст — это этап выполнения запроса. Даже если в запросе нет статических ошибок, таких как ошибки компиляции, он может вернуть ошибки во время исполнения.
Статический контекст
Инициализация статического контекста относится к процессу объединения данных для статического анализа выражения. В рамках инициализации статического контекста выполняются следующие операции:
Политика пробелов границы имеет значение "Полоса". Поэтому пробел границы не сохраняется конструкторами элементов и атрибутов в запросе. Например:
declare @x xml set @x='' select @x.query('<a> {"Hello"} </a>, <b> {"Hello2"} </b>')
Этот запрос возвращает следующий результат, поскольку граничные пробелы удаляются во время анализа выражения XQuery:
<a>Hello</a><b>Hello2</b>
Инициализируются связывания префикса с пространством имен для:
Набор стандартных пространств имен.
Любых пространств имен, определенных при помощи WITH XMLNAMESPACES. Дополнительные сведения см. в разделе "Добавление пространств имен" в запросы с помощью WITH XMLNAMESPACES).
Любых пространств имен, определенных в прологе запроса. Обратите внимание на то, что объявления пространств имен в прологе могут отменять объявления пространств имен в WITH XMLNAMESPACES. Например, в следующем запросе WITH XMLNAMESPACES объявляет префикс (pd), который привязывает его к пространству имен (
https://someURI
). Однако пролог запроса отменяет связывание в предложении WHERE.WITH XMLNAMESPACES ('https://someURI' AS pd) SELECT ProductModelID, CatalogDescription.query(' <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[(pd:Specifications)]' ) = 1
Все такие связывания пространств имен разрешаются в процессе инициализации статического контекста.
При запросе типизированного xml-столбца или переменной компоненты коллекции схем XML, связанные с столбцом или переменной, импортируются в статический контекст. Дополнительные сведения см. в статье Сравнение типизированного и нетипизированного XML.
Функция приведения также становится доступной в статическом контексте для каждого атомарного типа в импортированных схемах. Это продемонстрировано в следующем примере. В этом примере запрос указывается для типизированной xml-переменной . Коллекция XML-схем, связанная с данной переменной, определяет атомный тип myType. Соответствующая этому типу функция приведения, myType(), доступна во время статического анализа. Выражение запроса (
ns:myType(0)
) возвращает значение myType.-- DROP XML SCHEMA COLLECTION SC -- go CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="myNS" xmlns:ns="myNS" xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes"> <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/> <simpleType name="myType"> <restriction base="int"> <enumeration value="0" /> <enumeration value="1"/> </restriction> </simpleType> <element name="root" type="ns:myType"/> </schema>' go DECLARE @var XML(SC) SET @var = '<root xmlns="myNS">0</root>' -- specify myType() casting function in the query SELECT @var.query('declare namespace ns="myNS"; ns:myType(0)')
В следующем примере функция приведения для встроенного xml-типа int указывается в выражении.
declare @x xml set @x = '' select @x.query('xs:int(5)') go
После инициализации статического контекста анализируется (компилируется) выражение запроса. Статический анализ включает следующее:
Анализ запроса.
Разрешение функции и имен типа, указанного в выражении.
Статическую типизацию запроса. Это гарантирует безопасность типа запроса. Например, следующий запрос возвращает статическую ошибку, так как + оператор требует числовых аргументов типа примитива:
declare @x xml set @x='' SELECT @x.query('"x" + 4')
В следующем примере оператор value() требует одноэлементного. Как указано в схеме XML, может быть несколько <элементов Elem> . Статический анализ выражения определяет, что это небезопасный тип, и возвращает статическую ошибку. Чтобы устранить ошибку, выражение должно быть переписано таким образом, чтобы явно указать одноэлементный запрос (
data(/x:Elem)[1]
).DROP XML SCHEMA COLLECTION SC go CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="myNS" xmlns:ns="myNS" xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes"> <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/> <element name="Elem" type="string"/> </schema>' go declare @x xml (SC) set @x='<Elem xmlns="myNS">test</Elem><Elem xmlns="myNS">test2</Elem>' SELECT @x.value('declare namespace x="myNS"; data(/x:Elem)[1]','varchar(20)')
Дополнительные сведения см. в разделе "XQuery" и "Статический ввод".
Ограничения реализации
Далее приводятся ограничения, связанные со статическим контекстом:
Режим совместимости XPath не поддерживается.
Для структуры XML доступен только режим структуры чередования. Этот параметр принимается по умолчанию. Таким образом, тип созданного узла элемента имеет тип xdt:untyped , а атрибуты имеют тип xdt:untypedAtomic .
Поддерживается только режим упорядоченной сортировки.
Поддерживается только политика чередующегося пробела XML.
Основная функциональность URI не поддерживается.
fn:doc() не поддерживается.
fn:collection() не поддерживается.
Детектор запросов XQuery со статической типизацией не предоставляется.
Используется параметры сортировки, связанные с типом данных XML . Всегда используются параметры сортировки по кодовым точкам Юникода.
Динамический контекст
Динамический контекст связан с данными, которые должны быть доступны во время выполнения выражения. Помимо статического контекста происходит инициализация следующих данных как части динамического контекста:
Фокус выражения, такой как элемент контекста, положение контекста и размер контекста, инициализируется следующим образом. Обратите внимание, что все эти значения можно переопределить методом nodes().
Тип данных XML задает элемент контекста, обрабатываемый узел, на узел документа.
Положение контекста — это положение элемента контекста, который относится к обрабатываемому узлу изначально устанавливается в 1.
Размер контекста — это количество элементов в обрабатываемой последовательности изначально устанавливается в 1, поскольку всегда существует один узел документа.
Ограничения реализации
Далее приводятся ограничения, связанные с динамическим контекстом:
Функции контекста текущей даты и времени, fn:current-date, fn:current-time и fn:current-dateTime, не поддерживаются.
Неявный часовой пояс исправлен в формате UTC+0 и не может быть изменен.
Функция fn:doc() не поддерживается. Все запросы выполняются для столбцов или переменных типа XML .
Функция fn:collection() не поддерживается.
См. также
Основы XQuery
Сравнение типизированного и нетипизированного XML
Коллекции XML-схем (SQL Server)