실패 할 경우 전체 SQL 삽입 삽입나는 여러 테이블에 여러 개의 insert를 실행하려고하는데, 실패 할 경우 롤백 할 수 있기를 바란다. 이제 SQL 코드가 작동하고 올바르게 롤백되지만 ODBC를 통해 오류가 발생하지 않습니다. JMP는 그냥 누락 된 값을 반환합니다. 누구든지 ODBC를 통해 raiserror ()가 올바르게 표시되는지 확인하는 방법을 알고 있습니까? SQL에서 동일한 코드를 직접 실행하면 오류가 올바르게 발생합니다.
dbc = Create database connection("DRIVER=SQL SERVER;SERVER=.\;Database=Test");
rfail = executeSQL(dbc,
"
DECLARE @TransactionName varchar(20) = 'Transaction1';
BEGIN TRY
BEGIN TRAN @TransactionName
INSERT INTO [dbo].Test1
(A --varchar
,B --Int
)
VALUES
('Test Fail'
,1
)
DECLARE @ID bigint
SELECT @ID = SCOPE_IDENTITY()
INSERT INTO [dbo].Test2
(T1ID --Test1 ID
,A --varchar
)
VALUES
(@ID
,14
)
COMMIT TRAN @TransactionName
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
IF @@TRANCOUNT > 0
ROLLBACK TRAN @TransactionName
SELECT
@ErrorMessage=ERROR_MESSAGE(),
@ErrorSeverity=ERROR_SEVERITY(),
@ErrorState=ERROR_STATE();
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
END CATCH
",
);
close database connection(dbc);
재 : 아무것도 실패하면 전체 SQL 삽입을 롤백 @vince_faller , 나는 여전히 자신을 SQL "해커"라고 생각하지는 않습니다. 전문가입니다. 당신의 SQL을보고 BEGIN TRAN이 COMMIT TRAN 또는 ROLLBACK TRAN으로 끝나는 것을 알고, 아마도 ROLLBACK 전에 오류 메시지를 캡처하기위한 SQL의 SELECT 섹션을 만들어야합니까 ???
이것은 단순한 추측입니다. 해결책을 찾으면 게시하십시오.
재 : 아무것도 실패하면 전체 SQL 삽입을 롤백사랑이 없다. 아직도 아무것도 얻지 못합니다.
재 : 아무것도 실패하면 전체 SQL 삽입을 롤백이것은 근본적인 해결책이지만, 트랜잭션 전에 "처리 중"과 같은 상태 테이블에 값을 삽입하고 커밋하십시오.
그런 다음 거래를하십시오. 커밋을 한 후에 상태 테이블 값을 "완료"로 변경하십시오. 거래가 실패하고 롤백 섹션으로 이동하면 상태 테이블에 여전히 "처리 중"이 표시됩니다. 주 거래 요청이 접수되면 상태 표를 확인하십시오. "처리 중"이라면 롤백이 수행되었음을 알 수 있습니다.