適用於: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 。
在發行者端執行下列預存程式,以產生由訂閱者端 散發代理程式 執行的自定義預存程式:
EXECUTE 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 AS NVARCHAR (4000), @spacer AS 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';
EXECUTE 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
EXECUTE sp_MSreplraiserror 20598;
執行此預存程式之後,您可以使用產生的腳本,在訂閱者端手動建立預存程式。