В моем случае хорошо ли мое решение для вложенного оператора INSERT EXEC? - PullRequest
2 голосов
/ 30 мая 2011

Когда я запускаю скрипт ниже, я получаю ошибку INSERT EXEC Statement cannot be nested

Некоторая информация касается хранимой процедуры:

  1. Многократные соединения могут вызывать сохраненную процедуру a
  2. Я не могу использовать UDF, потому что в каждом процессе мне нужно использовать IDENTITY_INSERT , try ... catch blocks

Я подумал создать таблицу с именем tmp и вместо вставки данных во временные таблицы в хранимых процессах b, c они вставят данные в таблицу tmp . Чтобы сопоставить строки конкретному соединению, я могу добавить столбец Group и заполнить его @@ SPID . В конце сохраненного процесса a я удалю все строки определенного @@ SPID , чтобы его можно было использовать с другим соединением. Это хорошее и эффективное решение?

Спасибо

create procedure a
as
begin try
    declare @tbl table(id int)
    insert into @tbl
    exec b
end try
begin catch
end catch


create procedure b
as
begin try
    declare @tbl table(id int)
    insert into @tbl
    exec c

   select * from @tbl
end try
begin catch
end catch


create procedure b
as
begin try
    declare @tbl table(id int)

    insert into @tbl(id)
    values(1)

    select * from @tbl
end try
begin catch
end catch

sdfdf

Ответы [ 2 ]

1 голос
/ 30 мая 2011

В общем, я бы использовал временную таблицу, специфичную для сеанса, чтобы у вас было гораздо меньше накладных расходов на управление прерванными транзакциями и тому подобное, поскольку он очищался.

Недостатком является то, что он немного хрупкий, поскольку зависимости невидимы:

create procedure a
as
    set nocount on
    create table #tbl (id int)
    exec b

    set nocount off
    select * from #tbl
go

create procedure b
as
   set nocount on 

   insert into #tbl
   values(1)
   exec c

go

create procedure c
as
    set nocount on

    insert into #tbl
    values(2)

go 


exec a

Я бы обычно уклонялся от @@SPID определения объема, если вы как-то забудете убрать, вы будетеимеют неожиданные результаты.

Тем не менее, решение, которое вы используете, сильно зависит от имеющейся проблемы. В статье Эрланда Alex connected указаны все возможные варианты.

1 голос
/ 30 мая 2011

Возможно, вы захотите прочитать статью Эрланда Соммарскога, Как обмениваться данными между хранимыми процедурами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...