本文給大家分享一個遠端更新目標庫資料的儲存過程,適用於更新列名一致,主鍵為Int型別,可遠端連結的資料庫。
USE [
Table
]
--切換到源表,就是資料最新的那個表
GO
/****** Object: StoredProcedure [dbo].[proc_DataUpdate] Script
Date
: 2018/5/4 15:08:56 ******/
SET
ANSI_NULLS
ON
GO
SET
QUOTED_IDENTIFIER
ON
GO
-- =============================================
-- Author: <Grom>
-- Create date: <2018-05-04>
-- Description: <分批更新遠端資料,僅支援主鍵為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
),
--主鍵列(必須為數字)
@
Column
nvarchar(
max
),
--更新列名集合
@ExecSize
int
--每次執行數量
AS
declare
@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;--開啟註釋可不顯示執行過程,提高速度
begin
try
--取最大值
set
@sql =
'select @MaxID=MAX('
+@PK_ID+
') from '
+@LocalDBName;
exec
sp_executesql @sql,N
'@MaxID int out'
,@MaxID
out
--迴圈
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;
--記錄執行最大值
SET
@SQL=
'select @NumMax=MAX('
+@PK_ID+
') from ##tmp_table'
;
exec
sp_executesql @sql,N
'@NumMax int out'
,@NumMax
out
;
--記錄執行最小值
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
--刪除多餘資料
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
try
begin
catch
select
Error_number()
as
ErrorNumber,
--錯誤程式碼
Error_severity()
as
ErrorSeverity,
--錯誤嚴重級別,級別小於10 try catch 捕獲不到
Error_state()
as
ErrorState ,
--錯誤狀態碼
Error_Procedure()
as
ErrorProcedure ,
--出現錯誤的儲存過程或觸發器的名稱。
Error_line()
as
ErrorLine,
--發生錯誤的行號
Error_message()
as
ErrorMessage
--錯誤的具體資訊
drop
table
##tmp_table;
end
catch
END
執行儲存過程
USE [
table
]
--源表
GO
DECLARE
@return_value
int
EXEC
@return_value = [dbo].[proc_DataUpdate]
@TargetInstance = N
''
,
--遠端資料庫例項 如目標庫不在一個域,切勿使用內網地址
@TargetDBName = N
''
,
--遠端資料庫名稱
@TargetUID = N
''
,
--使用者名稱
@TargetPWD = N
''
,
--密碼
@LocalDBName=N
''
,
--用於更新表名 (源表)
@PK_ID =N
''
,
--主鍵列(必須為Int)
@
Column
=
'ID,Name'
,
--更新列名集合 例 'A,B,C'
@ExecSize=200
--每次執行條數
SELECT
'Return Value'
= @return_value
GO
總結
以上所述是小編給大家介紹的SQL Server 遠端更新目標表資料的儲存過程,希望對大家有所幫助,