SQLServer2005 XML在T-SQL查询中的典型应用

SQL Server 2005数据库管理与应用指南 本文还有配套的精品资源,点击获取 简介:SQL Server 2005是微软推出的具有重要地位的关系型数据库管理系统,它以强大的数据库功能和安全性著称。该系统为数据存储、管理和分析提供了关键性的支持,深受企业和开发者的青睐。本简介介绍了SQL Server 2005的核心特性,包括Transact-SQL支持、集成服务、分析服务、Reporting Services、通知服... 阅读详情
  1. /*
  2. SQLServer2005 XML在T-SQL查询中的典型应用
  3. 整理:fcuandy
  4. 时间:2008.11.7
  5. 前言:
  6.     此文只讲xml数据类型及相应的一些操作方法在解决日常T-SQL编程中的一些应用,而避开xml modify,
  7. xml schema,xml索引,命名空间等这些语法性或者生硬的一些问题(这些语法您可以查联机丛书),即此文主要
  8. 讲以xml的一些操作特性及xquery去解决编程问题.
  9. Tags:
  10.     xquery ,FLWOR迭带 ,sql:column ,sql:variable ,nodes ,value ,query ,xpath ,xquery function, if, 聚合函数, xs:function等
  11. 典型应用举例:
  12. */
  13. --(1)
  14. --====================================================================
  15. --拆分
  16. DECLARE @s VARCHAR(100)
  17. SET @s='a,b,c,dd,ee,f,aa,a,aa,f'
  18. --常规做法(sql2000常用),以一split函数拆分串为表类型结构,如
  19. --SELECT * FROM dbo.split(@s,',') a
  20. --当然,也可能是循环去拆分,或者以一输助表的identity列利用charindex等函数拿identity列值与','的位置匹配实现拆分
  21. --这些做法,roy_88及本人以前都整理过,不再累赘,可见推荐贴。即便 是xml法,也贴过多次,下面一笔带过
  22. --XML做法:
  23. SELECT b.v FROM
  24.     (SELECT CAST('<r>' + REPLACE(@s,',','</r><r>') + '</r>' AS XML) x) a   --将字串","换换为"</r><r>"并前后拼上<r>,</r>以用来构造xml串
  25. CROSS APPLY
  26.     (SELECT v=t.x.value('.','VARCHAR(10)') FROM a.x.nodes('//r') AS t(x) ) b  --使用 xml.nodes函数将xml串拆分为行
  27. /*
  28. a
  29. b
  30. c
  31. dd
  32. ee
  33. f
  34. aa
  35. a
  36. aa
  37. f
  38. */
  39. --(2)
  40. --====================================================================
  41. --去重,@s中出现的元素,重复的只要一个,希望结果为 'a,b,c,dd,ee,f'
  42. --常规做法,循环或函数,或临时表拆后distinct
  43. --XML做法:
  44. --a.在(1)的基础上进行
  45. ;WITH fc AS   --定义cte命名,将@s转换为一个表结构
  46. (
  47.     SELECT DISTINCT b.v v
  48.             FROM
  49.                 (SELECT CAST('<r>' + REPLACE(@s,',','</r><r>') + '</r>' AS XML) x) a
  50.             CROSS APPLY
  51.                 (SELECT v=t.x.value('.','VARCHAR(10)') FROM a.x.nodes('//r') AS t(x) ) b
  52. )
  53. --对这个表利用xml方法进行行值拼接
  54. SELECT STUFF(b.v.value('/r[1]','varchar(100)'),1,1,'')
  55.     FROM
  56.     (SELECT v=(SELECT ',' + v FROM fc FOR XML PATH(''),ROOT('r'),TYPE)) b
  57. /*
  58. a,aa,b,c,dd,ee,f
  59. */
  60. --b FLWOR语句 + T-SQL组合:
  61. SELECT STUFF(v,1,1,'') FROM
  62.     (SELECT CAST('<r>' + REPLACE(@s,',','</r><r>') + '</r>' AS XML) x) a
  63. CROSS APPLY
  64.     (SELECT x=(SELECT t.x.value('.','varchar(10)') v,idx=ROW_NUMBER() OVER(ORDER BY GETDATE()) FROM a.x.nodes('//r') AS t(x) FOR XML PATH('r'),TYPE)) b --利用row_number得到唯一idx
  65. CROSS APPLY
  66.     (SELECT v=CAST(b.x.query('for $r in //r where count(//r[v=$r/v and idx<$r/idx])=0 return concat(",",xs:string($r/v[1]))') AS VARCHAR(MAX))) c  --类似count计数法,取得v相同的节点集idx值最小的节点,原型为:
  67. --SELECT * FROM tb a WHERE 1>(SELECT COUNT(*) FROM tb WHERE v=a.v AND id<a.id)
  68. /*
  69. a ,b ,c ,dd ,ee ,aa ,f
  70. */
  71. --c distinct-values
  72. SELECT REPLACE(v,' ',',') FROM
  73.     (SELECT CAST('<r>' + REPLACE(@s,',','</r><r>') + '</r>' AS XML) x) a
  74. CROSS APPLY
  75.     (SELECT CAST(a.x.query('distinct-values(//r)') AS VARCHAR(MAX)) v) b  --直接调用distinct-values函数来操作
  76. /*
  77. a,b,c,dd,ee,f,aa
  78. */
  79. -- 导入去重, last() , position()
  80. DECLARE   @doc  xml
  81. SET   @doc   ='<?xml version="1.0" encoding="gb2312" ?>
  82. <employees>
  83.     <employee>
  84.         <empid>e0001</empid>
  85.         <name>萧峰</name>
  86.     </employee>
  87.     <employee>
  88.         <empid>e0002</empid>
  89.         <name>段誉</name>
  90.     </employee>
  91.     <employee>
  92.         <empid>e0003</empid>
  93.         <name>王语嫣</name>
  94.     </employee>
  95.     <employee>
  96.         <empid>e0003</empid>
  97.         <name>张无忌</name>
  98.     </employee>
  99. </employees>
  100. '
  101. create table people2 
  102. ( 
  103.     personid varchar(10)  primary key ,
  104.     name varchar(20) 
  105.  )
  106. INSERT people2
  107. SELECT DISTINCT b.* FROM
  108.     (SELECT x = @doc.query('for $e in //employee  return  //employee[empid = $e/empid][last()]')) a  --FLWOR时,用当前节点去//emploee节点集中找节点集中empid等于当前节点的empid, 在找到的集合中取最后一个利用last()函数
  109. CROSS APPLY
  110.     (SELECT id=t.x.value('empid[1]','varchar(100)'),name=t.x.value('name[1]','varchar(100)') FROM a.x.nodes('//employee') AS t(x)) b
  111. SELECT * FROM people2
  112. /*
  113. e0001    萧峰
  114. e0002    段誉
  115. e0003    张无忌
  116. */
  117. GO
  118. drop table people2 
  119. GO
  120. --同组一选多,也可应用此方法,不过没有必要,就不再累赘了。
  121. --(3)
  122. --====================================================================
  123. --列名,列值相关
  124. --a,按行聚合
  125. declare @t table(Sname nvarchar(5),  V1 float,    V2 float,    V3 float,      V4 float,    V5 float,      V6 float) 
  126. insert @t select N'张三',    0.11 , 0.21 , 0.29,  0.32 ,   0.11,    0.08 
  127. insert @t select N'李四',    0.01 , 0.61 , 0.21,  0.73 ,   0.21,    0.12 
  128. insert @t select N'张五',    0.31 , 0.21 , 0.23,  0.33 ,   0.91,    0.65 
  129. insert @t select N'张六',    0.59 , 0.11,  0.26,  0.13,    0.01,    0.15 
  130. select b.* from
  131.     (select x=cast((select * from @t for xml path('r')) as xml)) a
  132. cross apply
  133.     (
  134.         select name=x.query('./Sname/text()'),v=x.query('max(./*[local-name(.)!="Sname"])') from a.x.nodes('//r') as t(x)  
  135.         --r为二级节点(因为文档本身无根节点,即为每项的顶级节点)即为一个r节点表示一条记录. r下级节点,每个表示一个列,因为列名未知,所以用/*匹配所有节点,因为name为区别列,不参与聚合运算,故用local-name取得来过滤
  136.     ) b
  137. /*
  138. 张三    0.32
  139. 李四    0.73
  140. 张五    0.91
  141. 张六    0.59
  142. */
  143. --b ,由值引到取列
  144. if not object_id('T1') is null
  145.     drop table T1
  146. GO
  147. Create table T1([tId] int,[tName] nvarchar(4))
  148. Insert T1
  149. select 1,N'zhao' union all
  150. select 2,N'qian' union all
  151. select 3,N'sun'
  152. Go
  153. --> --> 借且(Roy)生成測試數據
  154.  
  155. if not object_id('T2') is null
  156.     drop table T2
  157. Go
  158. Create table T2([tId] int,[zhao] nvarchar(1),[qian] nvarchar(1),[sun] nvarchar(1))
  159. Insert T2
  160. select 1,N'a',N'b',N'c' union all
  161. select 2,N'd',N'e',N'f' union all
  162. select 3,N'g',N'h',N'i'
  163. Go
  164. SELECT c.tid,c.tName,v FROM t1 c
  165. CROSS APPLY
  166.     (SELECT x=(SELECT * FROM t2 WHERE tid=c.tid FOR XML PATH('r'),TYPE)) a
  167. CROSS APPLY
  168.     (SELECT v=t.x.query('./*[local-name(.)=xs:string(sql:column("c.tName")) ]/text()') 
  169.         FROM a.x.nodes('//r') AS t(x)
  170.     ) b
  171. /*
  172. 1    zhao    a
  173. 2    qian    e
  174. 3    sun    i
  175. */
  176. --c, 列名,列值,与系统表 
  177. CREATE TABLE tb(f1 INT,f2 INT,x INT,z INT,d INT,ex INT,dd INT,vv INT) 
  178. INSERT tb SELECT 1,2,3,5,11,3,2423,33 
  179. GO 
  180. SELECT * FROM tb 
  181. GO 
  182. SELECT name,v FROM
  183.   ( SELECT name FROM sys.columns WHERE object_idobject_id=object_id('tb','u') ) a 
  184. CROSS JOIN
  185.   (SELECT x=(SELECT * FROM tb FOR XML PATH('r'),TYPE)) b 
  186. CROSS APPLY
  187.  (SELECT v=t.x.query('./*[local-name(.)=xs:string(sql:column("a.name")) ]/text()') FROM b.x.nodes('//r') AS t(x) ) c 
  188. /*
  189. f1  1
  190. f2  2
  191. x   3
  192. z   5
  193. d   11
  194. ex  3
  195. dd  2423
  196. vv  33
  197. */
  198. GO 
  199. DROP TABLE tb
  200. GO
  201. --(4)
  202. --一些综合计算
  203. --以下表 ta.a值 yyyymmdd-yyyymmdd表连续时间段,","表单个日期
  204. If object_id('ta','u') is not null 
  205.     Drop table ta
  206. Go
  207. Create table ta(a varchar(100))
  208. Go
  209. Insert into ta
  210. select '1 ¦ ¦20080101-20080911' 
  211. union all
  212. select '2 ¦ ¦20080101,20080201,20080301,20080515,20080808'
  213. union all
  214. select '3 ¦ ¦20080101,20080201,20080301,20080515,20081108'
  215. Go
  216. declare @s varchar(8)
  217. select @s= convert(varchar(8),getdate(),112)
  218. select stuff(replace(replace(cast(x as varchar(1000)),'</item><item>',case when type='1' then '-' else ',' end),'</item>',''),1,6,type + ' ¦ ¦') a
  219.     from
  220.     (
  221.         select left(a,1) type, 
  222.             cast(
  223.                     '<item>' 
  224.                     + 
  225.                     replace(
  226.                         stuff(a,1,5,''),
  227.                         case when left(a,1)=1 then '-' else ',' end,
  228.                         '</item><item>'
  229.                         )
  230.                     + 
  231.                     '</item>'
  232.                 AS XML
  233.                 ) x
  234.         from ta
  235.     ) base
  236.     where x.value('
  237.             if (sql:column("base.type")="1") then
  238.                 if(
  239.                     (/item/text())[1]<sql:variable("@s")
  240.                     and
  241.                     (/item/text())[2]>sql:variable("@s")
  242.                 )
  243.                 then 1
  244.                 else 0
  245.             else
  246.                 count(//item[text()>sql:variable("@s")])
  247.             '
  248.             ,
  249.             'int'
  250.             )>0
  251. go
待续..
Agent + 监控平台:自动诊断告警根因 根因分析、智能监控、AI Agent、告警风暴、异常检测、可观测性、故障诊断在现代分布式系统中,快速定位和解决问题是维持系统稳定性的关键。传统的监控系统虽然能够生成大量告警,但往往缺乏对告警根因的自动诊断能力,导致运维团队在告警风暴中难以快速定位问题。本文深入探讨了将AI Agent技术与监控平台结合,实现告警根因自动诊断的技术架构、理论基础和实现方法。我们将从第一性原理出发,分析根因诊断问题的本质,介绍基于Agent的智能监控系统设计,并通过实际案例展示其应用价值。文章同时涵盖了从理论到实践的全链路,包括 阅读详情

相关推荐

海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)

https://www.hikrobotics.com/machinevision/service/download?module=0

weixin_41965898的博客 2万+

sql cast函数_数据分析面试必备——SQL你掌握的怎么样?

数据分析师的招聘JD你们一定不陌生:可以说,不是每个数据分析岗都要求python,但是每个数据分析岗都需要会SQL。写这篇文章是希望帮助还没有实战过SQL的小伙伴、或者了解一些SQL语句,但是担心自己了解的太片面的小伙伴。这篇文章主要介绍的是:如果想要面试数据分析岗位,最优先需要掌握的SQL技能是哪些呢?读完本文,你能快速知道:1、除了select 这种基本的语句,我最应该马上掌握的S...

weixin_39970369的博客 375

欧拉 openEuler 20.03安装配置tigervnc-server

欧拉 openEuler 20.03安装配置tigervnc-server openEuler VNC

郭亚望 8954

SQL Server2005 拆分-去重-合并

--测试表 if OBJECT_ID('test') is not null drop table test go create table test ( [key] varchar(20) ) go insert test select 'a,b' union all select 'b,c' select * from test /* key --------

矫正的快乐人生 1726

为什么你的SiC MOSFET仿真不准?可能是离子注入的‘沟道效应’在捣鬼(Silvaco BCA模块详解)

本文深入分析了SiC MOSFET仿真中离子注入沟道效应的关键影响,揭示了Silvaco BCA模块在模拟SiC晶向和角度参数时的核心设置要点。通过详细解析晶圆偏切与注入角度的等效关系,提供优化MOSFET沟道区注入仿真的五步实战方法,帮助工程师将阈值电压仿真误差从26%降低到5%以内。

weixin_26789847的博客 410

gesp c++ 五级知识点

gesp c++ 五级知识点

MMD.然大大 2009

如何将oracle或者sqlserver表数据转换成xml数据

oracle: try { string tempTableName = "aaa";//数据库表名 String tempRowName = "row";//节点 String tempSavePath = "D:/Download/Master/users.xml";//...

漫随天外的博客 909

计算机视觉-深度学习图像检测方法梳理

计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类、目标定位、语义分割、实例分割的区别 a. 图像分类 :给定一张输入图像,图像分类任务旨在判断该图像所属类别; b. 目标定位 :在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式; c. 语义分割 :语义分割是目标检测更进阶的任务,目标检测只需要框出每个目

qq_41662991的博客 9953

使用SQL Server的OpenXML解析带有命名空间的XML片段

SQL Server的OpenXML函数可以针对XML片段或者文档进行解析,并处理。有关资料,你可以参考http://msdn.microsoft.com/en-us/library/ms186918.aspx 但如果该片段含有命名空间,情况可能会复杂一点。例如下面这个例子 第一部分:XML的内容 Code  1&lt;?xml-stylesheet href="ProductDescr...

weixin_34366546的博客 335

mjlab & MimicKit 宇树 G1 人形机器人强化学习训练部署

基于mjlab框架训练Unitree G1人形机器人执行双旋踢的示例。参考动作源自Jason Peng的MimicKit项目。数据转换脚本(MimicKit pkl → mjlab csv)完整训练结果与超参数预训练ONNX检查点用于部署实体硬件部署指南⚠️ 免责声明仅用于教育目的。对于因尝试复现此处展示结果而导致的财产损失或人身伤害,我们概不负责。操作硬件时请谨慎行事并保持良好判断力。

2506_90492529的博客 1700

LangGraph教程8:LangGraph流式处理

流式处理可显著提升基于LLM应用的响应性。LangGraph支持两种流式模式:values模式返回每一步的完整结果,适合需要完整上下文处理的场景;updates模式仅返回增量变化,适用于实时更新需求。示例代码展示了如何用create_react_agent实现这两种模式,其中values模式完整记录处理流程,updates模式逐步输出结果。通过异步迭代输出流,开发者可以灵活选择适合应用场景的流式处理方式。

Cachel Wood的博客 620

sql 查询xml数据_使用SQL查询DB2 XML数据

尽管DB2的混合体系结构与以前的版本相比有很大的不同,但是利用其新的XML功能并不一定是一个痛苦的过程。 如果您已经熟悉SQL,则可以立即将您的技能应用于处理本机存储在DB2中的XML数据。 参见本文内容。 DB2 9中的XML功能包括新的存储管理,索引和查询语言支持。 在本文中,学习如何使用SQL或带有XML扩展SQL(SQL / XML)查询DB2 XML列中的数据。 该系列的下一篇文...

cuyi7076的博客 2812

让 SAP HANA 查询飞起来:彻底避开隐式类型转换的性能暗礁

SAP HANA性能优化:警惕隐式类型转换陷阱 隐式类型转换是SAP HANA项目中常见的性能隐患。当SQL表达式两侧数据类型不匹配时,系统会自动进行类型转换,这种看似便利的操作可能导致: 过滤条件无法下推,扫描范围扩大 列存引擎优势丧失,触发中间结果物化 执行计划走向低效路径 治理方案包括: 从源头统一数据类型,确保常用比较字段类型一致 将显式转换应用于常量而非整列 使用生成列预先转换存储,避免运行时计算 排查方法: 通过SQL Plan Cache定位高频查询 分析执行计划中的转换迹象 重点关注VARC

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 11万+

使用SQL Server 2005 FOR XML嵌套查询

相比SQL Server 2000提供的FOR XML查询,SQL Server 2005版本对现有功能增强的基础上增加了不少新功能,最为吸引人的功能包括对Xml数据类型支持、使用PATH模式以及嵌套FOR XML查询支持等,这意味着通过新的FOR XML查询功能可以构造出结构更加灵活的Xml数据。

7002

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

sql server T-Sql操作Xml数据

一、前言 SQLServer 2005 引入了一种称为 XML 的本机数据类型。用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列;此外,还允许带有变量和参数。为了更好地支持 XML 模型特征(例如文档顺序和递归结构),XML 值以内部格式存储为大型二进制对象 (BLOB)。 用户将一个XML数据存入数据库的时候,可以使用这个XML的字符串,

不积跬步无以至千里,不积小流无以成江海 1662

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SQL Server 2005中的XML的最佳实践

介绍Microsoft SQL Server 2005 对XML数据处理提供了广泛的支持。XML值可以以原生的形式存储在具有XML数据类型的列中,它们可以是有类型的XML(typed XML),或者是无类型的XML(untyped XML)。你可以对XML列添加索引。此外,还可以使用XQuery和XML DML来精细地操作数据,后者已成为数据修改功能的扩展。 Microsoft SQL Serve

体验SQL Server 2005 2864

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

浅探SQL Server 2005对XML的支持

1.    引言可扩展标记语言 (XML) 作为一种与平台无关的数据表示形式已被广泛采用。它对于在松散耦合且完全不同的系统,以及各种企业到企业 (B2B) 应用和工作流范畴内交换信息是很有用的。数据交换已成为 XML 技术的主要驱动力之一。经过长时间的发展和改进,关系数据库在数据安全性、并发性控制、数据共享、数据传输、数据备份和恢复方面已经相当的成熟,关系数据库将为XML数据存储的数据管理、查询和

Samlin的专栏 1667

SQL Server 2005对XML的支持

SQL Server 2000对XML的支持    SQL Server 2000就已经有了对XML的支持,这种支持主要体现在FOR XML子句和SQLXML上。然而,这些支持并不充分,因为在SQL Server 2000里,归根结底是用关系型的数据表来模拟XML数据,由于关系型数据先天上的缺点,让它模拟表现力和扩展性更强的XML数据必然模拟得不伦不类,要实现具有一定格式的XML代码,往往需要写很

Witwind的专栏 1600

sqlserver 2005 xml字段的读写操作

最近在做项目的时候遇到了这个问题    从网上找到一些资料   所以转载过来    提供给那些遇到和没遇到过的朋友参考文章转载于   http://hi.baidu.com/alexyeat/blog/item/8c0d2250cd93365b1138c229.htmlsqlserver2005 有xml字段了,下面是关于xml字段的相关读写操作:1.创建xml字段在表

爱上晴天的雨 1799
上一篇: sqlserver2005全文索引与同义词操作目前发现的一些问题,及一个完整的测试
下一篇: 利用触发器实现标识列连续。(支持批量插入)
fcuandy
博客等级 码龄23年 780粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值