Tsql теория > Контекст выражения и вычисление запросов (XQuery)
01.02.2017 10:46:36
Наиболее часто встречающиеся слова в статье:
[контекста] [запроса] [статического] [выражения] [пространств] [поддерживается] [анализа] [declare] [XMLNAMESPACES] [//schemas]
Статья:
Применимо к:
-
Статический контекст — это фаза компиляции запроса. Иногда ошибки могут возникать в процессе такого статического анализа запроса, основанного на доступных данных. -
Динамический контекст — это этап выполнения запроса. Даже если в запросе нет статических ошибок, таких как ошибки компиляции, он может вернуть ошибки во время исполнения.
-
Пробел границы Политика устанавливается на чередование. Таким образом, пробел границы не сохраняется любой элемент и атрибута конструкторы в запросе. Например: 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), связывающий его с пространством имен (http://someURI). Однако пролог запроса отменяет связывание в предложении WHERE. WITH XMLNAMESPACES (''http://someURI'' AS pd) SELECT ProductModelID, CatalogDescription.query('' <Product ProductModelID= "{ sql:column("ProductModelID") }" /> '') AS Result FROM Production.ProductModel WHERE CatalogDescription.exist('' declare namespace pd="http://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="http://schemas.microsoft.com/sqlserver/2004/sqltypes"> <import namespace="http://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)'')
В следующем примере функция приведения для int встроенного типа XML, указанный в выражении. 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="http://schemas.microsoft.com/sqlserver/2004/sqltypes"> <import namespace="http://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: нетипизированный и атрибуты имеют xdt: untypedAtomic типа. -
Поддерживается только режим упорядоченной сортировки. -
Поддерживается только политика чередующегося пробела XML. -
Основная функциональность URI не поддерживается. -
fn:doc() не поддерживается. -
fn:Collection() не поддерживается. -
Детектор запросов XQuery со статической типизацией не предоставляется. -
Параметры сортировки, связанные с xml используется тип данных. Всегда используются параметры сортировки по кодовым точкам Юникода.
-
Фокус выражения, такой как элемент контекста, положение контекста и размер контекста, инициализируется следующим образом. Обратите внимание, что эти значения могут быть переопределены метода nodes(). -
Xml тип данных устанавливает элемент контекста и обрабатываемый узел документа узел. -
Положение контекста — это положение элемента контекста, который относится к обрабатываемому узлу изначально устанавливается в 1. -
Размер контекста — это количество элементов в обрабатываемой последовательности изначально устанавливается в 1, поскольку всегда существует один узел документа.
-
Ограничения реализации
-
Текущую дату и время функции контекста fn:current-Дата, fn:current-время, и fn:current-dateTime, не поддерживаются. -
Неявные временные зоны фиксируется на UTC +&0; и не может быть изменено.
-
Fn:doc() функция не поддерживается. Все запросы выполняются для xml переменных и столбцов типа. -
Fn:collection() функция не поддерживается.