[英]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. 我需要在一行中插入13列数据,并将数据存储在单个变量中,并且数据的每个部分都用逗号分隔。
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
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. 您需要先在@cldt
变量中拆分值,然后才能执行此操作。
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;
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 -- -- --
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.