sp_scriptdynamicupdproc(Transact-SQL)
적용 대상: SQL Server
CREATE PROCEDURE
동적 업데이트 저장 프로시저를 만드는 문을 생성합니다. UPDATE
사용자 지정 저장 프로시저 내의 문은 변경할 열을 나타내는 구문을 기반으로 MCALL
동적으로 작성됩니다. 구독 테이블의 인덱스 수가 증가하고 변경되는 열 수가 작은 경우 이 저장 프로시저를 사용합니다. 이 저장 프로시저는 게시 데이터베이스의 게시자에서 실행됩니다.
구문
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;
이 저장 프로시저를 실행한 후 결과 스크립트를 사용하여 구독자에서 저장 프로시저를 수동으로 만들 수 있습니다.