首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server自動化合併日志表存儲過程:動態游標與動態SQL

     編輯:關於SqlServer

場景

大量類似log20050901、log20050902...的日志表,單表資料不多,逐一查詢/匯總極不便。需自動合併至單一目標表。

存儲過程:BackupData

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獲取表清單(標準、跨版本相容)。
  • 動態SQL(EXEC ('...'))實現表名參數化。
  • 目標表結構需與來源一致,**不可包含同名Identity欄位**(會衝突)。
  • 可擴充:加入@SchemaName支援多Schema、加入WHERE條件過濾資料、記錄合併日志。

替代方案

SQL 2005+可用分區表(Partitioned Table)原生管理歷史資料,避免手工合併;或用檢視表UNION ALL提供邏輯整合視圖,物理保持分表。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved