_대문 | 방명록 | 최근글 | 홈피소개 | 주인놈 |
FrontPage › SQLServer2005T-SQL
|
|
문서 작성 중...
[edit]
1 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 [edit]
3 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
|
“무릇 물이란 지세를 따라 흐르되 작은 틈도 놓치지 않고 적시니 지혜를 갖춘 자와 같고 움직이면서 아래로 흘러가니 예를 갖춘 자와 같으며 어떤 깊은 곳도 머뭇거리지 않고 들어가니 용기를 가진 자와 같고 장애물이 막혀서 갇히면 고요히 맑아지니 천명을 아는 자와 같으며 험한 곳을 거쳐 멀리 흐르지만 끝내 남을 허물어뜨리는 법이 없으니 덕을 가진 자와 같다. 천지는 이것으로 이루어지고 만물은 이것으로 살아가며 나라는 이것으로 안녕을 얻고 만사는 이것으로 평안해지며 만물은 이것으로 바르게 되는 것이다. 이것이 지혜로운 자가 물을 좋아하는 이유이다.” (한영 <<한시외전>>) |