2016-04-12 13 views
1

13列のデータを1行に挿入する必要があり、データは1つの変数に格納され、データの各部分はコンマで区切られます。大量の列データを一時テーブルに挿入するにはどうすればよいですか?

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 

答えて

2

あなたは、私はそれが動作するつもりはないと怖いので、複数のフィールドに単一の値を入れしようとしています。

@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 '%['[email protected]+']%' 
) 
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; 
2
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 --  --  -- 
関連する問題