Articles

업데이트 문에 대한 출력 절

출력 절은 SQL Server2005 버전에 도입되었습니다. 출력 절은 INSERT,UPDATE 또는 DELETE 문의 영향을 받은 각 행의 값을 반환합니다. 심지어 SQL Server2008 에 소개 된 MERGE 문을 지원합니다. 출력 절의 결과는 쿼리를 실행하는 동안 별도의 테이블에 삽입 될 수있다. 이 절은 감사 목적으로 가장 일반적으로 사용됩니다. 이를 사용하여 누군가가 CDC 처럼 작동하거나 CDC 와 같은 방식으로 행동하는 사용자 정의 프로세스를 구현할 수 있습니다.

또한,결과 출력에서 절에 반환될 수 있습을 처리하는 응용프로그램을 사용하기 위해서 그런 것으로 확인 메시지,로깅 및 다른 응용 프로그램의 요구 사항입니다. 이 문서에서 제가 설정의 예를 전시의 사용을 산출 절에서의 결과를 캡처하고 업데이트된 행 테이블로 변수를 위한 업데이트 문입니다.

시작하기

아래 예제를 따르기 위해 sql Server 데이터베이스에서 아래 T-SQL 코드를 실행하여 테이블 Department_SRC 를 작성해야합니다. 참조 된 섹션에는 Output_Update 가 포함되어 있습니다.아래 예제를 사용해 볼 수있는 T-SQL 코드가 포함 된 sql 파일.

IF OBJECT_ID ('Department_SRC', 'U') IS NOT NULL DROP TABLE dbo.Department_SRC;CREATE TABLE .( IDENTITY(1,1) NOT NULL, varchar(50) NOT NULL, varchar(50) NOT NULL, NOT NULL) ON Insert into .(,,) Values('Engineering','Research and Development',getdate());

당신이 볼 수 있습니다 테이블에서 데이터 레코드가 삽입되는 테이블과 같은 아래 이미지입니다.

를 구현하는 출력 절에서 업데이트 문

우리가 논의에서 이전 문서에서,출력 절 액세스를 제공합니다 두 가이블(매직 테이블):

  1. “삽입”포함되어 새로운 행을(삽입 또는 업데이트로 설정)
  2. “삭제”이 포함된 사본의 행(업데이트로 설정)

출력된 조항 업데이트 문 것입니다 모두에 액세스 할 수 있습니다 삽입과 삭제 내부 테이블이 있습니다. 즉,이 두 테이블은 업데이트 문을 실행하는 동시에 액세스 할 수 있습니다. 예를 들어 단일 행에 대해 테이블에서 몇 개의 열을 업데이트한다고 가정합니다. 새로 업데이트 된 값은 테이블의 변경 사항이며 삽입 된 내부 테이블에 있습니다. 또한 변경된 데이터는 이전 데이터 값이며 삭제 된 내부 테이블에 삽입됩니다.

보 업데이트 값

를 사용하여 출력 절을 표시할 수 있습니다 업데이트 값을 출력 창에서 선택하여 열 이름을 삽입된 접두사로 사용하거나 삽입됩니다.*삽입된 테이블의 모든 열을 표시합니다. 또한 삭제 된 접두사가있는 열 이름을 선택하거나 삭제를 사용하여 테이블의 이전 데이터 값을 출력 창에 표시 할 수 있습니다.*해당 테이블의 모든 열을 표시합니다. 이것은 또한 관리 스튜디오 창에 출력 메시지의 일부를 인쇄에 도움이 될 것입니다.

설명하기 위해서 이와 예를 들어,내가 실행하면 아래 코드,우리가 노력하고 업데이트 GroupName 에서 열”연구 및 개발”가치를”그것을”값에 대해”엔지니어링”부가 있습니다.

--Update the GroupName for the Department.Update Set ='IT', ModifiedDate=Getdate()OUTPUT deleted.Name ,deleted.GroupName as GroupName_old, deleted.ModifiedDate as ModifiedDate_old, inserted.GroupName as GroupName_new, inserted.ModifiedDate as ModifiedDate_newWhere ='Engineering'

면 우리는 실행 위의 코드,우리가 볼 수있는 결과를 출력 절과 같이 아래 이미지입니다.

삽입하는 출력 결과를 테이블로 변

하기 위해서 쇼케이스를 들어,나는 선언 변수 테이블이라는@업데이트를 저장한 결과를 출력 절로 이 표는 변수입니다. 우리는 테이블 변수에 결과를 저장하기 위해 구문으로 출력을 사용합니다. 이 방식에서는,우리는 액세스를 설정 행 모두 새로운 값을 구하는 값에 의해 업데이트되었습니다 쿼리를 위해 사용될 수 있는 다음 단계에서는 동일합니다.

