Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Область применения:SQL Server
XQuery является строго типизированным языком для типов схемы и слабо типизированным языком для нетипизированных данных. Ниже приведены стандартные типы данных языка XQuery:
Встроенные типы XML-схемы в http://www.w3.org/2001/XMLSchema пространстве имен.
Типы, определенные в http://www.w3.org/2004/07/xpath-datatypes пространстве имен.
В этом разделе также описано следующее:
Сравнение типизированных и строковых значений узла.
Функция данных (XQuery) и строковая функция (XQuery).
Сопоставление типов последовательности, возвращаемой выражением.
Встроенные типы XML-схемы
Встроенные типы XML-схемы обозначаются в пространстве имен стандартным префиксом xs. Некоторые из этих типов включают xs:integer и xs:string. Поддерживаются все встроенные типы данных. Эти типы могут быть использованы при создании коллекции XML-схем.
При обращении к типизированному XML статические и динамические типы узлов определяются коллекцией XML-схем, связанной со столбцом, к которому происходит обращение. Дополнительные сведения о статических и динамических типах см. в разделе "Контекст выражений" и "Оценка запросов" (XQuery). Например, следующий запрос указывается для типизированного xml-столбца (Instructions). В выражении instance of используется для проверки того, что типизированное значение возвращенного атрибута LotSize имеет тип данных xs:decimal.
SELECT Instructions.query('
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
data(/AWMI:root[1]/AWMI:Location[@LocationID=10][1]/@LotSize)[1] instance of xs:decimal
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
Эти типизированные данные предоставляются коллекцией XML-схем, связанной с указанным столбцом.
Типы, определенные в пространстве имен типов данных XPath
Типы, определенные в http://www.w3.org/2004/07/xpath-datatypes пространстве имен, имеют предопределенный префикс xdt. Эти типы обладают следующими свойствами:
Они не могут использоваться при создании коллекции XML-схем. Эти типы используются в системе типов XQuery и используются для XQuery и статического ввода. Можно привести к атомарным типам, например xdt:untypedAtomic, в пространстве имен xdt .
При запросе нетипизированного XML статический и динамический тип узлов элементов xdt :untypedd, а тип значений атрибутов — xdt:untypedAtomic. Результат метода query() создает нетипизированный XML. Это означает, что XML-узлы возвращаются как xdt:untyped и xdt:untypedAtomic соответственно.
Типы xdt:dayTimeDuration и xdt:yearMonthDuration не поддерживаются.
В следующем примере запрос задается на нетипизированной переменной XML. Выражение data(/a[1]) возвращает последовательность атомарных значений. Функция data() возвращает типизированное значение элемента <a>. Так как запрашиваемые XML не типизированы, возвращенное значение имеет тип xdt:untypedAtomic. Следовательно, выражение instance of возвращает значение True.
DECLARE @x xml
SET @x='<a>20</a>'
SELECT @x.query( 'data(/a[1]) instance of xdt:untypedAtomic' )
Вместо извлечения типизированного значения выражение (/a[1]) в следующем примере возвращает последовательность, состоящую из одного элемента <a>. Выражение instance of использует проверку элементов для контроля того, что возвращаемое выражением значение является элементом узла типа xdt:untyped type.
DECLARE @x xml
SET @x='<a>20</a>'
-- Is this an element node whose name is "a" and type is xdt:untyped.
SELECT @x.query( '/a[1] instance of element(a, xdt:untyped?)')
-- Is this an element node of type xdt:untyped.
SELECT @x.query( '/a[1] instance of element(*, xdt:untyped?)')
-- Is this an element node?
SELECT @x.query( '/a[1] instance of element()')
Примечание.
Если при обращении к типизированным XML-экземплярам в выражении запроса содержится родительская ось, сведения о статических типах результирующих узлов становятся недоступными. Однако динамические типы все равно остаются связанными с узлами.
Сравнение типизированных и строковых значений
Каждый узел содержит типизированное и строковое значение. Для типизированных XML-данных тип значения определяется коллекцией XML-схем, связанной со столбцом или переменной, к которым происходит обращение. Для нетипизированных XML-данных тип типизированного значения — xdt:untypedAtomic.
Функцию data() или string() можно использовать для получения значения узла:
Функция данных (XQuery) возвращает типизированное значение узла.
Строковая функция (XQuery) возвращает строковое значение узла.
В следующей коллекции <root> xml-схем определяется элемент целочисленного типа:
CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="root" type="integer"/>
</schema>'
GO
В следующем примере выражение вначале получает типизированное значение /root[1], а затем добавляет к нему 3.
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('data(/root[1]) + 3')
В следующем примере выражение завершается ошибкой, так как функция string(/root[1]) возвращает значение строкового типа. Затем указанное значение передается арифметическому оператору, который может работать только с числовыми операндами.
-- Fails because the argument is string type (must be numeric primitive type).
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('string(/root[1]) + 3')
В следующем примере производится вычисление общей суммы атрибутов LaborHours. Функция data() извлекает типизированные значения атрибутов LaborHours из всех <Location> элементов модели продукта. Согласно схеме XML, связанной с столбцом Instruction , LaborHours имеет тип xs:decimal .
SELECT Instructions.query('
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
sum(data(//AWMI:Location/@LaborHours))
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
Этот запрос возвращает значение 12,75.
Примечание.
Явное использование функции data() в этом примере предназначено только для иллюстрации. Если он не указан, функция sum() неявно применяет функцию data() для извлечения типизированных значений узлов.
См. также
Шаблоны и разрешения приложения SQL Server Profiler
Основы XQuery