How to convert comma separated NVARCHAR to table records in SQL Server 2005?

前端 未结 7 1209
走了就别回头了
走了就别回头了 2020-11-27 06:18

I have a list of ids separated by comma like:

 1,17,25,44,46,67,88

I want to convert them to a table records ( into a temporary table ) lik

相关标签:
7条回答
  • 2020-11-27 06:47

    Completing the answers, you could also use the CSV string to store multiple values in multiple columns:

     --input sql text 
    declare @text_IN varchar(max) ='text1, text1.2, text1.3, 1, 2010-01-01\r\n text2, text2.2, text2.3, 2, 2016-01-01'
    

    Split the csv file into rows:

    declare @temptable table (csvRow varchar(max))    
    declare @DelimiterInit varchar(4) = '\r\n'
    declare @Delimiter varchar(1) = '|'
    declare @idx int       
    declare @slice varchar(max)    
    
    set @text_IN = REPLACE(@text_IN,@DelimiterInit,@Delimiter)
    
    
    select @idx = 1       
        if len(@text_IN)<1 or @text_IN is null  return       
    
    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@text_IN)       
        if @idx!=0       
            set @slice = left(@text_IN,@idx - 1)       
        else       
            set @slice = @text_IN 
    
        if(len(@slice)>0)  
            insert into @temptable(csvRow) values(@slice)       
    
        set @text_IN = right(@text_IN,len(@text_IN) - @idx)       
        if len(@text_IN) = 0 break       
    end   
    

    Split rows into columns:

    ;WITH XMLTable (xmlTag)
    AS
    (
        SELECT CONVERT(XML,'<CSV><champ>' + REPLACE(csvRow,',', '</champ><champ>') + '</champ></CSV>') AS xmlTag
        FROM @temptable
    )
    
     SELECT RTRIM(LTRIM(xmlTag.value('/CSV[1]/champ[1]','varchar(max)'))) AS Column1,    
            RTRIM(LTRIM(xmlTag.value('/CSV[1]/champ[2]','varchar(max)'))) AS Column2,
            RTRIM(LTRIM(xmlTag.value('/CSV[1]/champ[3]','varchar(max)'))) AS Column3,    
            RTRIM(LTRIM(xmlTag.value('/CSV[1]/champ[4]','int'))) AS Column4,
            RTRIM(LTRIM(xmlTag.value('/CSV[1]/champ[5]','datetime'))) AS Column5
     FROM XMLTable
    
    0 讨论(0)
提交回复
热议问题