はい、元のテーブルの制約を考えると、2 番目のテーブルを作成することは合理的な解決策のように思えます
では、1 日目にシャドー テーブルを作成してデータを入力します。
CREATE TABLE Shadow (/* Same columns as original, plus added date, magic value column */)
INSERT INTO Shadow (/* Same columns as original, plus added date, magic value column */)
SELECT /* Columns, plus todays date and the magic value column */ FROM Original
その後、次の日に:
ALTER TABLE Original ADD MagicColumn int null
GO
ALTER TABLE Original ADD AddedDate date null
GO
MERGE INTO Original o
USING Shadow s
ON o.PK1 = s.PK1 and o.PK2 = s.PK2
WHEN MATCHED
THEN UPDATE
SET
AddedDate = s.AddedDate,
MagicColumn = 1 /* Value for updated */
WHEN NOT MATCHED BY SOURCE
THEN UPDATE
SET
AddedDate = CURRENT_TIMESTAMP,
MagicColumn = 0; /* Value for new */
GO
TRUNCATE TABLE Shadow
GO
INSERT INTO Shadow (/* Same columns as original, plus added date, magic value column */)
SELECT /* All columns */ FROM Original
これらのステートメントの一部は、別のバッチに入れる必要があります (たとえば、ステートメントは とは別のバッチに入れるALTER TABLE
必要がありますMERGE
)。そのため、SQL エージェント ジョブでこれを行う場合は、別のステップにする必要があります。
以下を含む列を何と呼ぶべきかわからないため、「魔法の値の列」を参照し続けます。
特定の値 (新しい場合は 1 つ、そうでない場合は別の値)