[英]How to insert bulk of column data to temp table?
我需要在一行中插入13列數據,並將數據存儲在單個變量中,並且數據的每個部分都用逗號分隔。
declare @cldt varchar(max)="SINDA,--,--,--,--,--,--,--,--,30.00,--,--,--";
我有以下臨時表
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)
);
如何將以上值插入此臨時表?
我嘗試了以下代碼,但沒有用:
insert into @TempTab select @cldt
您正在嘗試將一個值放入多個字段,因此恐怕無法正常工作。
您需要先在@cldt
變量中拆分值,然后才能執行此操作。
盡管有更好( 更快 )的解決方案,但下面的腳本應該可以滿足您的要求。 我添加了評論,以便您可以遍歷它並了解正在發生的事情,以便可以根據需要進行修改。
/* 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
輸出:
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.