次の方法で共有


sp_scriptdynamicupdproc (Transact-SQL)

適用対象: SQL Server

動的更新ストアド プロシージャを作成する CREATE PROCEDURE ステートメントを生成します。 カスタム ストアド プロシージャ内の UPDATE ステートメントは、変更する列を示す MCALL 構文に基づいて動的に構築されます。 サブスクライブ テーブルのインデックスの数が増え、変更される列の数が少ない場合は、このストアド プロシージャを使用します。 このストアド プロシージャは、パブリッシャー側のパブリケーション データベースで実行されます。

Transact-SQL 構文表記規則

構文

sp_scriptdynamicupdproc [ @artid = ] artid
[ ; ]

引数

[ @artid = ] artid

アーティクル ID。 @artidint で、既定値はありません。

結果セット

1 つの nvarchar(4000) 列で構成される結果セットを返します。 結果セットは、カスタム ストアド プロシージャの作成に使用される完全な CREATE PROCEDURE ステートメントを形成します。

解説

sp_scriptdynamicupdproc はトランザクション レプリケーションで使用されます。 既定の MCALL スクリプト ロジックには、 UPDATE ステートメント内のすべての列が含まれており、ビットマップを使用して変更された列が決定されます。 列が変更されなかった場合、列はそれ自体に戻され、通常は問題が発生しません。 列にインデックスが作成されている場合、追加の処理が発生します。 動的アプローチには、最適な UPDATE 文字列を提供する変更された列のみが含まれます。 ただし、動的 UPDATE ステートメントがビルドされると、実行時に追加の処理が発生します。 動的な方法と静的な方法の両方をテストし、最適な方を選択することをお勧めします。

アクセス許可

sysadmin固定サーバー ロールまたは固定データベース ロールdb_ownerのメンバーのみがsp_scriptdynamicupdprocを実行できます。

この例では、pubs データベースのauthors テーブルにアーティクル (@artid1 に設定) を作成し、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;

このストアド プロシージャを実行した後、結果のスクリプトを使用して、サブスクライバー側で手動でストアド プロシージャを作成できます。