在数据库开发过程中,字符串和关系表的转化是一项基本技能。当字符串中存在分隔符时,有时将其转换成关系表数据,和其他数据表进行join查询,出现这种情况,是因为没有遵守关系数据库的设计范式,没有把字符串拆分成原子项存储,也有可能是数据传参数;有时会遇到相反的情况,需要将关系表的相关数据拼接成一个字符串显示,或传参。

把格式化的字符串转化成关系格式,基本思路分为两种:

  • 利用TSQL的循环语句:每一次循环都插入到关系表变量或临时表中,这种思路是面向过程的编程;

  • 使用XML查询:先把字符串转化成XML格式,再利用XML的nodes()函数,把XML数据转化成关系数据;这种思路是面向集合的编程,建议采用XML查询实现;

把关系格式转化成字符串,基本思路分为两种:

  • 利用TSQL的游标,对字符串执行累加连接,这种思路是面向过程的编程;

  • 利用XML查询的for xml path子句,把关系格式转化成字符串;这种思路是面向集合的编程,建议采用XML查询实现;

一,将字符串转换成表

先把字符串转换成XML格式,再利用XML的nodes()函数,把XML数据转化成关系数据,这种实现方式性能快,代码简洁,

declare @separator varchar(10)declare @str varchar(max)    
set @separator=','set @str='54,57,55,56,59'

1,把字符串转化成节点值

declare @xml xmlset @xml=convert(xml,'<v>' + REPLACE(@str, @separator, '</v><v>') + '</v>')SELECT ids=N.v.value('.', 'int') 
FROM @xml.nodes('/v') N(v)

2,把字符串转化成节点属性

declare @xml xmlset @xml=convert(xml,'<Item v=''' + REPLACE(@str, @separator, '''></Item><Item v=''') + '''></Item>')    
SELECT ids=N.v.value('@v', 'int') 
FROM @xml.nodes('/Item'