Rollback intero sql inserito se qualcosa fallisceSto provando a eseguire più inserimenti su tabelle diverse e voglio che vengano eseguiti tutti i rollback in caso di problemi. Ora ho il codice SQL funzionante e si sta ripristinando correttamente, ma non sta sollevando l'errore su odbc. JMP restituisce solo un valore mancante. Qualcuno sa come assicurarsi che il raiserror () si presenti correttamente su ODBC? Solleva correttamente l'errore se eseguo lo stesso codice direttamente in 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);
Ri: Rollback intero sql inserire se qualcosa fallisce @vince_faller , Mi considero ancora un "hacker" SQL, quindi non un esperto. Solo guardando il tuo SQL e sapendo che un TREG BEGIN termina con un COMMIT TRAN o un ROLLBACK TRAN, forse la sezione SELECT di SQL per catturare i messaggi di errore dovrebbe verificarsi prima del ROLLBACK ???
Questa è solo una supposizione selvaggia. Si prega di inviare se si trova una soluzione.
Ri: Rollback intero sql inserire se qualcosa fallisceNessun amore. Ancora non ottenere nulla indietro.
Ri: Rollback intero sql inserire se qualcosa fallisceQuesta è una soluzione approssimativa, ma prima di eseguire la transazione inserisci un valore in una tabella di stato come "Elaborazione" e esegui il commit.
Quindi fai la tua transazione. Dopo aver eseguito il commit, modifica il valore della tabella di stato su "Fatto". Se le tue transazioni falliscono e passi alla sezione di rollback la tua tabella di stato mostrerà ancora "Processing". Quindi, dopo la chiamata per le tue transazioni principali, controlla la tua tabella di stato. Se dice ancora "Elaborazione", saprai che è stato eseguito un rollback.