- /*
- SQLServer2005 XML在T-SQL查询中的典型应用
- 整理:fcuandy
- 时间:2008.11.7
- 前言:
- 此文只讲xml数据类型及相应的一些操作方法在解决日常T-SQL编程中的一些应用,而避开xml modify,
- xml schema,xml索引,命名空间等这些语法性或者生硬的一些问题(这些语法您可以查联机丛书),即此文主要
- 讲以xml的一些操作特性及xquery去解决编程问题.
- Tags:
- xquery ,FLWOR迭带 ,sql:column ,sql:variable ,nodes ,value ,query ,xpath ,xquery function, if, 聚合函数, xs:function等
- 典型应用举例:
- */
- --(1)
- --====================================================================
- --拆分
- DECLARE @s VARCHAR(100)
- SET @s='a,b,c,dd,ee,f,aa,a,aa,f'
- --常规做法(sql2000常用),以一split函数拆分串为表类型结构,如
- --SELECT * FROM dbo.split(@s,',') a
- --当然,也可能是循环去拆分,或者以一输助表的identity列利用charindex等函数拿identity列值与','的位置匹配实现拆分
- --这些做法,roy_88及本人以前都整理过,不再累赘,可见推荐贴。即便 是xml法,也贴过多次,下面一笔带过
- --XML做法:
- SELECT b.v FROM
- (SELECT CAST('<r>' + REPLACE(@s,',','</r><r>') + '</r>' AS XML) x) a --将字串","换换为"</r><r>"并前后拼上<r>,</r>以用来构造xml串
- CROSS APPLY
- (SELECT v=t.x.value('.','VARCHAR(10)') FROM a.x.nodes('//r') AS t(x) ) b --使用 xml.nodes函数将xml串拆分为行
- /*
- a
- b
- c
- dd
- ee
- f
- aa
- a
- aa
- f
- */
- --(2)
- --====================================================================
- --去重,@s中出现的元素,重复的只要一个,希望结果为 'a,b,c,dd,ee,f'
- --常规做法,循环或函数,或临时表拆后distinct
- --XML做法:
- --a.在(1)的基础上进行
- ;WITH fc AS --定义cte命名,将@s转换为一个表结构
- (
- SELECT DISTINCT b.v v
- FROM
- (SELECT CAST('<r>' + REPLACE(@s,',','</r><r>') + '</r>' AS XML) x) a
- CROSS APPLY
- (SELECT v=t.x.value('.','VARCHAR(10)') FROM a.x.nodes('//r') AS t(x) ) b
- )
- --对这个表利用xml方法进行行值拼接
- SELECT STUFF(b.v.value('/r[1]','varchar(100)'),1,1,'')
- FROM
- (SELECT v=(SELECT ',' + v FROM fc FOR XML PATH(''),ROOT('r'),TYPE)) b
- /*
- a,aa,b,c,dd,ee,f
- */
- --b FLWOR语句 + T-SQL组合:
- SELECT STUFF(v,1,1,'') FROM
- (SELECT CAST('<r>' + REPLACE(@s,',','</r><r>') + '</r>' AS XML) x) a
- CROSS APPLY
- (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
- CROSS APPLY
- (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值最小的节点,原型为:
- --SELECT * FROM tb a WHERE 1>(SELECT COUNT(*) FROM tb WHERE v=a.v AND id<a.id)
- /*
- a ,b ,c ,dd ,ee ,aa ,f
- */
- --c distinct-values
- SELECT REPLACE(v,' ',',') FROM
- (SELECT CAST('<r>' + REPLACE(@s,',','</r><r>') + '</r>' AS XML) x) a
- CROSS APPLY
- (SELECT CAST(a.x.query('distinct-values(//r)') AS VARCHAR(MAX)) v) b --直接调用distinct-values函数来操作
- /*
- a,b,c,dd,ee,f,aa
- */
- -- 导入去重, last() , position()
- DECLARE @doc xml
- SET @doc ='<?xml version="1.0" encoding="gb2312" ?>
- <employees>
- <employee>
- <empid>e0001</empid>
- <name>萧峰</name>
- </employee>
- <employee>
- <empid>e0002</empid>
- <name>段誉</name>
- </employee>
- <employee>
- <empid>e0003</empid>
- <name>王语嫣</name>
- </employee>
- <employee>
- <empid>e0003</empid>
- <name>张无忌</name>
- </employee>
- </employees>
- '
- create table people2
- (
- personid varchar(10) primary key ,
- name varchar(20)
- )
- INSERT people2
- SELECT DISTINCT b.* FROM
- (SELECT x = @doc.query('for $e in //employee return //employee[empid = $e/empid][last()]')) a --FLWOR时,用当前节点去//emploee节点集中找节点集中empid等于当前节点的empid, 在找到的集合中取最后一个利用last()函数
- CROSS APPLY
- (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
- SELECT * FROM people2
- /*
- e0001 萧峰
- e0002 段誉
- e0003 张无忌
- */
- GO
- drop table people2
- GO
- --同组一选多,也可应用此方法,不过没有必要,就不再累赘了。
- --(3)
- --====================================================================
- --列名,列值相关
- --a,按行聚合
- declare @t table(Sname nvarchar(5), V1 float, V2 float, V3 float, V4 float, V5 float, V6 float)
- insert @t select N'张三', 0.11 , 0.21 , 0.29, 0.32 , 0.11, 0.08
- insert @t select N'李四', 0.01 , 0.61 , 0.21, 0.73 , 0.21, 0.12
- insert @t select N'张五', 0.31 , 0.21 , 0.23, 0.33 , 0.91, 0.65
- insert @t select N'张六', 0.59 , 0.11, 0.26, 0.13, 0.01, 0.15
- select b.* from
- (select x=cast((select * from @t for xml path('r')) as xml)) a
- cross apply
- (
- select name=x.query('./Sname/text()'),v=x.query('max(./*[local-name(.)!="Sname"])') from a.x.nodes('//r') as t(x)
- --r为二级节点(因为文档本身无根节点,即为每项的顶级节点)即为一个r节点表示一条记录. r下级节点,每个表示一个列,因为列名未知,所以用/*匹配所有节点,因为name为区别列,不参与聚合运算,故用local-name取得来过滤
- ) b
- /*
- 张三 0.32
- 李四 0.73
- 张五 0.91
- 张六 0.59
- */
- --b ,由值引到取列
- if not object_id('T1') is null
- drop table T1
- GO
- Create table T1([tId] int,[tName] nvarchar(4))
- Insert T1
- select 1,N'zhao' union all
- select 2,N'qian' union all
- select 3,N'sun'
- Go
- --> --> 借且(Roy)生成測試數據
- if not object_id('T2') is null
- drop table T2
- Go
- Create table T2([tId] int,[zhao] nvarchar(1),[qian] nvarchar(1),[sun] nvarchar(1))
- Insert T2
- select 1,N'a',N'b',N'c' union all
- select 2,N'd',N'e',N'f' union all
- select 3,N'g',N'h',N'i'
- Go
- SELECT c.tid,c.tName,v FROM t1 c
- CROSS APPLY
- (SELECT x=(SELECT * FROM t2 WHERE tid=c.tid FOR XML PATH('r'),TYPE)) a
- CROSS APPLY
- (SELECT v=t.x.query('./*[local-name(.)=xs:string(sql:column("c.tName")) ]/text()')
- FROM a.x.nodes('//r') AS t(x)
- ) b
- /*
- 1 zhao a
- 2 qian e
- 3 sun i
- */
- --c, 列名,列值,与系统表
- CREATE TABLE tb(f1 INT,f2 INT,x INT,z INT,d INT,ex INT,dd INT,vv INT)
- INSERT tb SELECT 1,2,3,5,11,3,2423,33
- GO
- SELECT * FROM tb
- GO
- SELECT name,v FROM
- ( SELECT name FROM sys.columns WHERE object_idobject_id=object_id('tb','u') ) a
- CROSS JOIN
- (SELECT x=(SELECT * FROM tb FOR XML PATH('r'),TYPE)) b
- CROSS APPLY
- (SELECT v=t.x.query('./*[local-name(.)=xs:string(sql:column("a.name")) ]/text()') FROM b.x.nodes('//r') AS t(x) ) c
- /*
- f1 1
- f2 2
- x 3
- z 5
- d 11
- ex 3
- dd 2423
- vv 33
- */
- GO
- DROP TABLE tb
- GO
- --(4)
- --一些综合计算
- --以下表 ta.a值 yyyymmdd-yyyymmdd表连续时间段,","表单个日期
- If object_id('ta','u') is not null
- Drop table ta
- Go
- Create table ta(a varchar(100))
- Go
- Insert into ta
- select '1 ¦ ¦20080101-20080911'
- union all
- select '2 ¦ ¦20080101,20080201,20080301,20080515,20080808'
- union all
- select '3 ¦ ¦20080101,20080201,20080301,20080515,20081108'
- Go
- declare @s varchar(8)
- select @s= convert(varchar(8),getdate(),112)
- select stuff(replace(replace(cast(x as varchar(1000)),'</item><item>',case when type='1' then '-' else ',' end),'</item>',''),1,6,type + ' ¦ ¦') a
- from
- (
- select left(a,1) type,
- cast(
- '<item>'
- +
- replace(
- stuff(a,1,5,''),
- case when left(a,1)=1 then '-' else ',' end,
- '</item><item>'
- )
- +
- '</item>'
- AS XML
- ) x
- from ta
- ) base
- where x.value('
- if (sql:column("base.type")="1") then
- if(
- (/item/text())[1]<sql:variable("@s")
- and
- (/item/text())[2]>sql:variable("@s")
- )
- then 1
- else 0
- else
- count(//item[text()>sql:variable("@s")])
- '
- ,
- 'int'
- )>0
- go
相关推荐
海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)
https://www.hikrobotics.com/machinevision/service/download?module=0
sql cast函数_数据分析面试必备——SQL你掌握的怎么样?
数据分析师的招聘JD你们一定不陌生:可以说,不是每个数据分析岗都要求python,但是每个数据分析岗都需要会SQL。写这篇文章是希望帮助还没有实战过SQL的小伙伴、或者了解一些SQL语句,但是担心自己了解的太片面的小伙伴。这篇文章主要介绍的是:如果想要面试数据分析岗位,最优先需要掌握的SQL技能是哪些呢?读完本文,你能快速知道:1、除了select 这种基本的语句,我最应该马上掌握的S...
欧拉 openEuler 20.03安装配置tigervnc-server
欧拉 openEuler 20.03安装配置tigervnc-server openEuler VNC
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 --------
为什么你的SiC MOSFET仿真不准?可能是离子注入的‘沟道效应’在捣鬼(Silvaco BCA模块详解)
本文深入分析了SiC MOSFET仿真中离子注入沟道效应的关键影响,揭示了Silvaco BCA模块在模拟SiC晶向和角度参数时的核心设置要点。通过详细解析晶圆偏切与注入角度的等效关系,提供优化MOSFET沟道区注入仿真的五步实战方法,帮助工程师将阈值电压仿真误差从26%降低到5%以内。
gesp c++ 五级知识点
gesp c++ 五级知识点
如何将oracle或者sqlserver表数据转换成xml数据
oracle: try { string tempTableName = "aaa";//数据库表名 String tempRowName = "row";//节点 String tempSavePath = "D:/Download/Master/users.xml";//...
计算机视觉-深度学习图像检测方法梳理
计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类、目标定位、语义分割、实例分割的区别 a. 图像分类 :给定一张输入图像,图像分类任务旨在判断该图像所属类别; b. 目标定位 :在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式; c. 语义分割 :语义分割是目标检测更进阶的任务,目标检测只需要框出每个目
使用SQL Server的OpenXML解析带有命名空间的XML片段
SQL Server的OpenXML函数可以针对XML片段或者文档进行解析,并处理。有关资料,你可以参考http://msdn.microsoft.com/en-us/library/ms186918.aspx 但如果该片段含有命名空间,情况可能会复杂一点。例如下面这个例子 第一部分:XML的内容 Code 1<?xml-stylesheet href="ProductDescr...
mjlab & MimicKit 宇树 G1 人形机器人强化学习训练部署
基于mjlab框架训练Unitree G1人形机器人执行双旋踢的示例。参考动作源自Jason Peng的MimicKit项目。数据转换脚本(MimicKit pkl → mjlab csv)完整训练结果与超参数预训练ONNX检查点用于部署实体硬件部署指南⚠️ 免责声明仅用于教育目的。对于因尝试复现此处展示结果而导致的财产损失或人身伤害,我们概不负责。操作硬件时请谨慎行事并保持良好判断力。
LangGraph教程8:LangGraph流式处理
流式处理可显著提升基于LLM应用的响应性。LangGraph支持两种流式模式:values模式返回每一步的完整结果,适合需要完整上下文处理的场景;updates模式仅返回增量变化,适用于实时更新需求。示例代码展示了如何用create_react_agent实现这两种模式,其中values模式完整记录处理流程,updates模式逐步输出结果。通过异步迭代输出流,开发者可以灵活选择适合应用场景的流式处理方式。
sql 查询xml数据_使用SQL查询DB2 XML数据
尽管DB2的混合体系结构与以前的版本相比有很大的不同,但是利用其新的XML功能并不一定是一个痛苦的过程。 如果您已经熟悉SQL,则可以立即将您的技能应用于处理本机存储在DB2中的XML数据。 参见本文内容。 DB2 9中的XML功能包括新的存储管理,索引和查询语言支持。 在本文中,学习如何使用SQL或带有XML扩展SQL(SQL / XML)查询DB2 XML列中的数据。 该系列的下一篇文...
让 SAP HANA 查询飞起来:彻底避开隐式类型转换的性能暗礁
SAP HANA性能优化:警惕隐式类型转换陷阱 隐式类型转换是SAP HANA项目中常见的性能隐患。当SQL表达式两侧数据类型不匹配时,系统会自动进行类型转换,这种看似便利的操作可能导致: 过滤条件无法下推,扫描范围扩大 列存引擎优势丧失,触发中间结果物化 执行计划走向低效路径 治理方案包括: 从源头统一数据类型,确保常用比较字段类型一致 将显式转换应用于常量而非整列 使用生成列预先转换存储,避免运行时计算 排查方法: 通过SQL Plan Cache定位高频查询 分析执行计划中的转换迹象 重点关注VARC
使用SQL Server 2005 FOR XML嵌套查询
相比SQL Server 2000提供的FOR XML查询,SQL Server 2005版本对现有功能增强的基础上增加了不少新功能,最为吸引人的功能包括对Xml数据类型支持、使用PATH模式以及嵌套FOR XML查询支持等,这意味着通过新的FOR XML查询功能可以构造出结构更加灵活的Xml数据。
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的字符串,
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
复分析 阿尔福斯(Ahlfors) 第三版答案 英文
答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案
浅探SQL Server 2005对XML的支持
1. 引言可扩展标记语言 (XML) 作为一种与平台无关的数据表示形式已被广泛采用。它对于在松散耦合且完全不同的系统,以及各种企业到企业 (B2B) 应用和工作流范畴内交换信息是很有用的。数据交换已成为 XML 技术的主要驱动力之一。经过长时间的发展和改进,关系数据库在数据安全性、并发性控制、数据共享、数据传输、数据备份和恢复方面已经相当的成熟,关系数据库将为XML数据存储的数据管理、查询和
SQL Server 2005对XML的支持
SQL Server 2000对XML的支持 SQL Server 2000就已经有了对XML的支持,这种支持主要体现在FOR XML子句和SQLXML上。然而,这些支持并不充分,因为在SQL Server 2000里,归根结底是用关系型的数据表来模拟XML数据,由于关系型数据先天上的缺点,让它模拟表现力和扩展性更强的XML数据必然模拟得不伦不类,要实现具有一定格式的XML代码,往往需要写很
sqlserver 2005 xml字段的读写操作
最近在做项目的时候遇到了这个问题 从网上找到一些资料 所以转载过来 提供给那些遇到和没遇到过的朋友参考文章转载于 http://hi.baidu.com/alexyeat/blog/item/8c0d2250cd93365b1138c229.htmlsqlserver2005 有xml字段了,下面是关于xml字段的相关读写操作:1.创建xml字段在表
2万+



被折叠的 条评论
为什么被折叠?



