Поделиться через


sp_scriptdynamicupdproc (Transact-SQL)

Формирует инструкцию CREATE PROCEDURE, создающую хранимую процедуру динамического обновления. Инструкция UPDATE создается в пользовательской хранимой процедуре динамически на основе синтаксиса MCALL, при котором указываются изменяемые столбцы. Следует использовать эту хранимую процедуру, если число индексов в таблице подписки увеличивается, а число изменяемых столбцов невелико. Эта хранимая процедура выполняется на издателе в базе данных публикации.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

sp_scriptdynamicupdproc [ @artid =] artid

Аргументы

  • [ @artid=] artid
    Идентификатор статьи. Этот аргумент имеет тип int и не имеет значения по умолчанию.

Результирующие наборы

Данная хранимая процедура возвращает результирующий набор, состоящий из единственного столбца nvarchar(4000). Результирующий набор формирует полную инструкцию CREATE PROCEDURE, служащую для создания пользовательской хранимой процедуры.

Замечания

Хранимая процедура sp_scriptdynamicupdproc используется при репликации транзакций. По умолчанию, при синтаксисе MCALL в сценарий включаются все столбцы, входящие в инструкцию UPDATE, а для определения измененных столбцов используется битовая карта. Если столбец не изменился, ему присваиваются его же значения, что обычно не приводит ни к каким проблемам. Если столбец является индексированным, выполняются дополнительные операции. При таком динамическом подходе принимаются во внимание только измененные столбцы, в результате чего формируется оптимальная инструкция UPDATE. Однако составление динамической инструкции UPDATE требует дополнительной обработки в период выполнения. Рекомендуется протестировать динамический и статический подходы и выбрать оптимальное решение.

Разрешения

Хранимую процедуру sp_scriptdynamicupdproc могут выполнять только члены предопределенной роли сервера sysadmin и члены предопределенной роли db_owner базы данных.

Примеры

В следующем примере создается статья (со значением аргумента artid, равным 1) для таблицы authors базы данных pubs и указывается, что инструкцией 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

После выполнения этой хранимой процедуры можно использовать получившийся в итоге сценарий для создания хранимой процедуры вручную на подписчиках.