sp_scriptdynamicupdproc (Transact-SQL)

适用于SQL Server

CREATE PROCEDURE生成创建动态更新存储过程的语句。 UPDATE自定义存储过程中的语句基于指示要更改的列的MCALL语法动态生成。 如果订阅表中的索引数不断增加,并且被更改列的数目很小,请使用此存储过程。 此存储过程在发布服务器的发布数据库中执行。

Transact-SQL 语法约定

语法

sp_scriptdynamicupdproc [ @artid = ] artid
[ ; ]

参数

[ @artid = ] artid

文章 ID。 @artidint,无默认值。

结果集

返回一个结果集,其中包含单个 nvarchar(4000) 列。 结果集形成用于创建自定义存储过程的完整 CREATE PROCEDURE 语句。

注解

sp_scriptdynamicupdproc 用于事务复制。 默认 MCALL 脚本逻辑包括语句中的所有 UPDATE 列,并使用位图来确定已更改的列。 如果列未更改,则列将重新设置为自身,这通常不会导致问题。 如果该列被索引,则需要进行额外的处理。 动态方法仅包含已更改的列,从而提供最佳 UPDATE 字符串。 但是,生成动态 UPDATE 语句时,在运行时会产生额外的处理。 建议您先测试动态方法和静态方法,然后选择最佳解决方案。

权限

只有 sysadmin 固定服务器角色的成员db_owner固定数据库角色的成员才能执行sp_scriptdynamicupdproc

示例

此示例对数据库中的表创建一篇文章(@artid设置为1),并指定要UPDATE执行的'MCALL sp_mupd_authors'自定义过程。pubs 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;

运行此存储过程后,可以使用生成的脚本在订阅服务器手动创建存储过程。