sp_scriptdynamicupdproc (Transact-SQL)

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

主题链接图标 Transact-SQL 语法约定

语法

sp_scriptdynamicupdproc [ @artid =] artid

参数

  • [ @artid=] artid
    项目 ID。 artid 的数据类型为 int,无默认值。

结果集

返回由单个 nvarchar(4000) 列构成的结果集。 该结果集构成了用于创建自定义存储过程的完整 CREATE PROCEDURE 语句。

注释

sp_scriptdynamicupdproc 在事务复制中使用。 默认的 MCALL 脚本编写逻辑包括 UPDATE 语句中的所有列,并使用一个位图来确定已更改的列。 如果某列未更改,则将其恢复回自身,这种做法通常不会导致任何问题。 如果该列被索引,则需要进行额外的处理。 动态方法仅包括已更改的列,这样可提供一个最优的 UPDATE 字符串。 然而,生成动态 UPDATE 语句时会在运行时发生额外处理。 建议您先测试动态方法和静态方法,然后选择最佳解决方案。

权限

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

示例

此示例在 pubs 数据库中的 authors 表中创建一个项目(其 artid 设置为 1),并指定 UPDATE 语句为要执行的自定义过程:

'MCALL sp_mupd_authors'

通过在发布服务器运行下列存储过程,生成将由订阅服务器中的分发代理执行的自定义存储过程:

EXEC sp_scriptdynamicupdproc @artid = '1'

The statement returns:

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

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

请参阅

参考

系统存储过程 (Transact-SQL)