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


sp_scriptdynamicupdproc (Transact-SQL)

Область применения: SQL Server

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

Соглашения о синтаксисе Transact-SQL

Синтаксис

sp_scriptdynamicupdproc [ @artid = ] artid
[ ; ]

Аргументы

[ @artid = ] artid

Идентификатор статьи. @artid не используется без значения по умолчанию.

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

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

Замечания

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

Разрешения

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

Примеры

В этом примере создается статья (с @artid задано 1значение ) authors в таблице в pubs базе данных, и указывает, что UPDATE инструкция является пользовательской процедурой для выполнения: 'MCALL sp_mupd_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;

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