SQL Server XQuery 学习笔记(结束)

 

三、 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值