Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 INSERT INTO @tab EXEC MyProc  [new]
mezzanine
Member

Откуда:
Сообщений: 157
Добрый день.
Процедура может возвращать несколько "result sets", в моем случае он гарантировано один и записываю его в таблицу:
INSERT INTO @tab EXEC MyProc


Все нормально. Но когда в процедуре MyProc возникает исключение то получаю ошибку: "Текущая транзакция не может быть зафиксирована и не может поддерживать операции, производящие запись в файл журнала. Выполните откат транзакции."

Как можно выполнить такой insert только в случае успешного выполнения процедуры.
4 янв 16, 13:40    [18641052]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO @tab EXEC MyProc  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Видимо для начала не плохо бы увидеть, что там внутри процедуры, а то мало ли
4 янв 16, 13:41    [18641061]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO @tab EXEC MyProc  [new]
Glory
Member

Откуда:
Сообщений: 104751
mezzanine
Как можно выполнить такой insert только в случае успешного выполнения процедуры.

Синтаксис INSERT-а не меняется в зависимости от того, как закончилась процедура
4 янв 16, 14:26    [18641181]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO @tab EXEC MyProc  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Glory
Синтаксис INSERT-а не меняется в зависимости от того, как закончилась процедура

он ,скорее всего про то,что не могет такая конструция быть вложеной
4 янв 16, 14:37    [18641203]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO @tab EXEC MyProc  [new]
mezzanine
Member

Откуда:
Сообщений: 157
Winnipuh,

Вы правы. Начал делать тестовые процедуры и выяснилась интересная вещь. Если в процедуре MyProc2 вызвать исключение через THROW то все отлично, если ошибка на проверки XML (SET @xml = 'test';) то получаю выше описанную ошибку.

Вызов, где получаем ошибку:
DECLARE @result NVARCHAR(100),
        @error NVARCHAR(1000);

EXEC dbo.MyProc1 @result = @result OUTPUT,
                 @error = @error OUTPUT;

SELECT @result AS result,
       @error AS error;


ALTER PROCEDURE dbo.MyProc1 (
  @result NVARCHAR(100) OUTPUT,
  @error NVARCHAR(1000) OUTPUT
)
AS
BEGIN TRY
  SET NOCOUNT ON;

  DECLARE @tab TABLE (
    id INT
  );

  INSERT INTO @tab EXEC dbo.MyProc2 @result = @result OUTPUT,
                                    @error = @error OUTPUT;

  SET @result = 'SYSTEM.OK';

END TRY
BEGIN CATCH
  SET @result = 'SYSTEM.ERROR';
  SET @error = SUBSTRING(FORMATMESSAGE('[%d]: %s', ERROR_LINE(), ERROR_MESSAGE()), 1, 1000);
END CATCH
GO


ALTER PROCEDURE dbo.MyProc2 (
  @result NVARCHAR(100) OUTPUT,
  @error NVARCHAR(1000) OUTPUT
)
AS
BEGIN TRY
  SET NOCOUNT ON;

  DECLARE @xml AS XML(BuildUsersListSchema);
  SET @xml = 'test';

  THROW 50000, 'Test error', 1;

  SELECT 10;

  SET @result = 'SYSTEM.OK';

END TRY
BEGIN CATCH
  SET @result = 'SYSTEM.ERROR';
  SET @error = SUBSTRING(FORMATMESSAGE('[%d]: %s', ERROR_LINE(), ERROR_MESSAGE()), 1, 1000);
END CATCH
GO
4 янв 16, 14:37    [18641204]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO @tab EXEC MyProc  [new]
Glory
Member

Откуда:
Сообщений: 104751
mezzanine
то получаю выше описанную ошибку.

А вы ее прочитали ?
Откуда взялась транзакция, которая "не может быть зафиксирована и не может поддерживать операции, производящие запись в файл журнала. Выполните откат транзакции" ?
4 янв 16, 14:40    [18641210]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO @tab EXEC MyProc  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
mezzanine,

Вся проблема в бездумном применении конструкции try ... catch. Что она здесь делает - совсем непонятно.

Сообщение было отредактировано: 4 янв 16, 14:41
4 янв 16, 14:41    [18641212]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO @tab EXEC MyProc  [new]
mezzanine
Member

Откуда:
Сообщений: 157
pkarklin,

Есть такое требование все процедуры "заворачивать" в try ... catch. Получается что процедура всегда (ну почти) выполниться успешно и insert пытается выполниться непонятно над чем.

Всем спасибо за ответы.
4 янв 16, 14:50    [18641230]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO @tab EXEC MyProc  [new]
Glory
Member

Откуда:
Сообщений: 104751
mezzanine
и insert пытается выполниться непонятно над чем.

С чего вы взяли, что дело доходит до insert-а ?
4 янв 16, 15:00    [18641262]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO @tab EXEC MyProc  [new]
mezzanine
Member

Откуда:
Сообщений: 157
Glory,

Пока чисто догадка из ошибки.
4 янв 16, 15:03    [18641270]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO @tab EXEC MyProc  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
mezzanine
pkarklin,

Есть такое требование все процедуры "заворачивать" в try ... catch. Получается что процедура всегда (ну почти) выполниться успешно и insert пытается выполниться непонятно над чем.

Всем спасибо за ответы.


Я сделал так вместо вашей схемы

DECLARE @xml XML;

и все сработало ок.
4 янв 16, 15:33    [18641350]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO @tab EXEC MyProc  [new]
mezzanine
Member

Откуда:
Сообщений: 157
Winnipuh,

Да, я писал выше что с простым THROW работает, а если ошибка валидации XML схемы то результат странный.
4 янв 16, 16:23    [18641510]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO @tab EXEC MyProc  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
mezzanine
Winnipuh,

Да, я писал выше что с простым THROW работает, а если ошибка валидации XML схемы то результат странный.


я не совсем понял, ошибка ловится, реагируйте или вас сам текст сообщения не устраивает?
5 янв 16, 13:02    [18643679]     Ответить | Цитировать Сообщить модератору
 Re: INSERT INTO @tab EXEC MyProc  [new]
mezzanine
Member

Откуда:
Сообщений: 157
Winnipuh,

Реакция на исключения настораживает. Если вызвать исключение через THROW то работает, если исключение системное при проверки XML то валиться на insert-е.
5 янв 16, 18:09    [18644751]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить