Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Область применения: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)