从SQL Server表中的连字符串列中提取第1个第2个第3个值到第n个值

时间:2017-10-01 17:26:22

标签: sql sql-server tsql sql-server-2008 split

表的值为12-43-5765-234-56-24-6456-234-678-9-0-0,带连字符

我需要将第一个值作为单独的列,将第二个值作为单独的列,依此类推。

我试过这样。

DECLARE @S VARCHAR(MAX);
SET @S = '12-43-5765-234-56-24-6456-234-678-9-0-0'

SELECT SUBSTRING(@S, 0, CHARINDEX('-', @S)) AS first

以上查询仅选择第一个值,但如何从字符串中提取第4个和第5个值?喜欢

12 as first,
43 as second,
5765 as third,
234 as fourth,
56 as fifth,
24 as sixth and so on..

1 个答案:

答案 0 :(得分:2)

如果你有最多(或已知)的职位数, DON' T 想要动态

示例

DECLARE @S VARCHAR(MAX);
SET @S='12-43-5765-234-56-24-6456-234-678-9-0-0'


Select Pos1 = xDim.value('/x[1]','varchar(max)') --could change to desired datatype (int ?)
      ,Pos2 = xDim.value('/x[2]','varchar(max)') 
      ,Pos3 = xDim.value('/x[3]','varchar(max)')
      ,Pos4 = xDim.value('/x[4]','varchar(max)')
      ,Pos5 = xDim.value('/x[5]','varchar(max)')
      ,Pos6 = xDim.value('/x[6]','varchar(max)')
      ,Pos7 = xDim.value('/x[7]','varchar(max)')
      ,Pos8 = xDim.value('/x[8]','varchar(max)')
      ,Pos9 = xDim.value('/x[9]','varchar(max)')
      ,Pos10= xDim.value('/x[10]','varchar(max)')
      ,Pos11= xDim.value('/x[11]','varchar(max)')
      ,Pos12= xDim.value('/x[12]','varchar(max)')
      ,Pos13= xDim.value('/x[13]','varchar(max)')
 From  (Select Cast('<x>' + replace(@S,'-','</x><x>')+'</x>' as xml) as xDim) as A 

<强>返回

enter image description here