大量類似log20050901、log20050902...的日志表,單表資料不多,逐一查詢/匯總極不便。需自動合併至單一目標表。
CREATE PROCEDURE BackupData
@TableTarget SYSNAME, -- 目標合併表名
@TableStart SYSNAME, -- 起始表名(含)
@TableEnd SYSNAME -- 結束表名(含)
AS
BEGIN
DECLARE tnames_cursor CURSOR FOR
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
OPEN tnames_cursor
DECLARE @TableName SYSNAME, @TablePref SYSNAME, @IsTargetExist INT
SELECT @IsTargetExist = COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_name = @TableTarget
-- 目標表不存在則建立(結構需與來源表一致,避免Identity衝突)
IF @IsTargetExist = 0
EXEC ('CREATE TABLE [dbo].[' + @TableTarget + '] ( ... 來源表結構定義 ... )')
FETCH NEXT FROM tnames_cursor INTO @TableName
WHILE @@FETCH_STATUS <> -1
BEGIN
IF @@FETCH_STATUS <> -2
BEGIN
SET @TableName = RTRIM(@TableName)
SET @TablePref = LEFT(@TableName, 3) -- 假設前3字元為前綴,如'log'
-- 篩選符合前綴且在區間內的表
IF (@TablePref = 'log') AND (@TableName >= @TableStart) AND (@TableName <= @TableEnd)
BEGIN
-- 動態INSERT SELECT合併
EXEC ('INSERT INTO [' + @TableTarget + '] SELECT * FROM [' + @TableName + ']')
-- 可選:合併後刪除來源表
-- EXEC ('DROP TABLE [' + @TableName + ']')
END
END
FETCH NEXT FROM tnames_cursor INTO @TableName
END
CLOSE tnames_cursor; DEALLOCATE tnames_cursor
END
INFORMATION_SCHEMA.TABLES獲取表清單(標準、跨版本相容)。EXEC ('...'))實現表名參數化。@SchemaName支援多Schema、加入WHERE條件過濾資料、記錄合併日志。SQL 2005+可用分區表(Partitioned Table)原生管理歷史資料,避免手工合併;或用檢視表UNION ALL提供邏輯整合視圖,物理保持分表。