SQL Server中合并用戶日志表的方法
在維護(hù)SQL Server數(shù)據(jù)庫的過程中,大家是不是經(jīng)常會(huì)遇到成千上萬的類似log20050901 這種日志表,每一個(gè)表中數(shù)據(jù)都不是很多,一個(gè)一個(gè)打開看非常不方便,或者有時(shí)候我們需要把這些表中的資料匯總,一個(gè)一個(gè)打開操作也是很麻煩。下面就介紹了一種自動(dòng)化的合并表的方法。
我的思路是創(chuàng)建一個(gè)用戶存儲(chǔ)過程來完成一系列自動(dòng)化的操作,以下是代碼。
--存儲(chǔ)過程我命名為BackupData,可以使用自己定義的名稱。
--參數(shù)1:@TableTarget 生成的目標(biāo)表的名稱
--參數(shù)2:@TableStart 合并開始的表名
--參數(shù)3:@TableEnd 合并結(jié)束的表名
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
--判斷目標(biāo)表是否存在
SET @IsTargetExist=(SELECT count(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES where table_name = @TableTarget)
--如果目標(biāo)表不存在則新建表
IF @istargetexist=0
BEGIN
--EXEC中的語句可以用SQL Server編寫的表腳本替換。注意在目標(biāo)表中不能夠存在與需合并表中名稱一樣的“自動(dòng)編號(hào)”類型的字段。
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)
--以下兩行根據(jù)日志表的名稱更改
--取日志表名的前3位作為標(biāo)識(shí)
SELECT @TablePref = LEFT(@TableName,3)
--判斷表名是否附合要求
IF (@TablePref='log') and (@TableName>=@TableStart) and (@TableName<=@TableEnd)
--開始導(dǎo)入
BEGIN
EXEC ('INSERT INTO ' + @TableTarget + ' SELECT * FROM ' + @TableName )
PRINT '表' + @TableName + '已導(dǎo)入' + @TableTarget + '中'
END
END
FETCH NEXT FROM tnames_cursor INTO @TableName
END
--釋放內(nèi)存
CLOSE tnames_cursor
DEALLOCATE tnames_cursor
把上面代碼在SQL查詢分析器中運(yùn)行即生成存儲(chǔ)過程BackupData。
BackupData的使用方法如下:
EXEC BackupData ‘合并后表名’,’開始表名’,’結(jié)束表名’,例如:
EXEC BackupData ‘_logs200508’,’log200508000000’,’log200508319999’。
因?yàn)槲覜]有找到可以實(shí)現(xiàn)這種操作的SQL語句所以寫了這樣的存儲(chǔ)過程,如果大家有好的更簡(jiǎn)單的辦法請(qǐng)給我留言或來信:[email protected]。
