将逗号分隔值转换为sql server中的单独行

时间:2015-04-10 17:56:10

标签: sql sql-server

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

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

2 个答案:

答案 0 :(得分:1)

您所做的工作,只需仔细查看您的值字符串和输出。逗号和数字之间有空格。

只需将LTRIM()放在那里

LTRIM(Split.A.value('.', 'VARCHAR(100)')) AS String

Split Functions

答案 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,非法的合格名称字符