Привет, полезные друзья,
Мы сталкиваемся с проблемой здесь, и я не могу понять, почему она ведет себя так, как она себя ведет. Надеюсь, вы можете мне помочь.
Учитывая следующие две (упрощенные) хранимые процедуры в TSQL (SQL Server 2008R2)
create procedure [datetransaction1]
as
begin
begin try
begin transaction
declare @a datetime
exec datetransaction2 '2013-02-02 22:21', @a output
select @a
exec datetransaction2 '2013-020222:22', @a output
select @a
exec datetransaction2 '2013-02-02 22:23', @a output
select @a
commit transaction
end try
begin catch
print 'Catch'
end catch
end
и
create procedure [dbo].[datetransaction2] @text nvarchar(100), @res datetime OUTPUT
AS
BEGIN
BEGIN TRY
if (LEN(@text) = 16) SET @text = replace(@text, ' ', 'T') + ':00.000'
else if (LEN(@text) = 19) SET @text = replace(@text, ' ', 'T') + '.000'
else SET @text = replace(@text, ' ', 'T')
PRINT 'trydate:' + @text
SELECT @res =convert(datetime, @text, 126)
END TRY
BEGIN CATCH
PRINT ERROR_SEVERITY()
PRINT 'errordate:' + @text
END CATCH
END
Если вы затем выполните exec datetransaction1
, мы увидим, что все 3 вызова datetransaction2
выполнены, причем первая и последняя (как ожидалось) работают правильно, а вторая - в блок CATCH
внутри datetransaction2
.
До сих пор так хорошо.
Но тогда мы приземляемся в блоке catch datetransaction1
с сообщением о невозможности транзакции:
Msg 266, Level 16, State 2, Procedure datetransaction1, Line 0
Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1.
Msg 3998, Level 16, State 1, Line 1
Uncommittable transaction is detected at the end of the batch. The transaction is rolled back.
Что не должно произойти (я думаю). Мы обнаружили ошибки в подпрограммах, поэтому почему транзакция неожиданно стала неучтенной?
Может кто-нибудь объяснить это мне?
Обратите внимание, что мы, возможно, найдем способ обойти это, но я больше заинтригован идеей. Почему эта транзакция внезапно становится неуместной здесь?