sp_scriptdynamicupdproc (Transact-SQL)

適用於:SQL Server

CREATE PROCEDURE產生建立動態更新預存程式的語句。 UPDATE自訂預存程式內的語句會根據表示要變更之數據行的MCALL語法動態建置。 如果訂閱數據表上的索引數目正在增加,而且要變更的數據行數目很小,請使用這個預存程式。 這個預存程式是在發行集資料庫的發行者端執行。

Transact-SQL 語法慣例

語法

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;

執行此預存程式之後,您可以使用產生的腳本,在訂閱者端手動建立預存程式。