Как разделить запятую строку в SQL Server на N-количество столбцов - PullRequest
0 голосов
/ 04 мая 2018
  1. У меня есть таблица tb1 с одним столбцом OppName как: (8 значений в строка с csv)

    ["OpportunityName","Fact","","","StartDate","EndDate","IsActive","UpdateDate"]
    

    Я пытаюсь разделить значения, разделенные запятыми, на отдельные столбец как:

          c1              c2      c3 c4 c5 c6 c7          c8
    "OpportunityName"   "Fact"    .........            "UpdateDate"
    

    То, что я сделал, это:

    Шаг 1: удалено [] из строки как:

       UPDATE tb1 
       SET [OppName] = REPLACE(REPLACE([OppName], '[', ''), ']', '')
    
    # output: "OpportunityName","Fact","","","StartDate","EndDate","IsActive","UpdateDate"
    

    Шаг 2: разбить строку на переменные и вставить все переменные в tb2 для каждой строки:

    DECLARE @list varchar(8000)
    DECLARE @pos INT
    DECLARE @len INT
    DECLARE @value varchar(8000)
    DECLARE @x nvarchar(max)
    
    SET @list = '"OpportunityName","Fact","","","StartDate","EndDate","IsActive","UpdateDate",'
    
    set @pos = 0
    set @len = 0
    
    WHILE CHARINDEX(',', @list, @pos+1)>0
    BEGIN
        set @len = CHARINDEX(',', @list, @pos+1) - @pos
        set @value = SUBSTRING(@list, @pos, @len)
        set @value = REPLACE (@value, '"', '')       
        PRINT @value -- for debug porpose  
        set @pos = CHARINDEX(',', @list, @pos+@len) +1
        --Append values to x
        set @x =  (@x  +','+ @value) 
    END
    
      PRINT @x
       --Inserting in tb2
      Insert into  tb2 values(@x)
    

    Но строка неправильно соединена

    Может кто-нибудь помочь мне здесь

1 Ответ

0 голосов
/ 04 мая 2018

SQL 2016 имеет функцию STRING_SPLIT. В сочетании с PIVOT вы можете сделать следующее:

;WITH CTE AS (
    SELECT value, ColumnName = 'c' + CAST(ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS VARCHAR)
    FROM STRING_SPLIT('"OpportunityName","Fact","","","StartDate","EndDate","IsActive","UpdateDate"',',')
)
SELECT * 
FROM CTE
pivot (MAX(value) FOR ColumnName IN("c1","c2","c3","c4","c5","c6","c7","c8")) AS p;

enter image description here

...