sp_scriptdynamicupdproc (Transact-SQL)

Gilt für:SQL Server

Generiert die CREATE PROCEDURE Anweisung, die eine gespeicherte dynamische Aktualisierungsprozedur erstellt. Die UPDATE Anweisung innerhalb der benutzerdefinierten gespeicherten Prozedur wird dynamisch basierend auf der MCALL Syntax erstellt, die angibt, welche Spalten geändert werden sollen. Verwenden Sie diese gespeicherte Prozedur, wenn die Anzahl von Indizes für die Abonnementtabelle vergrößert wird und die Anzahl von zu ändernden Spalten klein ist. Diese gespeicherte Prozedur wird auf dem Verleger für die Veröffentlichungsdatenbank ausgeführt.

Transact-SQL-Syntaxkonventionen

Syntax

sp_scriptdynamicupdproc [ @artid = ] artid
[ ; ]

Argumente

[ @artid = ] artid

Die Artikel-ID. @artid ist "int" ohne Standard.

Resultset

Gibt ein Resultset zurück, das aus einer einzelnen nvarchar(4000)- Spalte besteht. Das Resultset bildet die vollständige CREATE PROCEDURE Anweisung, die zum Erstellen der benutzerdefinierten gespeicherten Prozedur verwendet wird.

Hinweise

sp_scriptdynamicupdproc wird in der Transaktionsreplikation verwendet. Die Standardmäßige MCALL Skriptlogik enthält alle Spalten in der UPDATE Anweisung und verwendet eine Bitmap, um die geänderten Spalten zu bestimmen. Wenn sich eine Spalte nicht geändert hat, wird die Spalte auf sich selbst zurückgesetzt, was in der Regel keine Probleme verursacht. Wenn die Spalte indiziert ist, entsteht zusätzlicher Verarbeitungsaufwand. Der dynamische Ansatz enthält nur die Spalten, die geändert wurden, was eine optimale UPDATE Zeichenfolge bietet. Beim Erstellen der dynamischen UPDATE Anweisung entsteht jedoch zur Laufzeit eine zusätzliche Verarbeitung. Es wird empfohlen, dass Sie das dynamische und statische Vorgehen testen und dann die bessere Lösung auswählen.

Berechtigungen

Nur Mitglieder der festen Serverrolle sysadmin oder db_owner feste Datenbankrolle können ausgeführt werden sp_scriptdynamicupdproc.

Beispiele

In diesem Beispiel wird ein Artikel (mit @artid auf ) in der Tabelle in der authorspubs Datenbank erstellt, und es wird angegeben, dass die UPDATE Anweisung die auszuführende benutzerdefinierte Prozedur ist: 'MCALL sp_mupd_authors'1

Generieren Sie die benutzerdefinierten gespeicherten Prozeduren, die der Verteilungs-Agent auf dem Abonnenten ausführen soll. Führen Sie hierzu die folgende gespeicherte Prozedur auf dem Verleger aus:

EXEC sp_scriptdynamicupdproc @artid = '1';

Die Anweisung gibt Folgendes zurück:

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;

Nach dem Ausführen dieser gespeicherten Prozedur können Sie den resultierenden Skriptcode zum manuellen Erstellen der gespeicherten Prozedur auf den Abonnenten verwenden.