업데이트 문에 대한 출력 절
출력 절은 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());
당신이 볼 수 있습니다 테이블에서 데이터 레코드가 삽입되는 테이블과 같은 아래 이미지입니다.
를 구현하는 출력 절에서 업데이트 문
우리가 논의에서 이전 문서에서,출력 절 액세스를 제공합니다 두 가이블(매직 테이블):
- “삽입”포함되어 새로운 행을(삽입 또는 업데이트로 설정)
- “삭제”이 포함된 사본의 행(업데이트로 설정)
출력된 조항 업데이트 문 것입니다 모두에 액세스 할 수 있습니다 삽입과 삭제 내부 테이블이 있습니다. 즉,이 두 테이블은 업데이트 문을 실행하는 동시에 액세스 할 수 있습니다. 예를 들어 단일 행에 대해 테이블에서 몇 개의 열을 업데이트한다고 가정합니다. 새로 업데이트 된 값은 테이블의 변경 사항이며 삽입 된 내부 테이블에 있습니다. 또한 변경된 데이터는 이전 데이터 값이며 삭제 된 내부 테이블에 삽입됩니다.
보 업데이트 값
를 사용하여 출력 절을 표시할 수 있습니다 업데이트 값을 출력 창에서 선택하여 열 이름을 삽입된 접두사로 사용하거나 삽입됩니다.*삽입된 테이블의 모든 열을 표시합니다. 또한 삭제 된 접두사가있는 열 이름을 선택하거나 삭제를 사용하여 테이블의 이전 데이터 값을 출력 창에 표시 할 수 있습니다.*해당 테이블의 모든 열을 표시합니다. 이것은 또한 관리 스튜디오 창에 출력 메시지의 일부를 인쇄에 도움이 될 것입니다.
설명하기 위해서 이와 예를 들어,내가 실행하면 아래 코드,우리가 노력하고 업데이트 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 천천히 변화하는 차원이다. 우리는 결과를 볼 수 있습니다 최종의 테이블에 데이터를 전후의 집행 위의 문서와 같은 아래 이미지입니다.
전에 업데이트 문을 실행
후 업데이트 문을 실행
출력 절 제한 사항
시나리오 중 일부의 출력을 절은 지원되지 않습니다.
- DML 문을 참조하는 지역 분할 전망된망 또는 원격 테이블이 있습니다.
- EXECUTE 문을 포함하는 insert 문.
- 데이터베이스 호환성 수준이 100 으로 설정된 경우 출력 절에서 전체 텍스트 술어가 허용되지 않습니다.
- output INTO 절은 뷰 또는 rowset 함수에 삽입하는 데 사용할 수 없습니다.
- 사용자 정의 기능을 만들 수 없습이 포함된 경우에는 출력으로 절가 있는 테이블의 대상으로
전체 목록에 나열된 이 링크를https://technet.microsoft.com/en-us/library/ms177564(v=sql.110).aspx
요약
과 같이 위의 예에서 우리가 볼 수 있는 출력 절을 사용하기 쉽고 피할 수 있습의 많은 사용자 지정 코딩하기 위해 캡처를 출력의 결과를 업데이트 값이 오래되고 새로운 값으로 변수 테이블을 실행하는 동안의 쿼리가 있습니다.
Leave a Reply