資料庫批量更新維護

2022-02-23 16:44:24 字數 2991 閱讀 1151

情況:多台資料庫伺服器,每台伺服器多個資料庫,資料庫結構一致(提供給不同客戶使用)

一、手工操作

1、資料庫少

下拉列表選擇不同資料庫,執行更新指令碼sql.資料庫少,操作感覺不到麻煩。

2、資料庫多

下拉列表選擇不同資料庫,操作麻煩,容易遺漏更新資料庫。

sql server management studio這個下拉列表,還不支援拉大縮小,資料庫多了去選擇不同資料庫相當夠嗆。

二、半自動

思路:先更新乙個資料庫(newnew),比如更新了儲存過程addsaleorder和deletesaleorder, 和執行一段sql(delete from dbo.systemconfig where configname='a'),然後通過sql參照這個資料庫更新同台伺服器的其他資料庫。

use [newnew]

declare @name sysname

declare userdb cursor for select name from master.dbo.sysdatabases where sid <> 0x01

open userdb

fetch next from userdb into @name

while (@@fetch_status = 0)

begin

exec('use [' + @name + '] if (exists(select 1 from dbo.sysobjects o where o.name = ''customer'' and o.xtype = ''u'')) begin print ''' + @name + ''' end')

fetch next from userdb into @name

endclose userdb

deallocate userdb

假如輸出:

db1db2

db3獲取一台伺服器上的所有自定義資料庫,select name from master.dbo.sysdatabases where sid <> 0x01

通過游標再次再次過濾需要的自定義資料庫(乙個特殊的物件,比如:customer表)

生成批量更新資料庫的指令碼:

use [newnew]

declare @objectid int

declare @objectname sysname

declare @objecttype char(2)

declare @text varchar(max)

declare @dbname sysname

declare getname cursor scroll for select name from master.dbo.sysdatabases where sid <> 0x01 and name in ('db1' ,'db2' ,'db3')

open getname

declare getobj cursor for select o.id, o.[name], o.xtype from dbo.sysobjects o where o.name in ('addsaleorder' ,'deletesaleorder') and o.xtype in ('p', 'fn', 'v')

open getobj

fetch next from  getobj into @objectid, @objectname, @objecttype

while (@@fetch_status = 0)

begin

set @text = ''

select @text = @text + s.[text] from dbo.syscomments s where s.id = @objectid

fetch first from getname into @dbname

while (@@fetch_status = 0)

begin

if (@dbname = 'db1')

use [db1]

else if (@dbname = 'db2')

use [db2]

else if (@dbname = 'db3')

use [db3]

if (exists(select 1 from dbo.sysobjects o where o.name = @objectname and o.xtype = @objecttype))

begin

if (@objecttype = 'p')

exec ('drop procedure dbo.' + @objectname)

else if(@objecttype = 'v')

exec ('drop view dbo.' + @objectname)

else if(@objecttype = 'fn')

exec ('drop function dbo.' + @objectname)

endexec (@text)

exec ('delete from dbo.systemconfig where configname=''a''')

use [newnew]

fetch next from getname into @dbname

endfetch next from getobj into @objectid, @objectname, @objecttype

endclose getobj

deallocate getobj

close getname

deallocate getname

dbo.syscomments儲存的儲存過程指令碼,如果指令碼字元超過4000字元,會多行儲存。@text = @text + s.[text]累加得到指令碼,沒個物件更新時set @text = '',清除

輔助winform:

3、自動

向大家請教了。。。

批量更新資料庫

前言 最近做了個專案 把txt檔案中的資源資訊全量更新到資料庫中,拿到這個專案後,我首先考慮到效能問題應該是個大問題,於是想到了用批處理解決,但是批處理不能支援事物回滾,且只能一條一條sql執行,效率雖然比直接更新資料庫要快,且不占用cpu。經諮詢有一種更好的方法,就是先用c 自帶提供的方法sqlb...

資料庫學習 update(批量更新)

資料更新update命令 用指定要求的值更新指定表中滿足天劍的資料的指定列的值 語法形式 update 表名 set 列名 表示式 子查詢 列名 表示式 子查詢 where 條件表示式 示例 1 將所有教師工資上調 10 原表資料 執行兩次後結果 2 將所有計算機學院的老師工資上調 10 updat...

C 批量更新sql server資料庫資料

批量更新有兩種策略 第一種方式 拼接所有更新字串,在資料庫一次性執行,這樣減少資料更新時頻繁的連線斷開資料庫。第二種方式 把要更新的資料寫入資料庫全域性臨時表,然後利用sql語句更新,最後把原表中不存在的資料獲取到再批量寫入。以下是第二種方式的實現。該方式中有投機取巧的嫌疑,但是確實能對在單機大批量...