Reputation: 688
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
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
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