一段用于在SQL Server间在线复制表数据的查询代码

上一篇 / 下一篇  2008-06-23 15:30:42 / 个人分类:其它

/*
3G+S;W Tz/S d0  这个没多少用处,只是偶然的工作需要而写的。
CF1cxo.v2d,R0  从其他服务器复制相同的数据:要求源数据库的表结构和目的数据库的表结构要相同ITPUB个人空间Z@6IqW0D
  一、先从源数据库服务器导出脚本,在本地建立一个空的数据库
Wu*?w%j.W&g0  二、在本地建立链接服务器到源数据库服务器
WmvaUO4l1O"o0  三、设置运行参数
Z qo#d8L0      @source_db    源数据库,格式为:链接服务器.源数据库.dbo.
(l6Z E*b~.~V0      @dest_db          目标数据库,只需数据库名称
6O-sh|-^3PNV1[&c0      @ingore_tbs       要忽略的表清单,位于此处的表将被忽略,格式为:表名,表名,……ITPUB个人空间$d}:W4j X Dd
      @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 _3dS wq1A ~
        @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:RN

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%y Q4b;|!\D/@0SET @append_mod = 0ITPUB个人空间5o5^3sZ%p7HZ
SET @copy_ident = 1ITPUB个人空间u B?0YL,J
ITPUB个人空间"l`/m6['w"E
--检查现数据库与目标数据库是否相同,为了安全性考虑,不自动更改当前数据库
#Ft9C;s&\g7bt X0  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-x L.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
*lf O`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
C b9Jd B-Nk0    GOTO NEXT_TABLE
)w7c)C4K'p&d A0
1I%d8Tud:ov)]0--拷贝数据
y2]7V;gO%v9K{+x0u`5w0  --判断清除数据
.WV;@M#y?Y!W0  IF @append_mod = 0 BEGIN
Pj&nZJsf#\6{'c h0    PRINT '删除表内容:' + @table_name
[Z\ K p'k2n[p0    SET @sql = 'DELETE FROM ' + @table_name
Hk*d$y7F0    EXEC (@sql)ITPUB个人空间gG C.E-L~V
  ENDITPUB个人空间*JNUgpB
--得到所有字段列表ITPUB个人空间"~/DOXT| b+D
  IF EXISTS (SELECT 1 FROM tempdb.dbo.sysobjects WHERE id = object_id('tempdb.dbo.#cols'))ITPUB个人空间3e};^T$b#a/G%n s
    DROP TABLE #colsITPUB个人空间1MapO1mcqh:i^
  CREATE TABLE #cols([col_name] sysname, col_ident bit, col_type sysname)
(U:F1~F7tCm:n0  SET @sql = 'INSERT INTO #cols SELECT A.name, COLUMNPROPERTY(B.id, A.name, ''IsIdentity''),'ITPUB个人空间!C;P.D-~g6Z3`uz
           + '(SELECT TOP 1 name FROM systypes C WHERE C.xtype = A.xtype) '
;eD,m-i,|[:Q9l0           + 'FROM syscolumns A JOIN sysobjects B ON B.id = A.id '
mn_&a VP h0           + 'WHERE B.name = ''' + @table_name + ''' ORDER BY A.colid'ITPUB个人空间!nf.cRJ^lr4ST
  EXEC (@sql)ITPUB个人空间:AeH)AZWR
--遍历所有字段,得到要复制的字段列表ITPUB个人空间 |#i4cl/L K,O$EI z
  SET @col_list = ''
2Ne H4n K f4o3V0  DECLARE cur_col CURSOR FOR SELECT [col_name], col_ident, col_type FROM #colsITPUB个人空间^CJ4w5y7Y
  OPEN cur_colITPUB个人空间GrJX(F;I[
  FETCH NEXT FROM cur_col INTO @col_name, @col_ident, @col_typeITPUB个人空间w&` g9|$WY?8E
  WHILE @@FETCH_STATUS = 0
QB]WZ0  BEGINITPUB个人空间^p0DO8K}0x
    --timestamp类型的字段不复制
v#u? Q SNR0    IF @col_type <> 'timestamp'ITPUB个人空间%\:mS\$i#K;m
    BEGINITPUB个人空间3tQ I ji5~xS}U
      IF @copy_ident = 1 OR @col_ident = 0ITPUB个人空间i |w0B&\?%?,| a9g
        SET @col_list = @col_list + ',' + @col_nameITPUB个人空间} S/Y-~u-zH
    ENDITPUB个人空间A$N X k O;Zy
    FETCH NEXT FROM cur_col INTO @col_name, @col_ident, @col_typeITPUB个人空间r@m5di5[
  END
.^cz{k0  CLOSE cur_col
a)\%Qb~6A0  DEALLOCATE cur_colITPUB个人空间X dcZ s'\ Tau,h
--如果没有需要复制的字段,继续处理下一个表ITPUB个人空间6d&nI a:Y
  SET @col_list = SUBSTRING(@col_list, 2, 1000)ITPUB个人空间&b0gS&b;F%E8Rb
  IF (@col_list = '') GOTO NEXT_TABLE
M/g'Y*e4mZ0--生成SQL语句,复制数据
_7qA q0? ?.Fg;n0  SET @sql = ''ITPUB个人空间`.C4Er,y)Lq
  IF @copy_ident = 1 AND EXISTS (SELECT 1 FROM #cols WHERE col_ident = 1)ITPUB个人空间9g G&?n'V5PL\
    SET @sql = 'SET IDENTITY_INSERT ' + @table_name + ' ON 'ITPUB个人空间Sw7gX-f(y'{T$?&Jt
  SET @sql = @sql + 'INSERT INTO ' + @table_name + '(' + @col_list + ') 'ITPUB个人空间IozD$AOr
             + 'SELECT ' + @col_list + ' FROM ' + @source_db + @table_name
~r:?#B uma0  PRINT '复制表:' + @table_nameITPUB个人空间*xXfO7H@ q2u
  EXEC (@sql)
0P'onK-q8L'WExo0
-cbsNI)M7P0--得到下一个表名称
} a%Qew0NEXT_TABLE:
{q2a&?t M0  FETCH NEXT FROM cur_tb INTO @table_nameITPUB个人空间"v#^x2m E`$~d
END
,`(c:S:L:h6e A]0V\0CLOSE cur_tbITPUB个人空间lu;N'OYcl
DEALLOCATE cur_tb
B}&P~]%y0
jj:t^2M0

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-08-30  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 1631
  • 日志数: 23
  • 建立时间: 2008-01-17
  • 更新时间: 2008-07-03

RSS订阅

Open Toolbar