在數(shù)據(jù)庫(kù)開(kāi)發(fā)過(guò)程中,字符串和關(guān)系表的轉(zhuǎn)化是一項(xiàng)基本技能。當(dāng)字符串中存在分隔符時(shí),有時(shí)將其轉(zhuǎn)換成關(guān)系表數(shù)據(jù),和其他數(shù)據(jù)表進(jìn)行join查詢,出現(xiàn)這種情況,是因?yàn)闆](méi)有遵守關(guān)系數(shù)據(jù)庫(kù)的設(shè)計(jì)范式,沒(méi)有把字符串拆分成原子項(xiàng)存儲(chǔ),也有可能是數(shù)據(jù)傳參數(shù);有時(shí)會(huì)遇到相反的情況,需要將關(guān)系表的相關(guān)數(shù)據(jù)拼接成一個(gè)字符串顯示,或傳參。
把格式化的字符串轉(zhuǎn)化成關(guān)系格式,基本思路分為兩種:
利用TSQL的循環(huán)語(yǔ)句:每一次循環(huán)都插入到關(guān)系表變量或臨時(shí)表中,這種思路是面向過(guò)程的編程;
使用XML查詢:先把字符串轉(zhuǎn)化成XML格式,再利用XML的nodes()函數(shù),把XML數(shù)據(jù)轉(zhuǎn)化成關(guān)系數(shù)據(jù);這種思路是面向集合的編程,建議采用XML查詢實(shí)現(xiàn);
把關(guān)系格式轉(zhuǎn)化成字符串,基本思路分為兩種:
利用TSQL的游標(biāo),對(duì)字符串執(zhí)行累加連接,這種思路是面向過(guò)程的編程;
利用XML查詢的for xml path子句,把關(guān)系格式轉(zhuǎn)化成字符串;這種思路是面向集合的編程,建議采用XML查詢實(shí)現(xiàn);
一,將字符串轉(zhuǎn)換成表
先把字符串轉(zhuǎn)換成XML格式,再利用XML的nodes()函數(shù),把XML數(shù)據(jù)轉(zhuǎn)化成關(guān)系數(shù)據(jù),這種實(shí)現(xiàn)方式性能快,代碼簡(jiǎn)潔,
declare @separator varchar(10)declare @str varchar(max) set @separator=','set @str='54,57,55,56,59'
1,把字符串轉(zhuǎn)化成節(jié)點(diǎn)值
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,把字符串轉(zhuǎn)化成節(jié)點(diǎn)屬性
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'