SQL Server 2005 에서 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 에 만 사용 할 수 있 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.