SQL Server中合併使用者日誌表的方法

evancss發表於2005-09-12

在維護SQL Server資料庫的過程中,大家是不是經常會遇到成千上萬的類似log20050901 這種日誌表,每一個表中資料都不是很多,一個一個開啟看非常不方便,或者有時候我們需要把這些表中的資料彙總,一個一個開啟操作也是很麻煩。下面就介紹了一種自動化的合併表的方法。

我的思路是建立一個使用者儲存過程來完成一系列自動化的操作,以下是程式碼。

 

--儲存過程我命名為BackupData,可以使用自己定義的名稱。

--引數1:@TableTarget 生成的目標表的名稱

--引數2:@TableStart 合併開始的表名

--引數3:@TableEnd 合併結束的表名

CREATE PROCEDURE BackupData @TableTarget sysname,@TableStart sysname,@TableEnd sysname

AS

DECLARE tnames_cursor CURSOR

FOR

   SELECT TABLE_NAME

   FROM INFORMATION_SCHEMA.TABLES

OPEN tnames_cursor

DECLARE @TableName sysname

DECLARE @TablePref sysname

DECLARE @IsTargetExist integer

--判斷目標表是否存在

SET @IsTargetExist=(SELECT count(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES where table_name = @TableTarget)

--如果目標表不存在則新建表

IF @istargetexist=0

BEGIN

  --EXEC中的語句可以用SQL Server編寫的表指令碼替換。注意在目標表中不能夠存在與需合併表中名稱一樣的“自動編號”型別的欄位。

  EXEC ('CREATE TABLE [dbo].[' + @TableTarget + ']

       (

       [LOG1] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,

       [LOG2] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,

       ……

        )')

END

 

FETCH NEXT FROM tnames_cursor INTO @TableName

WHILE (@@FETCH_STATUS <> -1)

BEGIN

   IF (@@FETCH_STATUS <> -2)

   BEGIN  

      SELECT @TableName = RTRIM(@TableName)

      --以下兩行根據日誌表的名稱更改

      --取日誌表名的前3位作為標識

      SELECT @TablePref = LEFT(@TableName,3)

      --判斷表名是否附合要求

      IF (@TablePref='log') and (@TableName>=@TableStart) and (@TableName<=@TableEnd)

         --開始匯入

         BEGIN

            EXEC ('INSERT INTO ' + @TableTarget + ' SELECT * FROM ' + @TableName )

            PRINT '' + @TableName + '已匯入' + @TableTarget + ''

         END

   END

   FETCH NEXT FROM tnames_cursor INTO @TableName

END

--釋放記憶體

CLOSE tnames_cursor

DEALLOCATE tnames_cursor

 

把上面程式碼在SQL查詢分析器中執行即生成儲存過程BackupData

BackupData的使用方法如下:

EXEC BackupData ‘合併後表名’,’開始表名’,’結束表名,例如:

EXEC BackupData ‘_logs200508’,’log200508000000’,’log200508319999’

 

因為我沒有找到可以實現這種操作的SQL語句所以寫了這樣的儲存過程,如果大家有好的更簡單的辦法請給我留言或來信:pujiang10@gmail.com

相關文章