2013-07-22 2 views
0

CLR 절차를 사용하는 많은 MSSQL 스크립트가 있습니다. .NET 코드가 SQL 예외를 처리하고 SQL 오류 처리를 우회 할 경우이를 알립니다. 문제는 CLR이 처리되지 않는 예외를 throw하면 SLQ 스크립트가 메시지 창에 메시지를 쓰고 아무 일도 일어나지 않은 것처럼 스크립트 실행을 계속한다는 것입니다. CLR에서 "치명적인"T-SQL 예외를 어떻게 던질 수 있습니까?CLR에서 T-SQL 예외를 던지십시오.

답변

0

"치명적인"예외를 던지는 것이 바람직하지 않다고 생각합니다. 대신, TSQL은 종료하는 것이 옳은지 여부를 결정해야합니다. 종종 애플리케이션 잠금과 같은 리소스를 해제해야합니다. 그냥 예외에 죽고 싶지 않으면 http://msdn.microsoft.com/en-us/library/ms175976.aspx

, 빈의 try catch 블록에서 기존의 코드를 포장 :

BEGIN TRY 
    existing statements 
END TRY BEGIN CATCH END CATCH; 
+0

"CLR 절차를 사용하는 많은 MSSQL 스크립트가 있습니다." 나는 그들 각자를 통과하고 그들을 편집하고 싶지 않다는 것을 의미한다. CLR 프로시 저는 여러 시스템에 있으며 드래그 될 수 있습니다. 나는 더 나은 해결책을 발견했다. –

+0

하지만 내 자신의 솔루션을 받아들이지 않으려 고이 또한 작동합니다. 나는 이것을 받아 들일 것이다. –

0

을이 특별한 경우를 들어

여기 TSQL에서 예외 처리에 대한 문서를의 , 어디에서 여러 스크립트를 CLR 절차를 사용하여, 아니 그것의 최고의 솔루션을 각각의 스크립트를 통해 가서 편집 할 수 있기 때문에 그것은 예측할 수없는 행동을 초대 할 수 있습니다. 이 세 가지 솔루션이 유용하다는 것을 알게되었습니다.

I. set xact_abort on은 오류시 현재 트랜잭션을 중지하고 롤백하도록합니다. 그것을 사용하는 방법에는 여러 가지 변형이 있습니다. (각 호출 또는 전체 데이터베이스 전에) 나는 모든 프로 시저를 편집하고 전체 데이터베이스에서 xact_abort를 설정하면 예측할 수없는 일을 할 수 있기 때문에 최상의 솔루션이 아니 었습니다.

II. 기존 CLR 프로 시저의 이름을 바꿉니다. 이름을 변경하기 전에 CLR 프로 시저와 동일한 매개 변수와 이름으로 새 프로 시저를 작성하십시오. 이 코드를 새 프로 시저 호출에 넣으십시오.

set xact_abort on 
exec renamed_clr_procedure @arg1=v1, @arg2=v2, ... 
set xact_abort off 

또한 xact_abort가 이미 설정되어 있지 않은지 확인할 수 있습니다. 그런 다음 renamed_clr_procedure 만 호출하면됩니다.

III. 내가 알았으므로 프로 시저를 실행하기 전에 모든 SQL 프로 시저 (CLR 프로 시저를 포함하는) 호출은 한 곳에서 왔습니다. 프로 시저를 수행하기 전에 set xact_abort on 프로 시저를 호출하고 프로 시저 후에 set xact_abort off 프로 시저를 호출했습니다.