SQL Server 2005 에서 Try Catch 처리 이상 사용

TRY...CATCH 는 Sql Server 2005/2008 의 인상적 인 새로운 기능 입 니 다.개발 자의 이상 처리 능력 을 향상 시 켰 습 니 다.Try..Catch 기능 을 시도 하지 않 을 이유 가 없습니다.
*TRY 블록-이상 이 발생 할 수 있 는 코드 나 스 크 립 트 포함
*CATCH 블록-TRY 블록 에 이상 이 생기 면 코드 처리 흐름 은 CATCH 블록 으로 연 결 됩 니 다.여기에서 이상 을 처리 하고 로그 등 을 기록 할 수 있 습 니 다.
Sql 서버 의 Try Catch 와 C\#,JAVA 등 언어의 처리 방식 이 일맥상통 합 니 다.이러한 일치 성 이 야 말로 가장 큰 혁신 점 입 니 다.
1.SQL SERVER 2000 이상 처리

CREATE PROC usp_AccountTransaction 
 
  @AccountNum INT, 
 
  @Amount DECIMAL 
 
AS 
 
BEGIN 
 
  BEGIN TRANSACTION --beginning a transaction.. 
 
    UPDATE MyChecking SET Amount = Amount - @Amount 
 
      WHERE AccountNum = @AccountNum 
 
    IF @@ERROR != 0 --check @@ERROR variable after each DML statements.. 
 
    BEGIN 
 
      ROLLBACK TRANSACTION --RollBack Transaction if Error.. 
 
      RETURN 
 
    END 
 
    ELSE 
 
    BEGIN 
 
      UPDATE MySavings SET Amount = Amount + @Amount 
 
        WHERE AccountNum = @AccountNum 
 
      IF @@ERROR != 0 --check @@ERROR variable after each DML statements.. 
 
      BEGIN 
 
        ROLLBACK TRANSACTION --RollBack Transaction if Error.. 
 
        RETURN 
 
      END 
 
      ELSE 
 
      BEGIN 
 
        COMMIT TRANSACTION --finally, Commit the transaction if Success.. 
 
        RETURN 
 
      END 
 
    END 
 
END 
 
GO 
위 는 Sql server 2000 의 저장 과정 입 니 다.모든 데이터 베 이 스 를 조작 한 후에@@ERROR 를 검사 하고 Commit/RollBack 을 진행 해 야 합 니 다.
Sql server 2000 에서 오 류 를 감 측 할 수 있 습 니 다.전 체 를 감 측 하여@@ERROR 을 옮 길 수 있 습 니 다.@@ERROR 은 다음 데이터 베이스 작업 에 의 해 덮어 쓰기 때문에 매번 작업 이 끝 난 후에 즉시 감 측 해 야 합 니 다.
2.SQL SERVER 2005 에서 이상 처리
TRY...CATCH 는 SQL Server 2005 에서 제공 하 는 더욱 읽 을 수 있 는 문법 입 니 다.모든 개발 자 들 은 이러한 표기 법 을 잘 알 고 있 습 니 다.SQL Server 2005 는 여전히@ERROR 라 는 용법 을 지원 합 니 다.
1.try catch 문법:

BEGIN TRY 
 
  Try Statement 1 
 
  Try Statement 2 
 
  ... 
 
  Try Statement M 
 
END TRY 
 
BEGIN CATCH 
 
  Catch Statement 1 
 
  Catch Statement 2 
 
  ... 
 
  Catch Statement N 
 
END CATCH 
2.잘못된 정 보 를 얻 는 함수 표:
아래 시스템 함 수 는 CATCH 블록 에서 유효 합 니 다.더 많은 오류 정 보 를 얻 을 수 있 습 니 다.
함수. 묘사 하 다.
ERROR_NUMBER() CATCH 블록 을 실행 하 는 오류 메시지 의 오류 번 호 를 되 돌려 줍 니 다.
ERROR_SEVERITY() CATCH 블록 이 실 행 된 오류 메시지 의 심각 한 단 계 를 되 돌려 줍 니 다.
ERROR_STATE() CATCH 블록 이 실 행 된 오류 메시지 의 상태 번 호 를 되 돌려 줍 니 다.
ERROR_PROCEDURE() 오류 가 발생 한 저장 프로시저 이름 을 되 돌려 줍 니 다.
ERROR_LINE() 잘못된 줄 번호 되 돌리 기
ERROR_MESSAGE() CATCH 블록 이 실 행 된 오류 메시지 의 전체 텍스트 를 되 돌려 줍 니 다.
간단 한 예제:

