SQL SERVER XML学习总结(二)

2014-11-24 10:20:45 · 作者: · 浏览: 1
.2 谓语(Predicates) 谓语用来查找某个特定的节点或者包含某个指定的值的节点。 谓语被嵌在方括号中。 例: /root/Info/user[1] 4.3 选取未知节点 XPath 通配符可用来选取未知的 XML 元素。 通配符 描述 * 匹配任何元素节点。 @* 匹配任何属性节点。 node() 匹配任何类型的节点。 例:/root/info/* info节点下的所有元素节点 /root/info/@* info 节点下所有的属性节点 //user[@*] 所有带有属性的user节点 4.4 选取若干路径 通过在路径表达式中使用“|”运算符,您可以选取若干个路径。 例://User | /root/Info/@id 5. XQuery 5.1 基本的查询 DECLARE @dataSource XML SET @dataSource=' 笨笨 MG Olive MG 墨遥 NMG ' --获取root所有子节点 select @dataSource.query('.') select @dataSource.query('root') select @dataSource.query('/root') ----获取所有的info节点 select @dataSource.query('//info') ----获取所有info节点下user节点的name节点 select @dataSource.query('//info/user/name') ----获取所有uid>1的所有Info节点 select @dataSource.query('/root/info[./user[@uid>1]]') if then else 表达式 select @dataSource.query('if (1=3) then /root/info[./user[uid=1]] else /root/info[./user[name="Olive"]]') --路径表达式步骤中的谓词,获取第一个info节点下的user节点下的name select @dataSource.query('/root/info[1]/user/name') --聚合函数 select @dataSource.query('count(/root/info[./user[type="MG"]])') --FLWOR语法:For、Let、Where、Order by、Return select @dataSource.query('{for $li in /root/info/user/name[1] return string($li)}') select @dataSource.query('{for $li in /root/info,$lii in $li/user/name[1] return string($lii)}
') select @dataSource.query('{for $li in /root/info/user order by $li/@uid descending return $li}') select @dataSource.query('{for $li in /root/info/user order by local-name($li) return $li}') 5.2 Value() --value()获取某一节点或其属性的值,然后将其赋值给nvarchar类型 select @dataSource.value('(/root/info/user[1]/name)[1]','nvarchar(20)') 5.3 Exist() select @dataSource.exist('/root/info/user/name[text()[1]="笨笨"]') --将日期类型的节点属性转换为日期类型再与对应的值进行比较 declare @date xml set @date='' --exist() select @date.exist('/root[(@date cast as xs:date ) eq xs:date("2013-10-07")]') --将日期类型的节点的值转换为日期类型再与对应的值进行比较,date[text()[1] cast xs:date ,将节点值转换为日期类型 declare @date1 xml set @date1='2013-10-07' select @date1.exist('/root/date[(text()[1] cast as xs:date ) eq xs:date("2013-10-07")]') --取任意属性的值:sql:variable("@attriname") declare @attr nvarchar(20)='uid' if @dataSource.exist('/root/info/user/@*[local-name()=sql:variable("@attr")]')>=1 select 'OK' else select @dataSource.query('/root/info/user/name[local-name()="笨笨"]') 5.4 Nodes() --nodes()方法,将一个xquery表达式拆分成多行 select T.c.query('.') as result from @dataSource.nodes('/root/info') as T(c) select T.c.query('.') as result from @dataSource.nodes('/root/info/user') as T(c) select T.c.value('(@uid)[1]','varchar(10)') as id, T.c.value('(./name)[1]','nvarchar(20)') as name, T.c.value('(./type)[1]','nvarchar(20)') as [type] from @dataSource.nodes('/root/info/user') T(c) --第一个value方法获取b节点下的值:cec,第二个value方法获取b节点下的值:c declare @xml xml='cec' select @xml.value('(/root/a/b)[1]','nvarchar(20)'),@xml.value('(/root/a/b/text())[1]','nvarchar(20)') --组合