Programming/Microsoft SQL Server
Insert, Update, Delete를 통해 Table이 변경될때는 우선 내용을 일시적으로 담고 있는 임시Table이 Server의 Merory상에 생성되고 변경이 완료되면(해당 변경구문의 Transaction이 종료되는 시점) 그 즉시 다시 사라지게 됩니다. 이때 Output(보통 Trigger에서 많이 사용되는)을 사용하면 Table이 변경될때의 Data를 일시적으로나마 확인할 수 있게 됩니다.

아래는 Output을 통해 변경 Data를 확인하는 예제입니다.

Insert Into HumanResources.Department
Output inserted.*
Values('Executive', 'Executive General and Administration', getdate())


Update HumanResources.Department
Set Name = 'Management',
 GroupName = 'Management Group'
Output deleted.*, inserted.*,
Where DepartmentID = 16

Update의 경우에는 Update를 위한 별도의 임시Table이 존재하지 않고 이와 관련된 Inserted와 Deleted Table이 생성됩니다.

즉 변경하기전 Data는 Deleted에 또한 변경할 Data는 Inserted에 담게 되는 것입니다.(즉, Update는 Data삭제와 추가를 병행함으로서 실질적인 변경작업을 수행합니다.)


Delete From HumanResources.Department
Output deleted.*
Where DepartmentID = 16


Select문에서도 사용되는 * 문자는 해당 Table의 모든 열을 의미합니다. 만일 별도의 열값만 조회할 필요가 있다면 다음과 같이 * 대신 열이름을 지정해 줄 수도 있습니다.

Insert Into HumanResources.Department
Output inserted.Name, inserted.GroupName
Values('Executive', 'Executive General and Administration', '1998-06-01 00:00:00.000')


Output을 활용하면 편법이긴 합니다만 Table이 변경되는 이력(일종의 Log)을 남겨두는 용도로 쓰이기도 합니다.

예를 들어 HumanResources.Department Table에서 Data가 삭제될때마다 삭제되는 Data의 이력을 남겨두고자 한다면 우선 HumanResources.Department Table과 동일한 형태의 Log Table을 만들고

Create Table HumanResources.Department_DeleteLog(
 DepartmentID Smallint,
 Name   nVarChar(50),
 GroupName  nVarChar(50),
 ModifiedDate DateTime
)

Delete 문으로 HumanResources.Department Table을 삭제시 Output을 이용해 위에서 만든 Log Table에 삭제되는 Data를 담아두는 것입니다.

Delete From HumanResources.Department
Output deleted.* Into HumanResources.Department_DeleteLog
Where DepartmentID = 16

Output을 통해 HumanResources.Department_DeleteLog의 Log Table에 삭제되는 Data를 저장합니다.

Select *
From HumanResources.Department_DeleteLog

삭제된 이력을 확인합니다.


다만 다음과 같이 임시Table을 만드는 동시에 Data를 저장하는 방법은 통하지 않으니 Log Table을 미리 만들어 둬야 합니다.

Select *
Into #Temp
From HumanResources.Department

'Programming > Microsoft SQL Server' 카테고리의 다른 글

[SQL] Coalesce 와 Nullif  (0) 2010.09.14
[SQL] xact_abort와 Transaction  (0) 2010.09.13
[SQL] Output으로 변경Data 확인하기  (0) 2010.09.10
[SQL Server] SQLCMD  (0) 2010.09.09
[SQL] 케이스(Case)  (0) 2010.09.07
[SQL] 예외처리(try ~ catch)  (0) 2010.09.06
0 0