BEGIN TRY 
 
  SELECT GETDATE() 
 
  SELECT 1/0--Evergreen divide by zero example! 
 
END TRY 
 
BEGIN CATCH 
 
  SELECT 'There was an error! ' + ERROR_MESSAGE() 
 
  RETURN 
 
END CATCH; 

3.try catch 스크롤 백/제출 트 랜 잭 션 의 예제

ALTER PROC usp_AccountTransaction 
 
  @AccountNum INT, 
 
  @Amount DECIMAL 
 
AS 
 
BEGIN 
 
  BEGIN TRY --Start the Try Block.. 
 
    BEGIN TRANSACTION -- Start the transaction.. 
 
      UPDATE MyChecking SET Amount = Amount - @Amount 
 
        WHERE AccountNum = @AccountNum 
 
      UPDATE MySavings SET Amount = Amount + @Amount 
 
        WHERE AccountNum = @AccountNum 
 
    COMMIT TRAN -- Transaction Success! 
 
  END TRY 
 
  BEGIN CATCH 
 
    IF @@TRANCOUNT > 0 
 
      ROLLBACK TRAN --RollBack in case of Error 
 
    -- you can Raise ERROR with RAISEERROR() Statement including the details of the exception 
 
    RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1) 
 
  END CATCH 
 
END 
 
GO
3.실례 설명
오류 로그 시트 만 들 기:

CREATE TABLE ErrorLog(errNum INT,ErrSev NVARCHAR(1000),ErrState INT,ErrProc NVARCHAR(1000),ErrLine INT, ErrMsg NVARCHAR(2000))
오류 로그 기록 저장 프로시저 만 들 기:

CREATE PROCEDURE ErrorLog
AS 
   SELECT ERROR_NUMBER() AS ErrNum,ERROR_SEVERITY()AS ErrSev,ERROR_STATE() AS ErrState,ERROR_PROCEDURE() AS ErrProc,ERROR_LINE()AS ErrLine,ERROR_MESSAGE()AS ErrMsg 
   INSERT 
   INTO ErrorLog 
   VALUES(ERROR_NUMBER(),ERROR_SEVERITY(),ERROR_STATE(),ERROR_PROCEDURE(),ERROR_LINE(),ERROR_MESSAGE())
GO
저장 프로 세 스 를 써 주세요!안에 Try Catch 를 사용 해 보 세 요.

USE [Your_Test]
GO
/****** Object: StoredProcedure [dbo].[getTodayBirthday]  
    Script Date: 05/17/2010 15:38:46 
    Author:jinho
    Desc:          
    ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[getTodayBirthday]
AS
BEGIN TRY
 declare @today datetime; 
 SET @today = GETDATE();--       
 DECLARE @day VARCHAR(2);
 SET @day =REPLACE(DAY(@today),0,'');
 DECLARE @month VARCHAR(2) ;
 SET @month = REPLACE(month(@today),0,'');
 DECLARE @year VARCHAR(4);
 SET @year = YEAR(@today);
 SELECT * FROM dbo.UserInfo WHERE REPLACE(DAY(CONVERT(DATETIME,Birthday )),0,'') =@day AND REPLACE(MONTH(CONVERT(DATETIME,Brithday)),0,'')=@month AND Birthday IS NOT NULL 

 END TRY
 BEGIN CATCH
 ErrorLog --         ,      
 END CATCH
설명:ERRORNUMBER(),ERROR_SEVERITY(),ERROR_STATE(),ERROR_PROCEDURE(),ERROR_LINE(),ERROR_MESSAGE()이 몇 개의 함 수 는 Catch 에 만 사용 할 수 있 습 니 다!

좋은 웹페이지 즐겨찾기