歷史數據遷移、測試數據生產或時區統一調整時,常需將庫中所有表的 datetime 類型欄位整體偏移(如加 10 年)。手寫每張表的 UPDATE 不現實,需動態遍歷元數據生成執行腳本。
DECLARE @tablename NVARCHAR(80), @column NVARCHAR(80), @sql NVARCHAR(400);
DECLARE c1 CURSOR SCROLL FOR
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE = 'datetime';
OPEN c1;
FETCH FIRST FROM c1 INTO @tablename, @column;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'UPDATE ' + @tablename +
' SET ' + @column + ' = DATEADD(yy, 10, ' + @column + ')' +
' WHERE ' + @column + ' IS NOT NULL';
EXEC (@sql);
FETCH NEXT FROM c1 INTO @tablename, @column;
END
CLOSE c1;
DEALLOCATE c1;
INFORMATION_SCHEMA.COLUMNS 是 ANSI 標準視圖,跨版本兼容性好。FETCH FIRST/NEXT,代替傳統 FETCH NEXT 循環,邏輯更清晰。EXEC (@sql) 執行拼接字符串,實現表名、列名參數化。yy 代表年,10 為增量,可根據需求改為 mm、dd、hh 等。WHERE column IS NOT NULL 避免對 NULL 值操作產生邏輯錯誤或性能浪費。SET ROWCOUNT 5000 分批處理,或使用 TOP (5000) 子句。可將上述邏輯封裝為存儲過程 sp_BatchUpdateDateTime @YearOffset INT,參數化偏移量,便於調度任務調用。