我对表的设计方式并没有真正的发言权。我知道这不是一个好习惯,我只是想按照给定的要求完成我的工作。
SQL服务器中是否有转换方式
Name Mar
ABC 03, 08, 09, 23
DEF 10, 26, 29, 35
到
Name Mar
ABC 3
ABC 8
ABC 9
ABC 23
ABC 10
DEF 26
DEF 29
DEF 35
以下是以下脚本:
create table #tmp
(Name varchar(50) , Markets varchar(50));
insert into #tmp
values ('ABC', '03, 08, 09, 23')
insert into #tmp
values ('DEF', '10, 26, 29, 35')
我在网上搜索并提出了这个解决方案。但它为某些字符串创建了额外的空间,而对于某些字符串则没有
SELECT A.[Name],
Split.A.value('.', 'VARCHAR(100)') AS String
FROM (SELECT [Name],
CAST ('<M>' + REPLACE([Markets], ',', '</M><M>') + '</M>' AS XML) AS String
FROM #tmp) AS A CROSS APPLY String.nodes ('/M') AS Split(A);
Name String
ABC 03
ABC 08
ABC 09
ABC 23
DEF 10
DEF 26
DEF 29
DEF 35
答案 0 :(得分:1)
您所做的工作,只需仔细查看您的值字符串和输出。逗号和数字之间有空格。
只需将LTRIM()放在那里
LTRIM(Split.A.value('.', 'VARCHAR(100)')) AS String
答案 1 :(得分:0)
此查询返回
SELECT A.Substance ,
Split.A.value('.', 'VARCHAR(4000)') AS String
FROM (SELECT Substance, ID,
CAST ('<M>' + REPLACE(Substance, ',', '</M><M>') + '</M>' AS XML) AS String
FROM [final_substance]) AS A CROSS APPLY String.nodes ('/M') AS Split(A);
问题
XML解析:第1行,字符20,非法的合格名称字符