server
在维护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<)
--开始导入
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语句所以写了这样的存储过程,如果大家有好的更简单的办法请给我留言或来信:。