Merbin Joe
Merbin Joe

Reputation: 688

How to insert bulk of column data to temp table?

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

Upvotes: 1

Views: 348

Answers (2)

gofr1
gofr1

Reputation: 15997

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   --      --      --

Upvotes: 2

Shaneis
Shaneis

Reputation: 1085

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;

Upvotes: 2

Related Questions