ASP.NET의 개발을 보면 EF와 같은 ORM 편리한 기능도 있지만
DB 데이터를 직접적으로 제어하기 위해 SQL을 사용한다면 프로시저를 사용하는 경우가 더 많다.
예를 들어 INNER JOIN + OUTER JOIN의 조합이 섞인 JOIN 테이블이 5개가 넘어가고
테이블 하나의 데이터가 3000만건이 넘는 상황이며 매개변수 값에 따라 ORDER BY 의 형태가 여러 형태면
ORM으로 속도 개선을 하는데 어려움이 있기에 프로시저를 사용하는 케이스가 많다.
그리고 규모가 있는 프로젝트에서는 DBA에게 쿼리 관련 도움을 받아야 하기 때문에 ORM을
사용하지 않는 경우도 있다.
그렇기에 프로시저안에서 TRY/CATCH 와 트랜잭션을 거는 예시를 살펴보자
1. C# 프로그램 TRY/CATCH 와 트랜잭션 작성 예시
- ORM 이나 프로시저를 사용하더라도 프로그램에서 트랜잭션 스코프를 사용하여 거는 방법이 있다
https://learn.microsoft.com/ko-kr/dotnet/framework/data/transactions/implementing-an-implicit-transaction-using-transaction-scope
2. SQL쿼리문에서 TRY/CATCH
- SQL에서 TRY/CATCH 는 굉장히 단순하다.
BEGIN TRY
-- 'DOG' 란 문자열을 INT로 형변환 하려니 TRY를 빠져나가 CATCH로 가게된다
SELECT CAST('DOG' AS INT)
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH
- 이 부분을 트랜잭션 구문과 같이 묶어 보자
- 이 코드를 복사하여 SQLFiddle 에서 테스트 할 수 있습니다.
CREATE TABLE #T0
(
NO INT
);
DECLARE @VAL VARCHAR(20)
SET @VAL = 'Dog'; -- 이 곳의 값이 '1'이면 성공을 하겠지만 'Dog'면 실패한다
BEGIN
BEGIN TRY
BEGIN TRAN
INSERT #T0 VALUES (@VAL);
SELECT 'SUCCESS' AS Result;
COMMIT TRAN;
END TRY
BEGIN CATCH
-- 이 값들을 Log테이블을 만들어 담는 것도 방법이다.
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure -- 오류 프로시저
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage; -- 오류 메세지
-- 0: 트랜잭션 상태가 비활성
IF XACT_STATE() <> 0
ROLLBACK TRAN;
END CATCH;
END;
-- TRY/CATCH
'DB > SQLServer' 카테고리의 다른 글
엑셀파일을 =CONCATNATE() 함수를 통해 밀어 넣기 (1) | 2024.09.25 |
---|---|
Merge 문을 통해 단일 테이블 Insert/Update/Delete 프로시저 생성 (0) | 2024.09.24 |
Poor Man's T-SQL Formatter SSMS 쿼리 들여쓰기 정리 (1) | 2024.08.29 |
비트 연산 (0) | 2021.05.28 |
DB내 프로시저/함수/뷰 내 속해있는 문자열 검새 (0) | 2020.06.05 |