Функции-конструкторы (XQuery)
Функции-конструкторы по указанным входным данным создают экземпляры любых встроенных атомарных типов XSD или пользовательских атомарных типов.
Синтаксис
TYP($atomicvalue as xdt:anyAtomicType?
) as TYP?
Аргументы
$strval
Строка, которая будет преобразована.TYP
Любой встроенный тип XSD.
Замечания
Конструкторы поддерживаются и базовыми, и производными атомарными типами XSD. Однако подтипы типа xs:duration, в число которых входят xdt:yearMonthDuration и xdt:dayTimeDuration, а также типы xs:QName, xs:NMTOKEN и xs:NOTATION, не поддерживаются. Пользовательские атомарные типы, доступные в ассоциированных коллекциях схем, также доступны, если они прямо или косвенно произведены от следующих типов.
Поддерживаемые базовые типы
Функции-конструкторы поддерживаются следующими базовыми типами:
xs:string
xs:boolean
xs:decimal
xs:float
xs:double
xs:duration
xs:dateTime
xs:time
xs:date
xs:gYearMonth
xs:gYear
xs:gMonthDay
xs:gDay
xs:gMonth
xs:hexBinary
xs:base64Binary
xs:anyURI
Поддерживаемые производные типы
Функции-конструкторы поддерживаются следующими производными типами:
xs:normalizedString
xs:token
xs:language
xs:Name
xs:NCName
xs:ID
xs:IDREF
xs:ENTITY
xs:integer
xs:nonPositiveInteger
xs:negativeInteger
xs:long
xs:int
xs:short
xs:byte
xs:nonNegativeInteger
xs:unsignedLong
xs:unsignedInt
xs:unsignedShort
xs:unsignedByte
xs:positiveInteger
Кроме того, SQL Server поддерживает свертывание констант при вызове функций-конструкторов:
Если аргумент является строковым литералом, выражение оценивается во время компиляции. Если значение не соответствует ограничениям типа, возвращается статическая ошибка.
Если аргумент является литералом другого типа, выражение оценивается во время компиляции. Если значение не соответствует ограничениям типа, возвращается пустая последовательность.
Примеры
В этом подразделе приведены примеры запросов XQuery к экземплярам XML, которые хранятся в различных столбцах типа xml в базе данных AdventureWorks. Обзор каждого из этих столбцов см. в разделе Представление типов XML-данных в базе данных AdventureWorks.
А. Использование функции dateTime() языка XQuery для получения описаний старой продукции
В данном примере образец XML-документа сначала назначается переменной типа xml. Этот документ включает три элемента <ProductDescription>, каждый из которых содержит дочерний элемент <DateCreated>.
После этого выполняется запрос переменной, получающей описания только тех продуктов, которые были произведены до указанной даты. Чтобы типизировать даты во время их сравнения, в запросе используется функция-конструктор xs:dateTime().
declare @x xml
set @x = '<root>
<ProductDescription ProductID="1" >
<DateCreated DateValue="2000-01-01T00:00:00Z" />
<Summary>Some Summary description</Summary>
</ProductDescription>
<ProductDescription ProductID="2" >
<DateCreated DateValue="2001-01-01T00:00:00Z" />
<Summary>Some Summary description</Summary>
</ProductDescription>
<ProductDescription ProductID="3" >
<DateCreated DateValue="2002-01-01T00:00:00Z" />
<Summary>Some Summary description</Summary>
</ProductDescription>
</root>'
select @x.query('
for $PD in /root/ProductDescription
where xs:dateTime(data( ($PD/DateCreated/@DateValue)[1] )) < xs:dateTime("2001-01-01T00:00:00Z")
return
element Product
{
( attribute ProductID { data($PD/@ProductID ) },
attribute DateCreated { data( ($PD/DateCreated/@DateValue)[1] ) } )
}
')
Отметим следующие данные из предыдущего запроса:
Чтобы получить элемент <ProductDescription>, отвечающего условию, указанному в предложении WHERE, используется цикл FOR ... WHERE.
Чтобы создать значения типа dateTime, которые можно было бы сравнить должным образом, применяется функция-конструктор dateTime().
После этого запрос создает итоговый XML-код. Так как при этом создается последовательность атрибутов, при формировании XML-кода используются запятые и скобки.
Результат:
<Product
ProductID="1"
DateCreated="2000-01-01T00:00:00Z"/>