sp_scriptdynamicupdproc (Transact-SQL)
Формирует инструкцию CREATE PROCEDURE, создающую хранимую процедуру динамического обновления. Инструкция UPDATE создается в пользовательской хранимой процедуре динамически на основе синтаксиса MCALL, при котором указываются изменяемые столбцы. Следует использовать эту хранимую процедуру, если число индексов в таблице подписки увеличивается, а число изменяемых столбцов невелико. Эта хранимая процедура выполняется на издателе в базе данных публикации.
Синтаксис
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
После выполнения этой хранимой процедуры можно использовать получившийся в итоге сценарий для создания хранимой процедуры вручную на подписчиках.