簡體   English   中英

如何將大量列數據插入到臨時表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM