我对表格的设计方式没有发言权。我知道这不是一个好的做法,我只是想按照给定的要求完成我的工作。
有没有办法在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
你所拥有的确实有效,只需仔细查看你的值字符串和输出。 逗号和数字之间有一个空格。
只需在其中放置一个 LTRIM()
LTRIM(Split.A.value('.', 'VARCHAR(100)')) AS String
拆分函数
此查询返回
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,非法限定名称字符