SQL Query使用分隔符将一个列数据解析为多个列

时间:2016-10-18 22:32:55

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

我需要一个SQL查询,它允许我将一个列拆分成多个列。 例如: 数据集1 =" 10.11.5-None-bobadmin:501 -1-1-87-PASS-11.1.0.9900-true" 将基于" - "分隔列分隔。字符。 数据集将返回以下内容

Col1    Col2    Col3    Col4    Col5    Col6    Col7    Col8    Col9
10.11.5 None    bobadmin:501    1   1   87  PASS    11.1.0.9900 TRUE

非常感谢任何和所有的帮助!

使用SQL Server 2008R2

1 个答案:

答案 0 :(得分:0)

在下面的示例中,我有9个职位,但很容易扩展到您需要的数量

Declare @YourTable table (ID int,DataSet1 varchar(100))
Insert Into @YourTable values
(1,'10.11.5-None-bobadmin:501 -1-1-87-PASS-11.1.0.9900-true'),
(2,'10.11.6-All-JaneAdmin:999 -9-9-99-FAIL-12.2.2.555-false')

Select A.ID
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select Col1 = xDim.value('/x[1]','varchar(max)')
                      ,Col2 = xDim.value('/x[2]','varchar(max)')
                      ,Col3 = xDim.value('/x[3]','varchar(max)')
                      ,Col4 = xDim.value('/x[4]','varchar(max)')
                      ,Col5 = xDim.value('/x[5]','varchar(max)')
                      ,Col6 = xDim.value('/x[6]','varchar(max)')
                      ,Col7 = xDim.value('/x[7]','varchar(max)')
                      ,Col8 = xDim.value('/x[8]','varchar(max)')
                      ,Col9 = xDim.value('/x[9]','varchar(max)')
                 From (Select Cast('<x>' + Replace(A.DataSet1,'-','</x><x>')+'</x>' as XML) as xDim) A
             ) B 

返回

enter image description here

  

修改

或者如果你想要一个UDF

Select * from [dbo].[udf-Str-Parse-Row]('10.11.5-None-bobadmin:501 -1-1-87-PASS-11.1.0.9900-true','-')

返回

enter image description here

UDF(如果需要)

CREATE FUNCTION [dbo].[udf-Str-Parse-Row] (@String varchar(max),@Delimiter varchar(10))
Returns Table 
As
Return (
    Select Pos1 = xDim.value('/x[1]','varchar(max)')
          ,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)')
     From (Select Cast('<x>' + Replace(@String,@Delimiter,'</x><x>')+'</x>' as XML) as xDim) A
)
--Select * from [dbo].[udf-Str-Parse-Row]('Dog,Cat,House,Car',',')