本文給大家分享一個(gè)遠(yuǎn)程更新目標(biāo)庫(kù)數(shù)據(jù)的存儲(chǔ)過(guò)程,適用于更新列名一致,主鍵為Int類型,可遠(yuǎn)程鏈接的數(shù)據(jù)庫(kù)。
USE [Table]--切換到源表,就是數(shù)據(jù)最新的那個(gè)表GO/****** Object: StoredProcedure [dbo].[proc_DataUpdate] Script Date: 2018/5/4 15:08:56 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: <Grom>-- Create date: <2018-05-04>-- Description: <分批更新遠(yuǎn)程數(shù)據(jù),僅支持主鍵為int表>-- =============================================CREATE PROCEDURE [dbo].[proc_DataUpdate]@TargetInstance nvarchar(max),@TargetDBName nvarchar(max),@TargetUID nvarchar(max),@TargetPWD nvarchar(max),@LocalDBName nvarchar(max),@PK_ID nvarchar(max),--主鍵列(必須為數(shù)字)@Column nvarchar(max),--更新列名集合@ExecSize int--每次執(zhí)行數(shù)量ASdeclare @sql nvarchar(max),@NumMax int=0,@NumMin int=0,@MaxID int BEGIN-- SET NOCOUNT ON added to prevent extra result sets from-- interfering with SELECT statements.-- SET NOCOUNT ON;--打開(kāi)注釋可不顯示執(zhí)行過(guò)程,提高速度begin try --取最大值 set @sql = 'select @MaxID=MAX('+@PK_ID+') from '+@LocalDBName; exec sp_executesql @sql,N'@MaxID int out',@MaxID out --循環(huán) while(@NumMax<@MaxID) begin if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..##tmp_table') and type='U') drop table ##tmp_table; SET @sql = 'select top '+cast(@ExecSize as nvarchar(1000))+' '+ @Column +' into ##tmp_table from '+@LocalDBName+' where '+@PK_ID+'>'+cast(@NumMax as nvarchar(150)); exec sp_executesql @sql; --記錄執(zhí)行最大值 SET @SQL='select @NumMax=MAX('+@PK_ID+') from ##tmp_table'; exec sp_executesql @sql,N'@NumMax int out',@NumMax out; --記錄執(zhí)行最小值 SET @SQL='select @NumMin=MIN('+@PK_ID+') from ##tmp_table'; exec sp_executesql @sql,N'@NumMin int out',@NumMin out; SET @sql='delete openrowset(''SQLOLEDB'','''+@TargetInstance+''';'''+@TargetUID+''';'''+@TargetPWD+''',['+@TargetDBName+'].[dbo].['+@LocalDBName+']) where '+@PK_ID+' between '+cast(@NumMin as nvarchar(200))+' and '+cast(@NumMax as nvarchar(200)); exec sp_executesql @sql; SET @sql='insert into openrowset(''SQLOLEDB'','''+@TargetInstance+''';'''+@TargetUID+''';'''+@TargetPWD+''',['+@TargetDBName+'].[dbo].['+@LocalDBName+']) ('+@Column+') select '+ @Column +' from ##tmp_table' exec sp_executesql @sql; end --刪除多余數(shù)據(jù) SET @sql='delete openrowset(''SQLOLEDB'','''+@TargetInstance+''';'''+@TargetUID+''';'''+@TargetPWD+''',['+@TargetDBName+'].[dbo].['+@LocalDBName+']) where '+@PK_ID+' >'+cast(@NumMax as nvarchar(200)); drop table ##tmp_table; print 'Success';end trybegin catch select Error_number() as ErrorNumber, --錯(cuò)誤代碼 Error_severity() as ErrorSeverity, --錯(cuò)誤嚴(yán)重級(jí)別,級(jí)別小于10 try catch 捕獲不到 Error_state() as ErrorState , --錯(cuò)誤狀態(tài)碼 Error_Procedure() as ErrorProcedure , --出現(xiàn)錯(cuò)誤的存儲(chǔ)過(guò)程或觸發(fā)器的名稱?! rror_line() as ErrorLine, --發(fā)生錯(cuò)誤的行號(hào) Error_message() as ErrorMessage --錯(cuò)誤的具體信息 drop table ##tmp_table;end catchEND
新聞熱點(diǎn)
疑難解答
圖片精選