Share via


sp_scriptdynamicupdproc (Transact-SQL)

Si applica a:SQL Server

Genera l'istruzione CREATE PROCEDURE che crea una stored procedure di aggiornamento dinamico. L'istruzione UPDATE all'interno della stored procedure personalizzata viene compilata in modo dinamico in base alla MCALL sintassi che indica quali colonne modificare. Utilizzare questa stored procedure se il numero di indici nella tabella di sottoscrizione è in aumento e il numero di colonne in fase di modifica è ridotto. Questa stored procedure viene eseguita nel database di pubblicazione del server di pubblicazione.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

sp_scriptdynamicupdproc [ @artid = ] artid
[ ; ]

Argomenti

[ @artid = ] artifid

ID dell'articolo. @artid è int, senza impostazione predefinita.

Set di risultati

Restituisce un set di risultati costituito da una singola colonna nvarchar(4000). Il set di risultati costituisce l'istruzione completa CREATE PROCEDURE utilizzata per creare la stored procedure personalizzata.

Osservazioni:

sp_scriptdynamicupdproc viene usato nella replica transazionale. La logica di scripting predefinita MCALL include tutte le colonne all'interno dell'istruzione UPDATE e usa una bitmap per determinare le colonne modificate. Se una colonna non è stata modificata, la colonna viene impostata di nuovo su se stessa, che in genere non causa problemi. Se la colonna è indicizzata, sono necessari altri processi di elaborazione. L'approccio dinamico include solo le colonne modificate, che fornisce una stringa ottimale UPDATE . Tuttavia, durante la compilazione dell'istruzione dinamica UPDATE viene generata un'elaborazione aggiuntiva in fase di esecuzione. È consigliabile verificare gli approcci dinamico e statico e quindi scegliere la soluzione ottimale.

Autorizzazioni

Solo i membri del ruolo predefinito del server sysadmin o db_owner ruolo predefinito del database possono eseguire sp_scriptdynamicupdproc.

Esempi

Questo esempio crea un articolo (con @artid impostato su 1) nella authors tabella del pubs database e specifica che l'istruzione UPDATE è la procedura personalizzata da eseguire: 'MCALL sp_mupd_authors' .

Generare le stored procedure personalizzate che dovranno essere eseguite dall'agente di distribuzione nel Sottoscrittore mediante l'esecuzione della stored procedure seguente nel server di pubblicazione:

EXEC sp_scriptdynamicupdproc @artid = '1';

L'istruzione restituisce:

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;

Dopo avere eseguito questa stored procedure, è possibile utilizzare lo script risultante per creare manualmente la stored procedure nei Sottoscrittori.