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 authors
pubs
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.