一段用于在SQL Server间在线复制表数据的查询代码
上一篇 / 下一篇 2008-06-23 15:30:42 / 个人分类:其它
/*
3G+S;W Tz/S d0 这个没多少用处,只是偶然的工作需要而写的。
CF1cxo.v2d,R0 从其他服务器复制相同的数据:要求源数据库的表结构和目的数据库的表结构要相同ITPUB个人空间Z@6I qW0D
一、先从源数据库服务器导出脚本,在本地建立一个空的数据库
Wu*?w%j.W&g0 二、在本地建立链接服务器到源数据库服务器
Wmv aUO4l1O"o0 三、设置运行参数
Z qo#d8L0 @source_db 源数据库,格式为:链接服务器.源数据库.dbo.
(l6Z E*b~.~V0 @dest_db 目标数据库,只需数据库名称
6O-sh |-^3PNV1[&c0 @ingore_tbs 要忽略的表清单,位于此处的表将被忽略,格式为:表名,表名,……ITPUB个人空间$d}:W4j XDd
@append_mod 1 从源数据库添加数据 0 用源数据库表的数据覆盖本地表
~L#p:R|-xI8F,E0 @copy_ident 1 复制标识字段的值 0 不复制标识字段 (identity字段)ITPUB个人空间Xr*jn%@.Wl!d,[
四、运行代码ITPUB个人空间9{;}8Y1j3y.[+V AE
五、注意事项ITPUB个人空间0B}SyqRoF
如果设置@append_mod为1,且本地表存在主键重复,将导致该表复制失败
,] k`n t(|&S \0*/ITPUB个人空间#du~A;Z3O W
.Q|.gd n0DECLARE @source_db VARCHAR(50),ITPUB个人空间 ezP-y:l _3dSwq1A ~
@dest_db VARCHAR(50),
1VL[v:H*N|0 @ingore_tbs VARCHAR(1000),
4L$dKf7G2vJ.i TN0 @drop_table bit,
.I$p)J1dt*xd0 @append_mod bit,
*y%H+WRnT0^@0 @copy_ident bit,
jFPPjE7TbE0 @table_name VARCHAR(200),
4M7xh`P?0 @col_name sysname,ITPUB个人空间-iT z x_e
@col_ident bit,
-A*e-B9T;h?*p*E1|ll(Ct0 @col_type sysname,ITPUB个人空间Qi:c1QRb
@col_list VARCHAR(1000),ITPUB个人空间xnBX/C
@sql VARCHAR(2000)ITPUB个人空间ZBOW:R N
p@F5rdo0SET @source_db = 'SQLS.TestDB.dbo.'ITPUB个人空间*N0x#bD7p
SET @dest_db = 'TestDB'
.L ~p!ZN0SET @ingore_tbs = 'xdk,'ITPUB个人空间"UK@ k@;Q~
SET @drop_table = 0
+r5p0L%yQ4b;|!\D/@0SET @append_mod = 0ITPUB个人空间5o5^3sZ%p7H Z
SET @copy_ident = 1ITPUB个人空间uB?0YL,J
ITPUB个人空间"l`/m6['w"E
--检查现数据库与目标数据库是否相同,为了安全性考虑,不自动更改当前数据库
#Ft9C;s&\g7b tX0 IF (db_name() <> @dest_db)ITPUB个人空间?1F4p9GB/Asa
BEGIN
h/tV(ME(H{0 PRINT '当前数据库与目标数据库不相符,请更改当前数据库。'ITPUB个人空间dfN_M-y;|
RETURN
S'y]e&a:~/FU0 ENDITPUB个人空间h[ {C-xL.E!\.V'w
ITPUB个人空间N(`h9Mi/D
--遍历所有表名称ITPUB个人空间}_:M H[h`0L`p'b
DECLARE cur_tb CURSOR FOR SELECT name FROM sysobjects WHERE type = 'U'ITPUB个人空间4q@w5aq| s:B
OPEN cur_tbITPUB个人空间\$t%B M$n9O
FETCH NEXT FROM cur_tb INTO @table_name
FCkqm3R#aG)px5w0WHILE @@FETCH_STATUS = 0
eW0E*o8`0BEGIN
*lfO`T4]-q0--如果处于忽略列表,则跳到下一个表
y&~7h}2k/\_Z0 IF CHARINDEX(@table_name+',', @ingore_tbs) > 0ITPUB个人空间(M S~!P?9e%W]'c!Gi
GOTO NEXT_TABLEITPUB个人空间0JcN7gU/a%F3m
ITPUB个人空间b8w$k$WXa3{yh)u
--如果源数据库不存在这个表,跳到下一个表ITPUB个人空间ELMj'rs
EXEC ('SELECT name INTO #tmp FROM ' + @source_db + 'sysobjects WHERE name = ''' + @table_name + '''')ITPUB个人空间5V-B.ys8f7o
IF @@ROWCOUNT = 0
Cb9Jd B-Nk0 GOTO NEXT_TABLE
)w7c)C4K'p&dA0
1I%d8Tud:ov)]0--拷贝数据
y2]7V;gO%v9K{+x0u`5w0 --判断清除数据
.WV;@M#y?Y!W0 IF @append_mod = 0 BEGIN
Pj&nZJsf#\6{'ch0 PRINT '删除表内容:' + @table_name
[Z\Kp'k2n[p0 SET @sql = 'DELETE FROM ' + @table_name
3G+S;W Tz/S d0 这个没多少用处,只是偶然的工作需要而写的。
CF1cxo.v2d,R0 从其他服务器复制相同的数据:要求源数据库的表结构和目的数据库的表结构要相同ITPUB个人空间Z@6I qW0D
一、先从源数据库服务器导出脚本,在本地建立一个空的数据库
Wu*?w%j.W&g0 二、在本地建立链接服务器到源数据库服务器
Wmv aUO4l1O"o0 三、设置运行参数
Z qo#d8L0 @source_db 源数据库,格式为:链接服务器.源数据库.dbo.
(l6Z E*b~.~V0 @dest_db 目标数据库,只需数据库名称
6O-sh |-^3PNV1[&c0 @ingore_tbs 要忽略的表清单,位于此处的表将被忽略,格式为:表名,表名,……ITPUB个人空间$d}:W4j XDd
@append_mod 1 从源数据库添加数据 0 用源数据库表的数据覆盖本地表
~L#p:R|-xI8F,E0 @copy_ident 1 复制标识字段的值 0 不复制标识字段 (identity字段)ITPUB个人空间Xr*jn%@.Wl!d,[
四、运行代码ITPUB个人空间9{;}8Y1j3y.[+V AE
五、注意事项ITPUB个人空间0B}SyqRoF
如果设置@append_mod为1,且本地表存在主键重复,将导致该表复制失败
,] k`n t(|&S \0*/ITPUB个人空间#du~A;Z3O W
.Q|.gd n0DECLARE @source_db VARCHAR(50),ITPUB个人空间 ezP-y:l _3dSwq1A ~
@dest_db VARCHAR(50),
1VL[v:H*N|0 @ingore_tbs VARCHAR(1000),
4L$dKf7G2vJ.i TN0 @drop_table bit,
.I$p)J1dt*xd0 @append_mod bit,
*y%H+WRnT0^@0 @copy_ident bit,
jFPPjE7TbE0 @table_name VARCHAR(200),
4M7xh`P?0 @col_name sysname,ITPUB个人空间-iT z x_e
@col_ident bit,
-A*e-B9T;h?*p*E1|ll(Ct0 @col_type sysname,ITPUB个人空间Qi:c1QRb
@col_list VARCHAR(1000),ITPUB个人空间xnBX/C
@sql VARCHAR(2000)ITPUB个人空间ZBOW:R N
p@F5rdo0SET @source_db = 'SQLS.TestDB.dbo.'ITPUB个人空间*N0x#bD7p
SET @dest_db = 'TestDB'
.L ~p!ZN0SET @ingore_tbs = 'xdk,'ITPUB个人空间"UK@ k@;Q~
SET @drop_table = 0
+r5p0L%yQ4b;|!\D/@0SET @append_mod = 0ITPUB个人空间5o5^3sZ%p7H Z
SET @copy_ident = 1ITPUB个人空间uB?0YL,J
ITPUB个人空间"l`/m6['w"E
--检查现数据库与目标数据库是否相同,为了安全性考虑,不自动更改当前数据库
#Ft9C;s&\g7b tX0 IF (db_name() <> @dest_db)ITPUB个人空间?1F4p9GB/Asa
BEGIN
h/tV(ME(H{0 PRINT '当前数据库与目标数据库不相符,请更改当前数据库。'ITPUB个人空间dfN_M-y;|
RETURN
S'y]e&a:~/FU0 ENDITPUB个人空间h[ {C-xL.E!\.V'w
ITPUB个人空间N(`h9Mi/D
--遍历所有表名称ITPUB个人空间}_:M H[h`0L`p'b
DECLARE cur_tb CURSOR FOR SELECT name FROM sysobjects WHERE type = 'U'ITPUB个人空间4q@w5aq| s:B
OPEN cur_tbITPUB个人空间\$t%B M$n9O
FETCH NEXT FROM cur_tb INTO @table_name
FCkqm3R#aG)px5w0WHILE @@FETCH_STATUS = 0
eW0E*o8`0BEGIN
*lfO`T4]-q0--如果处于忽略列表,则跳到下一个表
y&~7h}2k/\_Z0 IF CHARINDEX(@table_name+',', @ingore_tbs) > 0ITPUB个人空间(M S~!P?9e%W]'c!Gi
GOTO NEXT_TABLEITPUB个人空间0JcN7gU/a%F3m
ITPUB个人空间b8w$k$WXa3{yh)u
--如果源数据库不存在这个表,跳到下一个表ITPUB个人空间ELMj'rs
EXEC ('SELECT name INTO #tmp FROM ' + @source_db + 'sysobjects WHERE name = ''' + @table_name + '''')ITPUB个人空间5V-B.ys8f7o
IF @@ROWCOUNT = 0
Cb9Jd B-Nk0 GOTO NEXT_TABLE
)w7c)C4K'p&dA0
1I%d8Tud:ov)]0--拷贝数据
y2]7V;gO%v9K{+x0u`5w0 --判断清除数据
.WV;@M#y?Y!W0 IF @append_mod = 0 BEGIN
Pj&nZJsf#\6{'ch0 PRINT '删除表内容:' + @table_name
[Z\Kp'k2n[p0 SET @sql = 'DELETE FROM ' + @table_name