How to insert bulk of column data to temp table?

烈酒焚心 提交于 2019-12-13 02:58:45

问题


I need to insert 13 columns of data in a row, and the data is stored in a single variable and every part of data is separated by comma.

declare @cldt varchar(max)="SINDA,--,--,--,--,--,--,--,--,30.00,--,--,--";

I have the following temp table

declare @TempTab table (
    idx int identity(1,1),
    Component varchar(200),
    Month1 varchar(max), 
    Month2 varchar(max),
    Month3 varchar(max),
    Month4 varchar(max),
    Month5 varchar(max),
    Month6 varchar(max),
    Month7 varchar(max),
    Month8 varchar(max),
    Month9 varchar(max),
    Month10 varchar(max),
    Month11 varchar(max),
    Month12 varchar(max)
);

How can I insert the above value into this temp table?

I had try the below code but no use:

insert into @TempTab select @cldt

回答1:


You are trying to put a single value into multiple fields so I'm afraid that's not going to work.

You will need to split the value in your @cldt variable first before you can do that.

The below script should do what you want although there are better (faster) solutions out there. I've added comments so you can run through it and understand what is happening so you can modify as necessary.

/* What's our values */
declare 
        @cldt varchar(max)='SINDA,--,--,--,--,--,--,--,--,30.00,--,--,--'
    ,   @delimiter  CHAR(1) = ',';

/* Add final delimiter to get last value */
SET @cldt = @cldt + ',';

    declare @TempTab table 
(
    idx int identity(1,1)
    ,Component varchar(200)
    ,Month1 varchar(max)
    , Month2 varchar(max)
    ,Month3 varchar(max)
    ,Month4 varchar(max)
    ,Month5 varchar(max)
    ,Month6 varchar(max)
    ,Month7 varchar(max)
    ,Month8 varchar(max)
    ,Month9 varchar(max)
    ,Month10 varchar(max)
    ,Month11 varchar(max)
    ,Month12 varchar(max)
);

/* Need a holding table in the meantime */
declare @TempTab_holding table 
(
        [id]                INT 
    ,   [original_text]     VARCHAR(100)
    ,   [remaining_text]    VARCHAR(100)
    ,   [values]            VARCHAR(100)
);

/* Split the string out */
WITH
    delimiting_cte
(
    ID,
    original_text,
    remaining_text,
    delimited_text
)
AS
(
    -- Anchor stmt : 
    SELECT
        CAST( 1 as SMALLINT ),
        @cldt,
        RIGHT( @cldt, ( LEN( @cldt ) - CHARINDEX( @delimiter, @cldt ) ) ),  --  remaining_text
        SUBSTRING( @cldt, 1, CHARINDEX( @delimiter, @cldt ) - 1 )                       --  delimited_text

    UNION ALL

    -- Recursive stmt :
    -- Recursive CTE to iteratively remove each delimited value & put in own row...
    SELECT
        CAST( c.ID + 1 as SMALLINT ),
        c.original_text,
        RIGHT( c.remaining_text, ( LEN( remaining_text ) - CHARINDEX( @delimiter, c.remaining_text ) ) ),   --  remaining_text
        SUBSTRING( c.remaining_text, 0, CHARINDEX( @delimiter, c.remaining_text )  )                        --  delimited_text
    FROM delimiting_cte as [c]
    WHERE
        -- Until no delimiter left in the [remaining_text] column...
        remaining_text like '%['+@delimiter+']%'
)
INSERT INTO @TempTab_holding
SELECT
    ID,
    original_text,
    remaining_text,
    delimited_text
FROM delimiting_cte as [c];

/* Finally populate the values */
INSERT INTO @TempTab
(Component, Month1, Month2, Month3, Month4, Month5, Month6, Month7, Month8, Month9, Month10, Month11, Month12 )
SELECT [Component] = (SELECT [values] FROM @TempTab_holding WHERE [id] = 1)
    , [Month1] = (SELECT [values] FROM @TempTab_holding WHERE [id] = 2)
    , [Month2] = (SELECT [values] FROM @TempTab_holding WHERE [id] = 3)
    , [Month3] = (SELECT [values] FROM @TempTab_holding WHERE [id] = 4)
    , [Month4] = (SELECT [values] FROM @TempTab_holding WHERE [id] = 5)
    , [Month5] = (SELECT [values] FROM @TempTab_holding WHERE [id] = 6)
    , [Month6] = (SELECT [values] FROM @TempTab_holding WHERE [id] = 7)
    , [Month7] = (SELECT [values] FROM @TempTab_holding WHERE [id] = 8)
    , [Month8] = (SELECT [values] FROM @TempTab_holding WHERE [id] = 9)
    , [Month9] = (SELECT [values] FROM @TempTab_holding WHERE [id] = 10)
    , [Month10] = (SELECT [values] FROM @TempTab_holding WHERE [id] = 11)
    , [Month11] = (SELECT [values] FROM @TempTab_holding WHERE [id] = 12)
    , [Month12] = (SELECT [values] FROM @TempTab_holding WHERE [id] = 13);

SELECT * FROM @TempTab;



回答2:


DECLARE @xml xml

SELECT @xml = ('<r>' + REPLACE(@cldt,',','</r><r>') + '</r>')

INSERT INTO @TempTab 
SELECT  t.v.value('r[1]', 'varchar(10)') as Component, 
        t.v.value('r[2]', 'varchar(10)') as Month1,
        t.v.value('r[3]', 'varchar(10)') as Month2,
        t.v.value('r[4]', 'varchar(10)') as Month3,
        t.v.value('r[5]', 'varchar(10)') as Month4,
        t.v.value('r[6]', 'varchar(10)') as Month5,
        t.v.value('r[7]', 'varchar(10)') as Month6,
        t.v.value('r[8]', 'varchar(10)') as Month7,
        t.v.value('r[9]', 'varchar(10)') as Month8,
        t.v.value('r[10]', 'varchar(10)') as Month9,
        t.v.value('r[11]', 'varchar(10)') as Month10,
        t.v.value('r[12]', 'varchar(10)') as Month11,
        t.v.value('r[3]', 'varchar(10)') as Month12
FROM @xml.nodes('/') as t(v)

SELECT *
FROM @TempTab 

Output:

idx Component   Month1  Month2  Month3  Month4  Month5  Month6  Month7  Month8  Month9  Month10 Month11 Month12
1   SINDA       --      --      --      --      --      --      --      --      30.00   --      --      --


来源:https://stackoverflow.com/questions/36570648/how-to-insert-bulk-of-column-data-to-temp-table

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!