--capturing Updated values using table variable.DECLARE @Updated table( int, varchar(50), varchar(50), varchar(50), datetime, datetime);Update Set ='IT', ModifiedDate=Getdate()OUTPUT deleted.DepartmentID, deleted.Name, deleted.GroupName as GroupName_old, inserted.GroupName as GroupName_new, deleted.ModifiedDate as ModifiedDate_old,inserted.ModifiedDate as ModifiedDate_newINTO @UpdatedWhere ='Engineering'--Querying from @Updated output tableSelect * from @Updated

면 우리는 실행 위의 코드,우리가 볼 수있는 결과가 삽입되@업데이트 변수 테이블과 같은 아래 이미지입니다.

의 사용을 산출 절을 로드하는 유형 3 천천히 변화하는 차원

위의 예는 다음과 같이 출력 절은 매우 좋은 대안을 로드하는 유형 3 차원이다. 기 위해서는 이것을 설명하기 위해 예를 들어,내가 실행하면 아래 코드를 만들 것입니다 테이블의 유형 3 차원이라고 Department_Type3.

---Type 3 table exampleIF OBJECT_ID ('Department_Type3', 'U') IS NOT NULL DROP TABLE dbo.Department_Type3;CREATE TABLE .( IDENTITY(1,1) NOT NULL, varchar(50) NULL, varchar(50) NULL, varchar(50) NULL, NULL) ON GO---Insert some test valuesInsert into .(,,) Values('Engineering','Research and Development',getdate());Select * from .

위의 코드를 실행하면 아래 이미지와 같이 테이블 데이터의 결과를 볼 수 있습니다.

으로 우리는 삽입하는 새로운 기록으로 Department_Type3 테이블,우리가 볼 수 있는 GroupName_old 열에는 NULL 값과 GroupName_Current 는 가치의 최근하였습니다. 우리가 있다고 가정합에서 변경 GroupName_current 에 대해”엔지니어링”부서 이름을 우리는 우리의 업데이트 Department_Type3 테이블과 함께 새로운 GroupName_current 값입니다. 이 때문에,TYPE3 치수 테이블이 요구 여기를 업데이트 GroupName_old 열”연구 및 개발”및 GroupName_Current 와 새로운 값입니다.

--capturing Updated values using table variable.DECLARE @Updated table( int, varchar(50), varchar(50), varchar(50), datetime, datetime);Update Set ='IT', EffectiveDate=Getdate()OUTPUT deleted.DepartmentID, deleted.Name, deleted. as ,inserted.GroupName_current as GroupName_new, deleted.EffectiveDate as ModifiedDate_old,inserted.EffectiveDate as ModifiedDate_newINTO @UpdatedWhere ='Engineering'--Update the GroupName_old with old valuesUpdate aSet a.GroupName_old=b.GroupName_old, a.EffectiveDate=b.ModifiedDate_newfrom as ainner join @Updated as bon a.DepartmentID=b.DepartmentID--Querying the final tableSelect * from 

면 우리는 실행 위의 코드는,우리는 사로잡을 예정이다결과에서 삭제 내부 테이블로@업데이트 변수 테이블을 사용하고 데이터를 업로 테이블의 열을 구현하기 위한 이 유형 3 천천히 변화하는 차원이다. 우리는 결과를 볼 수 있습니다 최종의 테이블에 데이터를 전후의 집행 위의 문서와 같은 아래 이미지입니다.

전에 업데이트 문을 실행

후 업데이트 문을 실행

출력 절 제한 사항

시나리오 중 일부의 출력을 절은 지원되지 않습니다.

  1. DML 문을 참조하는 지역 분할 전망된망 또는 원격 테이블이 있습니다.
  2. EXECUTE 문을 포함하는 insert 문.
  3. 데이터베이스 호환성 수준이 100 으로 설정된 경우 출력 절에서 전체 텍스트 술어가 허용되지 않습니다.
  4. output INTO 절은 뷰 또는 rowset 함수에 삽입하는 데 사용할 수 없습니다.
  5. 사용자 정의 기능을 만들 수 없습이 포함된 경우에는 출력으로 절가 있는 테이블의 대상으로

전체 목록에 나열된 이 링크를https://technet.microsoft.com/en-us/library/ms177564(v=sql.110).aspx

요약

과 같이 위의 예에서 우리가 볼 수 있는 출력 절을 사용하기 쉽고 피할 수 있습의 많은 사용자 지정 코딩하기 위해 캡처를 출력의 결과를 업데이트 값이 오래되고 새로운 값으로 변수 테이블을 실행하는 동안의 쿼리가 있습니다.