다음을 통해 공유


sp_scriptdynamicupdproc(Transact-SQL)

적용 대상: SQL Server

CREATE PROCEDURE 동적 업데이트 저장 프로시저를 만드는 문을 생성합니다. UPDATE 사용자 지정 저장 프로시저 내의 문은 변경할 열을 나타내는 구문을 기반으로 MCALL 동적으로 작성됩니다. 구독 테이블의 인덱스 수가 증가하고 변경되는 열 수가 작은 경우 이 저장 프로시저를 사용합니다. 이 저장 프로시저는 게시 데이터베이스의 게시자에서 실행됩니다.

Transact-SQL 구문 표기 규칙

구문

sp_scriptdynamicupdproc [ @artid = ] artid
[ ; ]

인수

[ @artid = ] artid

문서 ID입니다. @artid 기본값이 없는 int입니다.

결과 집합

단일 nvarchar(4000) 열로 구성된 결과 집합을 반환합니다. 결과 집합은 사용자 지정 저장 프로시저를 만드는 데 사용되는 전체 CREATE PROCEDURE 문을 형성합니다.

설명

sp_scriptdynamicupdproc 는 트랜잭션 복제에 사용됩니다. 기본 MCALL 스크립팅 논리는 문 내의 UPDATE 모든 열을 포함하고 비트맵을 사용하여 변경된 열을 결정합니다. 열이 변경되지 않으면 열이 자체적으로 다시 설정되므로 일반적으로 문제가 발생하지 않습니다. 열이 인덱싱되면 추가 처리가 발생합니다. 동적 접근 방식에는 최적의 UPDATE 문자열을 제공하는 변경된 열만 포함됩니다. 그러나 동적 UPDATE 문이 빌드될 때 런타임에 추가 처리가 발생합니다. 동적 방법과 정적 방법을 테스트한 다음 최적의 해결 방법을 선택하는 것이 좋습니다.

사용 권한

sysadmin 고정 서버 역할 또는 db_owner 고정 데이터베이스 역할의 멤버만 실행할 sp_scriptdynamicupdproc수 있습니다.

예제

이 예제에서는 데이터베이스의 테이블에 pubs 아티클(@artid 설정1됨)authors을 만들고 명령문이 실행할 'MCALL sp_mupd_authors'사용자 지정 프로시저임을 UPDATE 지정합니다.

게시자에서 다음 저장 프로시저를 실행하여 구독자에서 배포 에이전트 실행할 사용자 지정 저장 프로시저를 생성합니다.

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;

이 저장 프로시저를 실행한 후 결과 스크립트를 사용하여 구독자에서 저장 프로시저를 수동으로 만들 수 있습니다.