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