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;
После выполнения этой хранимой процедуры можно использовать получившийся в итоге скрипт для создания хранимой процедуры вручную на подписчиках.