设为首页 收藏本站
查看: 922|回复: 0

[经验分享] SQL SERVER XML 学习总结

[复制链接]
发表于 2018-10-14 07:32:46 | 显示全部楼层 |阅读模式
  SQL SERVER XML 学习总结
  最新的项目任务要做一个数据同步的功能,这些天都在做技术准备,主要是用到了微软的Service Broker技术,在熟悉使用该技术的同时,又用到了Sql server xml的一些知识,这两天在家,把这个sql xml的一些知识给学习了一下,下边是一些学习过程中的总结,希望能给大家带来一些帮助。
  在学习过程中主要参考(http://blog.csdn.net/beirut/article/details/8154102).
  测试用的数据
  use TestDB
  go
  create Table TbFroXML(id uniqueidentifier primary key,name nvarchar(50),[type] nvarchar(50))
  go
  insert into TbFroXML values(NEWID(),'BBen','MG')
  insert into TbFroXML values(NEWID(),'BB','MG')
  insert into TbFroXML values(NEWID(),'Olive','MG')
  insert into TbFroXML values(NEWID(),'今天','NMG')
  insert into TbFroXML values(NEWID(),'明天','NMG')
  insert into TbFroXML values(NEWID(),'未来','NMG')
  insert into TbFroXML(id,name) values(newid(),'笨笨')
  go
1. For Xml Path
  --无名称列,针对行集合中的每一行生成一个对应的row元素,格式:1
  select 1 for xml path
  --生产格式 XXX
  select name from TbFroXML for xml path
  --去掉name标签,只剩下row标签,格式:BBenBB>Olive....
  select name+'' from TbFroXML for xml path
  --只生成要查询的列的数据,去掉row元素,格式:BB未来明天今天BBenOlive
  select name+'' from TbFroXML for xml path('')

  --生成格式:
  select>  --以NMG标记作为行标记,格式:BBen未来
  select name from TbFroXML for xml path('NMG')
  --以NMG标记作为行标记,以Mg标记作为内标记,格式:BB未来
  select name as MG from TbFroXML for xml path('NMG')
  --生成格式:BB
  select name as 'BBen/Olive' from TbFroXML for xml path

  --生成格式:
  select>  --被指定为列名的路径为data(),则在生成的XML 中,该值将被作为一个原子值来处理,

  --生成格式:
  select>  --默认情况下,列中的Null 值映射为“缺少相应的属性、节点或元素,使用ELEMENTS 指令请求以元素为中心的XML 并指定XSINIL 来请求为NULL 值添加元素,格式: 笨笨

  select>  --ROOT('oo'),--指定向产生的XML 中添加单个顶级元素

  select>2. For Xml Row/Auto模式
  --auto模式,格式:
  select * from TbFroXML for xml auto
  --elements选项,将每列值都映射为〈row>元素的子元素,格式:41D6A175-C079-4861-9C75-2EE48A62C3BCBBMG
  select * from TbFroXML for xml auto,elements
  --row 模式:格式:7B890E0B-C470-4E93-89A4-3041B70E8DF3笨笨
  select * from TbFroXML for xml raw,elements
  --elements选项,值为XSINIL 时,将结果集中的值为null 的列映射为xsi:nil=true属性的元素,格式:41D6A175-C079-4861-9C75-2EE48A62C3BCBBMG
  select * from TbFroXML for xml raw, elements xsinil
  --xmldata:结果请求架构
  select * from TbFroXML for xml raw,xmldata
  --xmlschema:结果请求架构
  select * from TbFroXML for xml raw,xmlschema
3. For XML Explicit
  select 1 as Tag,
  NULL as Parent,
  3 as [node!1] --[node!1]代表的是根节点,node为节点名,代表节点层次结构的节点级别
  for xml explicit
  select 1 as Tag,
  null as Parent,
  Null as [root!1],
  null as [node!2!id!element]--[node!2!id!ELEMENT]node 代表的是节点名称;2代表的节点层次;id 表示的是元素名称;.ELEMENT 选项表示向 元素添加了 元素子级,而不是添加属性。
  union all
  select 2 as Tag,
  1 as Parent,
  null,
  id

  from TbFroXML where>4. XPath
  XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
4.1 选取节点
  下面列出了最有用的路径表达式:
  表达式
  描述
  nodename
  选取此节点的所有子节点。
  /
  从根节点选取。
  //
  从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
  .
  选取当前节点。
  ..
  选取当前节点的父节点。
  @
  选取属性。
4.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>  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)')
  --组合使用
  declare @xml xml =''
  declare @pos int=2
  select @xml.value('local-name((/root/info/@*[position()=sql:variable("@pos")])[1])','nvarchar(20)')
  --sql:column:将普通数据列和Xml数据合并
  declare @tb table (id int,data xml)
  insert into @tb(id,data) select 1,'BenbenMG'

  select>  ---contains:模糊查询contains(.,'XX')
  select t.c.query('.') from @dataSource.nodes('/root/info/user[./name[contains(.,"笨")]]') t(c)
5.5 Modify()
5.5.1 Insert
  --在某一节点下添加一个子节点insert into,as first/as last 指定节点插入的位置
  set @dataSource.modify('insert F as last into (/root/info/user)[1]')
  select @dataSource
  --添加某一节点的同级节点,before/after 添加同级节点
  set @dataSource.modify('insert A1 before (/root/info/user/name)[1]')
  select @dataSource
  --插入属性
  declare @a int=111
  set @dataSource.modify('insert (attribute a {sql:variable("@a")},
  attribute b {".3"})
  into (/root/info/user[@uid=001])[1]')
  select @dataSource
5.5.2 Delete
  --删除属性
  set @dataSource.modify('delete /root/info/user/@uid')
  select @dataSource
  --删除节点
  set @dataSource.modify('delete /root/info/user/type')
  select @dataSource
  --删除节点内容
  set @dataSource.modify('delete /root/info/user/type/text()')
  select @dataSource
  --删除所有属性为空的节点
  set @dataSource.modify('delete //*[empty(./*)]')
  select @dataSource
5.5.3 Replace
  --修改节点值
  set @dataSource.modify('replace value of (/root/info/user/name/text())[1] with "小笨笨"')
  select @dataSource
  --修改属性值
  set @dataSource.modify('replace value of (/root/info/user/@uid)[1] with "0001"')
  select @dataSource


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-621283-1-1.html 上篇帖子: 备份概述 (SQL Server) 下篇帖子: sql server2005 储存过程学习实例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表