在 SQL 服务器中将逗号分隔的值转换为单独的行



我对表格的设计方式没有发言权。我知道这不是一个好的做法,我只是想按照给定的要求完成我的工作。

有没有办法在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,非法限定名称字符

最新更新