CLR 절차를 사용하는 많은 MSSQL 스크립트가 있습니다. .NET 코드가 SQL 예외를 처리하고 SQL 오류 처리를 우회 할 경우이를 알립니다. 문제는 CLR이 처리되지 않는 예외를 throw하면 SLQ 스크립트가 메시지 창에 메시지를 쓰고 아무 일도 일어나지 않은 것처럼 스크립트 실행을 계속한다는 것입니다. CLR에서 "치명적인"T-SQL 예외를 어떻게 던질 수 있습니까?CLR에서 T-SQL 예외를 던지십시오.
답변
"치명적인"예외를 던지는 것이 바람직하지 않다고 생각합니다. 대신, TSQL은 종료하는 것이 옳은지 여부를 결정해야합니다. 종종 애플리케이션 잠금과 같은 리소스를 해제해야합니다. 그냥 예외에 죽고 싶지 않으면 http://msdn.microsoft.com/en-us/library/ms175976.aspx
, 빈의 try catch 블록에서 기존의 코드를 포장 :
BEGIN TRY
existing statements
END TRY BEGIN CATCH END CATCH;
을이 특별한 경우를 들어
여기 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
프로 시저를 호출했습니다.
- 1. 주요 활동에 예외를 던지십시오.
- 2. 자신의 예외를 던지십시오.
- 3. OpenCL : 수동으로 커널에 예외를 던지십시오.
- 4. GWT. onFailure() 안에 예외를 던지십시오
- 5. 자신의 예외를 적절히 던지십시오 (프로그램을 종료시키지 마십시오)
- 6. CLR에서 처리되고 처리되지 않은 모든 예외를 기록하십시오.
- 7. CLR에서 처리하지 않는 예외를 디버그하는 방법
- 8. 초보자 : 새로운 예외를 던지십시오 - 예외 이름을 바꿀 수 있습니까?
- 9. WiX에서 경고를 던지십시오.
- 10. WPF CLR에서 UIElement로
- 11. CLR에서 EDM으로의 "모호한"매핑
- 12. CLR에서 데이터베이스 백업
- 13. CLR에서 IL을 배우는 방법
- 14. CLR에서 부스트 사용하기
- 15. 런타임에 CLR에서 사용되는 DLL
- 16. TSQL
- 17. TSQL
- 18. TSQL
- 19. TSQL
- 20. TSQL
- 21. TSQL
- 22. TSQL,
- 23. SQL Server 2008의 CLR에서 스레딩
- 24. CLR에서 httputility.urlencode에 대한 system.web이 필요합니까?
- 25. Array Bounds CLR에서 제거 체크?
- 26. clr에서 트리거를 시작한 sqlobject를 검색하십시오.
- 27. CLR에서 기본 힙의 메모리 관리
- 28. CLR에서 액세스 위반 AwareLock :: OwnedByCurrentThread
- 29. CLR에서 포인터로 배열 값에 액세스
- 30. C에서 CLR에서 이벤트를 catch하는 방법
"CLR 절차를 사용하는 많은 MSSQL 스크립트가 있습니다." 나는 그들 각자를 통과하고 그들을 편집하고 싶지 않다는 것을 의미한다. CLR 프로시 저는 여러 시스템에 있으며 드래그 될 수 있습니다. 나는 더 나은 해결책을 발견했다. –
하지만 내 자신의 솔루션을 받아들이지 않으려 고이 또한 작동합니다. 나는 이것을 받아 들일 것이다. –