Система типов (XQuery)
Область применения: 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