SQL Sever中FOR XML PATH函数用法以及转义字符正常显示

FOR XML PATH 简单介绍

首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下:
在这里插入图片描述
接下来我们来看应用FOR XML PATH的查询结果语句如下:

SELECT * FROM hobby FOR XML PATH

结果:

<row>
  <hobbyID>1</hobbyID>
  <hName>爬山</hName>
</row>
<row>
  <hobbyID>2</hobbyID>
  <hName>游泳</hName>
</row>
<row>
  <hobbyID>3</hobbyID>
  <hName>美食</hName>
</row>

由此可见FOR XML PATH 可以将查询结果根据行输出成XML格式!

那么,如何改变XML行节点的名称呢?代码如下:

SELECT * FROM hobby FOR XML PATH('MyHobby')

结果原来的行节点row 变成了我们在PATH后面括号()中,自定义的名称MyHobby,结果如下:

<MyHobby>
  <hobbyID>1</hobbyID>
  <hName>爬山</hName>
</MyHobby>
<MyHobby>
  <hobbyID>2</hobbyID>
  <hName>游泳</hName>
</MyHobby>
<MyHobby>
  <hobbyID>3</hobbyID>
  <hName>美食</hName>
</MyHobby>

那么列节点如何改变呢?还记的给列起别名的关键字AS吗?对了就是用它!代码如下:

SELECT hobbyID as 'MyCode',hName as 'MyName' FROM hobby FOR XML PATH('MyHobby')

那么这个时候我们列的节点名称也会编程我们自定义的名称 与结果如下:

<MyHobby>
  <MyCode>1</MyCode>
  <MyName>爬山</MyName>
</MyHobby>
<MyHobby>
  <MyCode>2</MyCode>
  <MyName>游泳</MyName>
</MyHobby>
<MyHobby>
  <MyCode>3</MyCode>
  <MyName>美食</MyName>
</MyHobby>

既然行的节点与列的节点我们都可以自定义,我们是否可以构建我们喜欢的输出方式呢?还是看代码:

SELECT '[ '+hName+' ]' FROM hobby FOR XML PATH('')

没错我们还可以通过符号+号,来对字符串类型字段的输出格式进行定义。结果如下:

[ 爬山 ][ 游泳 ][ 美食 ]

那么其他类型的列怎么自定义? 没关系,我们将它们转换成字符串类型就行啦!例如:

SELECT '{'+STR(hobbyID)+'}','[ '+hName+' ]' FROM hobby FOR XML PATH('')

一个应用场景与FOR XML PATH应用

我们在增加一张学生表,列分别为(stuID,sName,hobby),stuID代表学生编号,sName代表学生姓名,hobby列存学生的爱好!那么现在表结构如下:
在这里插入图片描述
这时,我们的要求是查询学生表,显示所有学生的爱好的结果集,代码如下:

SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby 
FROM (
      SELECT sName,
             (
                SELECT hobby+',' FROM student 
                WHERE sName=A.sName 
                FOR XML PATH('')
              ) AS StuList
      FROM student A 
      GROUP BY sName
) B 

结果如下:
在这里插入图片描述
分析: 首先看这句

  SELECT hobby+',' 
  FROM student 
  WHERE sName=A.sName 
  FOR XML PATH('')

这句是通过FOR XML PATH 将某一姓名如张三的爱好,显示成格式为:“ 爱好1,爱好2,爱好3,”的格式!

那么接着看:

SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby 
FROM (
     SELECT sName,
           (SELECT hobby+',' FROM student 
            WHERE sName=A.sName 
            FOR XML PATH('')) AS StuList
     FROM student A 
     GROUP BY sName
) B  

剩下的代码首先是将表分组,在执行FOR XML PATH 格式化,这时当还没有执行最外层的SELECT时查询出的结构为:
在这里插入图片描述
可以看到StuList列里面的数据都会多出一个逗号,这时随外层的语句:SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby 就是来去掉逗号,并赋予有意义的列明!

转义字符正常显示

有时候我们的数据库中有尖括号,然后有用到xml的时候,sql会自动的把尖括号进行转义,但是我们不需要转义,并且对这个有要求要用到,这时候我们可以用value的形式来实现,测试数据:

--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([ID] int,[Chemistry] nvarchar(47))
Insert #T
select 1,N'CaF<sub>2</sub>' union all
select 2,N'Al<sub>2</sub>O<sub>3<?sub>'
Go
--测试数据结束

用for xml path读取指标信息

SELECT
STUFF((
Select ','+Chemistry from #T FOR XML PATH('')),1,1,'')

读取的结果是这样的:
在这里插入图片描述
我们看到尖括号已经进行了转义,如果我们还想要尖括号,可以这样写:

SELECT
STUFF((
        Select ','+Chemistry from #T FOR XML PATH(''),TYPE
      ).value('.','NVARCHAR(MAX)')
     ,1,1,'')

结果:
在这里插入图片描述
这样的结果已经是不再转义的了。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用delete函数删除SQL Server数据库与Matlab的变量相等的数据,你需要进行以下步骤: 1. 连接到SQL Server数据库:首先,你需要使用适当的方法连接到SQL Server数据库。这可能涉及使用数据库的驱动程序和凭据来创建数据库连接对象(例如,使用Python的pyodbc模块连接SQL Server数据库)。 2. 查询数据库:在Matlab,你可以使用数据库查询语言(如SQL)来获取指定变量的值。执行适当的查询并将结果存储在Matlab变量。 3. 调用delete函数:使用delete函数删除SQL Server数据库与Matlab变量相等的数据。你可以将查询结果用作delete函数的whereclause参数,以便删除满足条件的行。 以下是一个示例,演示如何使用delete函数删除SQL Server数据库与Matlab变量相等的数据(假设使用Python的pyodbc模块连接SQL Server数据库): ```matlab % 连接到SQL Server数据库 conn = pyodbc.connect('DRIVER={SQL Server};SERVER=server_name;DATABASE=database_name;UID=username;PWD=password'); % 查询数据库获取指定变量的值 query = ['SELECT * FROM tableName WHERE variable = ' matlabVariable]; result = conn.execute(query); % 将查询结果存储在Matlab变量 data = []; for row = result.fetchall() data = [data; row.column_name]; end % 调用delete函数删除SQL Server数据库与Matlab变量相等的数据 delete(conn, 'tableName', ['column_name IN (''' strjoin(data, ''', ''') ''')']); % 关闭数据库连接 conn.close(); ``` 请注意,上述代码仅为示例,实际使用时需要根据数据库和表的结构以及Matlab变量的类型和内容进行适当的修改。还要确保在操作数据库时采取适当的安全措施,如防止SQL注入攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值