Compartir a través de


sp_scriptdynamicupdproc (Transact-SQL)

Se aplica a: SQL Server

Genera la CREATE PROCEDURE instrucción que crea un procedimiento almacenado de actualización dinámica. La UPDATE instrucción dentro del procedimiento almacenado personalizado se compila dinámicamente en función de la MCALL sintaxis que indica qué columnas se van a cambiar. Utilice este procedimiento almacenado si el número de índices de la tabla de suscripción va en aumento y el número de columnas modificadas es relativamente pequeño. Este procedimiento almacenado se ejecuta en el publicador de la base de datos de publicación.

Convenciones de sintaxis de Transact-SQL

Sintaxis

sp_scriptdynamicupdproc [ @artid = ] artid
[ ; ]

Argumentos

[ @artid = ] artid

Identificador del artículo. @artid es int, sin valor predeterminado.

Conjunto de resultados

Devuelve un conjunto de resultados que consta de una sola columna nvarchar(4000). El conjunto de resultados forma la instrucción completa CREATE PROCEDURE que se usa para crear el procedimiento almacenado personalizado.

Comentarios

sp_scriptdynamicupdproc se usa en la replicación transaccional. La lógica de scripting predeterminada MCALL incluye todas las columnas de la UPDATE instrucción y usa un mapa de bits para determinar las columnas que han cambiado. Si una columna no cambió, la columna se vuelve a establecer en sí misma, lo que normalmente no provoca ningún problema. Si la columna estuviera indizada, tendría lugar un procesamiento adicional. El enfoque dinámico incluye solo las columnas que han cambiado, lo que proporciona una cadena óptima UPDATE . Sin embargo, se incurre en un procesamiento adicional en tiempo de ejecución cuando se compila la instrucción dinámica UPDATE . Se recomienda probar los enfoques dinámico y estático y elegir la mejor solución.

Permisos

Solo los miembros del rol fijo de servidor sysadmin o db_owner rol fijo de base de datos pueden ejecutar sp_scriptdynamicupdproc.

Ejemplos

En este ejemplo se crea un artículo (con @artid establecido en ) en la authors tabla de la pubs base de datos y se especifica que la UPDATE instrucción es el procedimiento personalizado que se va a ejecutar: 'MCALL sp_mupd_authors'.1

Genere los procedimientos almacenados personalizados que debe ejecutar el Agente de distribución en el suscriptor. Para hacerlo, ejecute el siguiente procedimiento almacenado en el publicador:

EXEC sp_scriptdynamicupdproc @artid = '1';

La instrucción devuelve:

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;

Una vez ejecutado este procedimiento almacenado, puede utilizar el script resultante para crear de forma manual el procedimiento almacenado en los suscriptores.