在維護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>[email protected]) and (@tablename<[email protected])
--開始導入
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語句所以寫了這樣的存儲過程,如果大家有好的更簡單的辦法請給我留言或來信:[email protected]。
,歡迎訪問網頁設計愛好者web開發。新聞熱點
疑難解答