投稿日には注意が必要です。いずれにしても、動的SQLを使用して更新ステートメントを作成するソリューションがあります。それは、とにかくから、何かを構築する何かを与える必要があります。
途中で結果を検証するためのコードがいくつか追加されていますが、重要ではないコードを明らかにする方法でコメントを作成しようとしました。
CREATE TABLE
dbo.Dummy
(
[ID] int ,
[Name] varchar(30),
[Address] varchar(40) null,
[City] varchar(30) NULL,
[State] varchar(2) NULL,
[Active] tinyint NULL,
[Email] varchar(30) NULL,
[Date] date NULL
);
--
INSERT dbo.Dummy
VALUES
(
1, 'Acme1', NULL, NULL, NULL, NULL, '[email protected]', '3/1/2011'
)
,
(
2, 'Acme1', '1234 Abc Rd', 'Springfield', 'OR', 0, '[email protected]', '1/12/2012'
)
,
(
3, 'Acme2', NULL, NULL, NULL, 1, '[email protected]', '4/19/2012'
);
DECLARE
@TableName nvarchar(128) = 'Dummy',
@TemplateID int = 1,
@SetStmtList nvarchar(max) = '',
@LoopCounter int = 0,
@ColumnCount int = 0,
@SQL nvarchar(max) = ''
;
--
--Create a table to hold the column names
DECLARE
@ColumnList table
(
ColumnID tinyint IDENTITY,
ColumnName nvarchar(128)
);
--
--Get the column names
INSERT @ColumnList
(
ColumnName
)
SELECT
c.name
FROM
sys.columns AS c
JOIN
sys.tables AS t
ON
t.object_id = c.object_id
WHERE
t.name = @TableName;
--
--Create loop boundaries to build out the SQL statement
SELECT
@ColumnCount = MAX(l.ColumnID),
@LoopCounter = MIN (l.ColumnID)
FROM
@ColumnList AS l;
--
--Loop over the column names
WHILE @LoopCounter <= @ColumnCount
BEGIN
--Dynamically construct SET statements for each column except ID (See the WHERE clause)
SELECT
@SetStmtList = @SetStmtList + ',' + l.ColumnName + ' =COALESCE(' + l.ColumnName + ', (SELECT TOP 1 ' + l.ColumnName + ' FROM ' + @TableName + ' WHERE ' + l.ColumnName + ' IS NOT NULL AND ID <> ' + CAST(@TemplateID AS NVARCHAR(MAX)) + ' ORDER BY Date DESC)) '
FROM
@ColumnList AS l
WHERE
l.ColumnID = @LoopCounter
AND
l.ColumnName <> 'ID';
--
SELECT
@LoopCounter = @LoopCounter + 1;
--
END;
--TESTING - Validate the initial table values
SELECT * FROM dbo.Dummy ;
--
--Get rid of the leading common in the SetStmtList
SET @SetStmtList = SUBSTRING(@SetStmtList, 2, LEN(@SetStmtList) - 1);
--Build out the rest of the UPDATE statement
SET @SQL = 'UPDATE ' + @TableName + ' SET ' + @SetStmtList + ' WHERE ID = ' + CAST(@TemplateID AS NVARCHAR(MAX))
--Then execute the update
EXEC sys.sp_executesql
@SQL;
--
--TESTING - Validate the updated table values
SELECT * FROM dbo.Dummy ;
--
--Build out the DELETE statement
SET @SQL = 'DELETE FROM ' + @TableName + ' WHERE ID <> ' + CAST(@TemplateID AS NVARCHAR(MAX))
--Execute the DELETE
EXEC sys.sp_executesql
@SQL;
--
--TESTING - Validate the final table values
SELECT * FROM dbo.Dummy;
--
DROP TABLE dbo.Dummy;
また、電子メールは[email protected]でもかまいませんか、Acme2はマージの範囲外であると考えていますか? –
データグループの識別方法は?私はあなたがデータのdoubletsをマージしたいと思います。どのようにして、テーブル内の何千ものレコードのデータグループを特定していますか?あなたがそれを知っているなら、あなたはこれを行うストアドプロシージャを書くことができます。必要に応じてサンプルSPを回答として書くことができます – YvesR
こんにちはRussell Fox、いいえ、電子メールは[email protected]のままでなければなりません。すでにID1のNULL値列だけが修正される必要があります。 – noahC