三、 XQuery Prolog
XQuery 由一个 prolog 和一个主体组成,prolog 是一系列的声明和定义,用于指定查询所需的环境。SQL Server 中 prolog 包含命名空间声明,主体即我们常用的 XQuery 查询语句。
在此总结一下命名空间的声明方式:
(1) 在 XQuery 之外使用 With XMLNamespaces('http://xxx' as XX)
(2) 在 XQuery 之内使用 declare namespace xx="http://xxx"; 注意结尾的分号不能少。
(3) 默认命名空间声明:
With XMLNamespaces(default 'http://xxx')
declare defalut element namespace http://xxx;
四、 XQuery 中的类型转换规则
本节列出了 SQL Server XQuery 中可用的内置基元类型和内置派生类型以及可互相转换的类型列表,使用时可查阅 MSDN(标题名称即“XQuery 中的类型转换规则”)。
(1) 关于隐式转换
l 只允许数值类型和 untypedAtomic 类型进行隐式转换。
l 因为不允许字符类型进行隐式转换,所以如果一个函数需要两个字符串参数,若传入一个 string 类型和一个 token 类型,将发生错误。
l 不允许数值类型隐式转换为字符串。
(2) 转换值时需要注意
l 将 xs:float 或 xs:double 类型或者它们任意子类型的值转换为字符串类型或 untypedAtomic 类型的值时,该值将以科学记数法表示。只有当值的绝对值小于 1.0E-6,或者大于或等于 1.0E6 时才会这样表示。这表示 0 按科学记数法的形式序列化为 0.0E0。
l 如果将二进制类型(如 xs:base64Binary 或 xs:hexBinary)转换为字符串类型或 untypedAtomic 类型,则二进制值将分别以 base64 编码形式或 hex 编码形式表示。
五、 针对 XML 数据类型的 XQuery 函数
这里可查询到 SQL Server 中所有可用的 XQuery 函数。
六、 针对 XML 数据类型的 XQuery 运算符
SQL Server 中支持下列 XQuery 运算符:
l 数字运算符(+、-、*、div、mod)
l 值比较运算符(eq、ne、lt、gt、le、ge)
l 一般比较运算符(=、!=、<、>、<=、>=)
七、 一些典型的 XQuery 使用示例
1、在 where 子句中使用 exist 和 value
WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT CatalogDescription.query('
<pd:Product ProductModelID
="{ (/pd:ProductDescription/@ProductModelID)[1] }">
<Picture>
{ /pd:ProductDescription/pd:Picture/pd:Angle }
{ /pd:ProductDescription/pd:Picture/pd:Size }
</Picture>
</pd:Product>
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist
('/pd:ProductDescription/pd:Picture') = 1
AND CatalogDescription.value
('(/pd:ProductDescription/pd:Picture/pd:Angle)[1]',
'varchar(20)') = 'front'
AND CatalogDescription.value
('(/pd:ProductDescription/pd:Picture/pd:Size)[1]',
'varchar(20)') = 'small'
注意,exist 的返回值,true 为 1,false 为 0。
2、返回自己构造的 XML
SELECT Instructions.query('
declare namespace AWMI=
"http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
<Location>
{ (//AWMI:root/AWMI:Location)[1]/@* } (: 获取一系列属性并添加到构造的XML 结果中:)
<Tools>
{ for $s in
(//AWMI:root/AWMI:Location)[1]//AWMI:step//AWMI:tool
return (: return 是指当前 for ... in 的返回值,而不是整个 XQuery 的返回值:)
<Tool>
{ string($s) }
</Tool>
}
</Tools>
<Materials>
{ for $s in
(//AWMI:root/AWMI:Location)[1]//AWMI:step//AWMI:material
return
<Material>
{ string($s) }
</Material>
}
</Materials>
</Location>') as Result
FROM Production.ProductModel
where ProductModelID=7