#title SQL Server 2005 T-SQL [[TableOfContents]] 문서 작성 중... ==== Data Type ==== 기존에는 varchar, nvarchar, varbinary는 8000바이트의 제한을 가졌었다. 그러나 2005 버전에서는 max 키워드를 사용하여 2GB까지 사용할 수 있게 되었다. XML 데이터 타입도 새로 만들어졌고, 역시 2GB까지 사용할 수 있다. {{{ Use AdventureWorks Go Create Table SalesData.Max_Varchar_Table( Max_Varchar Varchar(Max) , Max_nVarchar nVarchar(Max) , Max_varBinary varBinary(Max) ) Go Create Table SalesData.Max_XML_Table( Max_XML_Col XML) Go }}} ==== Partitioned Function & Table ==== ==== Try ... Catch ==== 이전 버전에서는 예외처리가 좀 구렸던 것이 사실이다. 이런 것을 반영하듯 Try … Catch 구문이 생겨나 버렸다. 이 구문을 사용하기 위해서는 “If @@Error” 코드가 주로 사용되기도 하며, XACT_ABORT ON 옵션이 필요할 수도 있다. {{{ BEGIN TRY { sql_statement | statement_block } END TRY BEGIN CATCH { sql_statement | statement_block } END CATCH [ ; ] }}} 다음은 Try … Catch의 간단한 예이다. 위의 문법과 같이 중간에 Go 와 같은 실행단위의 문자가 들어가면 안 된다. {{{ BEGIN TRY SELECT * FROM sys.messages WHERE message_id = 21; END TRY -- GO -- The previous GO breaks the script into two batches, -- generating syntax errors. The script runs if this GO -- is removed. BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber; END CATCH; GO }}} 또한 다음과 같이 Error Message를 뿌려줄 수도 있다. {{{ USE AdventureWorks; GO BEGIN TRANSACTION; GO BEGIN TRY -- Generate a constraint violation error. DELETE FROM Production.Product WHERE ProductID = 980; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() as ErrorState, ERROR_MESSAGE() as ErrorMessage; END CATCH GO ROLLBACK TRANSACTION; GO }}} Try … Catch를 이용하는 또 다른 2가지 방법을 소개하도록 하겠다. 첫 번째 방법은 @@Error를 이용하는 방법이다. 예제에서는 Insert에 문제가 없다면 Commit 하고, 문제가 발생하면 Catch로 이동하는 형식을 취하고 있다. 예제에서는 XACT_ABORT ON과 @@Error가 필요하다. @@Error는 옵션이며, XACT_ABORT는 반드시 필요하다. {{{ Use Tempdb Go CREATE TABLE dbo.DataTable (ColA int PRIMARY KEY, ColB int) CREATE TABLE dbo.ErrorLog (ColA int, ColB int, error int, date datetime) GO CREATE PROCEDURE dbo.AddData @a int, @b int AS SET XACT_ABORT ON BEGIN TRY BEGIN TRAN INSERT INTO dbo.DataTable VALUES (@a, @b) COMMIT TRAN END TRY BEGIN CATCH DECLARE @err int SET @err = @@error --trap the error number ROLLBACK TRAN INSERT INTO dbo.ErrorLog VALUES (@a, @b, @err, GETDATE()) END CATCH GO EXEC dbo.AddData 1, 1 EXEC dbo.AddData 2, 2 EXEC dbo.AddData 1, 3 --violates the primary key Select * From dbo.ErrorLog Go /* ColA ColB error date ----------- ----------- ----------- ----------------------- 1 3 2627 2005-02-12 13:54:54.377 (1 row(s) affected) */ }}} 두 번째 예제에서 눈여겨 볼 것은 XACT_STATE()를 이용한 것이다. -1 이면 트랜잭션이 어떤 이유에서인지는 모르지만 실패한 것을 나타내며, 1이면 성공이다. 0이면 진행 중이다. 이러한 것을 이용하여 XACT_ABORT ON과 COMMIT TRAN에 대해서 주석처리 하여 다른 방법을 사용하였다. 또한 무조건 Error가 발생한 것처럼 가장해야 하므로 RAISERROR를 사용한 것을 볼 수 있다. 이 예제에서 RAISERROR는 반드시 필요하다. {{{ Use Tempdb Go CREATE TABLE dbo.DataTable (ColA int PRIMARY KEY, ColB int) CREATE TABLE dbo.ErrorLog (ColA int, ColB int, error int, date datetime) GO CREATE PROCEDURE dbo.AddData @a int, @b int AS --SET XACT_ABORT ON BEGIN TRY BEGIN TRANSACTION; INSERT INTO dbo.DataTable VALUES (@a, @b) RAISERROR(N'Throw an error.', 16, 1); -- Need --COMMIT TRAN END TRY BEGIN CATCH DECLARE @err int IF (XACT_STATE()) = -1 ROLLBACK TRANSACTION; SET @err = @@error --trap the error number INSERT INTO dbo.ErrorLog VALUES (@a, @b, @err, GETDATE()) IF (XACT_STATE()) = 1 COMMIT TRANSACTION; END CATCH GO EXEC dbo.AddData 1, 1 EXEC dbo.AddData 2, 2 EXEC dbo.AddData 1, 3 --violates the primary key Select * From dbo.ErrorLog Go }}}