Le code suivant s'exécute comme prévu. La ligne est insérée.La validation de transaction a-t-elle démarré en SQL dynamique?
create table #t1(a datetime2)
declare @s nvarchar(max) = N'
-- Some expensive remote query should not be in the transaction
begin tran
insert #t1 select getdate()';
exec (@s);
commit; -- replace commit to rollback will rollback the transaction
select * from #t1
Cependant, il a l'erreur suivante?
Msg 266, Niveau 16, État 2, Ligne 31
Nombre de transactions après EXECUTE indique un numéro de désadaptation de Begin et COMMIT. Nombre précédent = 0, nombre actuel = 1.
Mise à jour: J'ai trouvé que la déclaration insert
dans le SQL dynamique ne sera pas exécutée si je mets le code dans un bloc try/catch. Cependant, il a toujours l'erreur.
begin try
declare @s nvarchar(max) = N'
-- Some expensive query should not be in the transaction
begin tran
insert #t1 select getdate()';
exec (@s);
commit
end try
begin catch
select ERROR_NUMBER(), ERROR_MESSAGE(), ERROR_LINE(), @@TRANCOUNT
if @@TRANCOUNT > 0
rollback
end catch
select * from #t1
Qu'essayez-vous d'éviter ou d'éviter en empruntant cette route? –
Ne pouvez-vous pas contenir 'exec (@s)' dans une transaction? – Leonidas199x
Faites vos trucs de chaîne et enfin faire quelque chose comme ... BEGIN TRAN EXEC (@s) COMMIT –