sp_scriptdynamicupdproc (Transact-SQL)
適用於:SQL Server
CREATE PROCEDURE
產生建立動態更新預存程式的語句。 UPDATE
自訂預存程式內的語句會根據表示要變更之數據行的MCALL
語法動態建置。 如果訂閱數據表上的索引數目正在增加,而且要變更的數據行數目很小,請使用這個預存程式。 這個預存程式是在發行集資料庫的發行者端執行。
語法
sp_scriptdynamicupdproc [ @artid = ] artid
[ ; ]
引數
[ @artid = ] artid
發行項標識碼。 @artid為 int,沒有預設值。
結果集
傳回包含單 一 nvarchar(4000) 數據行的結果集。 結果集會形成用來建立自定義預存程式的完整 CREATE PROCEDURE
語句。
備註
sp_scriptdynamicupdproc
用於事務複製。 默認 MCALL
文本邏輯包含語句中的所有 UPDATE
數據行,並使用位圖來判斷已變更的數據行。 如果數據行未變更,數據行會設回本身,這通常不會造成任何問題。 如果數據行已編製索引,就會發生額外的處理。 動態方法只包含已變更的數據行,以提供最佳 UPDATE
字串。 不過,建置動態 UPDATE
語句時,會在運行時間產生額外的處理。 建議您測試動態和靜態方法,然後選擇最佳解決方案。
權限
只有系統管理員固定伺服器角色或db_owner固定資料庫角色的成員才能執行 sp_scriptdynamicupdproc
。
範例
本範例會在資料庫中的數據表pubs
上建立發行項(@artid設定為 1
),並指定要UPDATE
執行的自定義程式: 'MCALL sp_mupd_authors'
authors
。
在發行者端執行下列預存程式,以產生由訂閱者端 散發代理程式 執行的自定義預存程式:
EXEC sp_scriptdynamicupdproc @artid = '1';
此陳述式會傳回:
CREATE PROCEDURE [sp_mupd_authors] @c1 VARCHAR(11),
@c2 VARCHAR(40),
@c3 VARCHAR(20),
@c4 CHAR(12),
@c5 VARCHAR(40),
@c6 VARCHAR(20),
@c7 CHAR(2),
@c8 CHAR(5),
@c9 BIT,
@pkc1 VARCHAR(11),
@bitmap BINARY (2)
AS
DECLARE @stmt NVARCHAR(4000),
@spacer NVARCHAR(1);
SELECT @spacer = N'';
SELECT @stmt = N'UPDATE [authors] SET ';
IF SUBSTRING(@bitmap, 1, 1) & 2 = 2
BEGIN
SELECT @stmt = @stmt + @spacer + N'[au_lname]' + N'=@2'
SELECT @spacer = N','
END;
IF SUBSTRING(@bitmap, 1, 1) & 4 = 4
BEGIN
SELECT @stmt = @stmt + @spacer + N'[au_fname]' + N'=@3'
SELECT @spacer = N','
END;
IF SUBSTRING(@bitmap, 1, 1) & 8 = 8
BEGIN
SELECT @stmt = @stmt + @spacer + N'[phone]' + N'=@4'
SELECT @spacer = N','
END;
IF SUBSTRING(@bitmap, 1, 1) & 16 = 16
BEGIN
SELECT @stmt = @stmt + @spacer + N'[address]' + N'=@5'
SELECT @spacer = N','
END;
IF SUBSTRING(@bitmap, 1, 1) & 32 = 32
BEGIN
SELECT @stmt = @stmt + @spacer + N'[city]' + N'=@6'
SELECT @spacer = N','
END;
IF SUBSTRING(@bitmap, 1, 1) & 64 = 64
BEGIN
SELECT @stmt = @stmt + @spacer + N'[state]' + N'=@7'
SELECT @spacer = N','
END;
IF SUBSTRING(@bitmap, 1, 1) & 128 = 128
BEGIN
SELECT @stmt = @stmt + @spacer + N'[zip]' + N'=@8'
SELECT @spacer = N','
END;
IF SUBSTRING(@bitmap, 2, 1) & 1 = 1
BEGIN
SELECT @stmt = @stmt + @spacer + N'[contract]' + N'=@9'
SELECT @spacer = N','
END;
SELECT @stmt = @stmt + N' where [au_id] = @1'
EXEC sp_executesql @stmt,
N' @1 varchar(11),@2 varchar(40),@3 varchar(20),@4 char(12),@5 varchar(40),
@6 varchar(20),@7 char(2),@8 char(5),@9 bit',
@pkc1, @c2, @c3, @c4, @c5, @c6, @c7, @c8, @c9;
IF @@rowcount = 0
IF @@microsoftversion > 0x07320000
EXEC sp_MSreplraiserror 20598;
執行此預存程式之後,您可以使用產生的腳本,在訂閱者端手動建立預存程式。