--
--10.7.1节示例
--
--在查询中构造序列
SELECT Instructions.query('
<step1> Step 1 </step1>,
<step2> Step 2 </step2>
') AS Result --构造序列
FROM Production.ProductModel
WHERE ProductModelID=7
--有效的序列
DECLARE @x XML
SET @x = ''
SELECT @x.query('1')
SELECT @x.query('"abc", "xyz"')
SELECT @x.query('data(1)')
SELECT @x.query('<x> {1+2} </x>')
-- Root和a就是QName
DECLARE @x XML
SET @x = '<Root><a>ss</a></Root>'
SELECT @x.query('/Root/a') --使用QName
--XQuery查询
SELECT Instructions.query('
declare namespace AWMI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/
ProductModelManuInstructions";
for $Step in /AWMI:root/AWMI:Location[1]/AWMI:step
return
string($Step)
') AS Result –Xquery查询的结果
FROM Production.ProductModel
WHERE ProductModelID=7
--表达式上下文边界空格过滤
declare @x xml
set @x=''
select @x.query('<a> {"aa"} </a>,
<b> {"bb" } </b>') --空格将会被过滤
--原子化
declare @x XML
set @x='<ROOT>
<Location LID="1" SetupTime="1.1" LaborHours="3.3" />
<Location LID="2" SetupTime="1.0" LaborHours="5" />
<Location LID="3" SetupTime="2.1" LaborHours="4" />
</ROOT>'
SELECT @x.query('sum(/ROOT/Location/@LaborHours)') --获得指定对象的总计
--相当于:
SELECT @x.query('sum(data(ROOT/Location/@LaborHours))')
--使用+运算符的原子化
SELECT Instructions.query('
declare namespace AWMI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works
/ProductModelManuInstructions";
for $WC in /AWMI:root/AWMI:Location[1]
return
<WC OriginalLaborHours = "{ $WC/@LaborHours }"
UpdatedLaborHoursV1 = "{ $WC/@LaborHours + 1 }"
UpdatedLaborHoursV2 = "{ data($WC/@LaborHours) + 1 }" >
</WC>') as Result --在XML查询中使用+进行原子化
FROM Production.ProductModel
where ProductModelID=7
--布尔值
DECLARE @x XML
SET @x = '<b/>'
SELECT @x.query('if (/a[1]) then "true" else "false"')--返回false
SELECT @x.query('if (/b[1]) then "true" else "false"')--返回true
--data和string的使用
DECLARE @x XML
SET @x='<root>5</root>'
SELECT @x.query('data(/root[1]) + 3')--返回结果8
--以下查询失败,因为字符串类型和数值类型不能用+
SELECT @x.query('string(/root[1]) + 3')
--动态错误映射到空序列
DECLARE @x XML
SET @x=N'<root XMLns:myNS="test">
<a>100</a>
<b>200</b>
<c>Hello</c>
</root>'
SELECT @x.query('avg(//*)') --有误
--在XQuery中使用注释
declare @x XML
set @x=''
SELECT @x.query('
(: 这里是注释:)
<ProductModel ProductModelID="10" />
')
--
--10.7.2节示例
--
--在XQuery中使用for语句
declare @x XML
set @x='<ManuInstructions ProductModelID="1" ProductModelName="SomeBike" >
<Location LocationID="L1" >
<Step>1.1</Step>
<Step>1.2</Step>
<Step>1.3</Step>
</Location>
<Location LocationID="L2" >
<Step>2.1</Step>
<Step>2.2</Step>
<Step>2.3</Step>
</Location>
</ManuInstructions>' --初始化数据
SELECT @x.query('
for $step in /ManuInstructions/Location[1]/Step
return string($step)
') --循环实现
--在XQuery中使用let语句
SELECT Instructions.query('
declare namespace AWMI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/
ProductModelManuInstructions";
for $T in //AWMI:tool
let $L := //AWMI:Location[.//AWMI:tool[.=data($T)]]
return
<tool desc="{data($T)}" Locations="{data($L/@LocationID)}"/>
') as Result --使用let语句做循环
FROM Production.ProductModel
where ProductModelID=7
--在XQuery中使用where语句
SELECT Instructions.query('
declare namespace AWMI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/
ProductModelManuInstructions";
for $WC in /AWMI:root/AWMI:Location
where count($WC/AWMI:step) < 3
return
<Location >
{ $WC/@LocationID }
</Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7
--在XQuery中使用order by语句
declare @x XML
set @x='<root>
<Person Name="A" />
<Person />
<Person Name="B" />
</root>
'
select @x.query('
for $person in //Person
order by $person/@Name
return $person
')
--
--10.7.3节示例
--
--使用XQuery条件表达式
declare @x XML
declare @v varchar(20)
set @v='FirstName'
set @x='
<ROOT rootID="2">
<FirstName>fname</FirstName>
<LastName>lname</LastName>
</ROOT>'
--以下使用XQuery进行查询
SELECT @x.query('
if ( sql:variable("@v")="FirstName" ) then
//FirstName
else
//LastName
')
--
--10.7.4节示例
--
--使用XQuery运算符
SELECT CatalogDescription.query('
declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
for $P in /PD:ProductDescription/PD:Picture[PD:Size eq "small"]
return
$P
') as Result --XQuery运算符的使用
FROM Production.ProductModel
WHERE ProductModelID=19
--
--10.7.4节示例
--
--使用XQuery函数
DECLARE @books XML
SET @books='
<books>
<book>
<name>大学物理</name>
<price>20</price>
</book>
<book>
<name>高等数学</name>
<price>30</price>
</book>
</books>
'
SELECT @books.query('min(//book/price/text())') --使用函数