SQL EXEC SP С ПАРАМЕТРОМ Во ВРЕМЕННУЮ ТАБЛИЦУ

#sql-server #tsql

#sql-сервер #tsql

Вопрос:

 SELECT * INTO #Temp FROM sp... PARAM1, PARAM2

Error : cannot use insert exec or cannot nested etc..
  

Я хочу выполнить sp с параметром и вставить их во временную таблицу.

любая идея без использования openrowset.

СОЗДАТЬ ТАБЛИЦУ #TempStok (CODE VARCHAR(MAX), STOCKREF VARCHAR(MAX), AMOUNT INT )

ВСТАВИТЬ В #TempStok EXEC spStokMiktar @ID_KULLANICI, @OTURUM, @SIRKETKOD Ошибка: оператор INSERT EXEC не может быть вложенным.

Комментарии:

1. Всегда ли сохраненная процедура выдает один результирующий набор одного и того же формата? Если это так, вы могли бы сначала создать временную таблицу, а затем использовать INSERT #Temp EXEC ...

2. Вы создаете схему для #temp таблицы?

3. Пожалуйста, укажите в своем вопросе используемую вами СУБД, например sql-server-2008

4. Повторно помечен sql-server из-за использования SELECT * INTO #Temp

Ответ №1:

Это сообщение об ошибке сообщает вам о том, что при попытке «пузырькового» извлечения данных из цепочки хранимых процедур ограничение в SQL Server заключается в том, что одновременно может быть активен только один INSERT-EXEC. Вот статья, в которой обсуждается, как решить проблему такого рода.

Если вы по какой-либо причине попытаетесь:

 CREATE TABLE #BigSalesByStore(titleid varchar(80) NOT NULL PRIMARY KEY,
                              qty     smallint    NOT NULL)
INSERT #BigSalesByStore (titleid, qty)
   EXEC BigSalesByStore '7131', 25
  

SQL Server сообщит вам:

 Msg 8164, Level 16, State 1, Procedure BigSalesByStore, Line 8
An INSERT EXEC statement cannot be nested.
  

При условии, что вы можете изменить вызываемую процедуру, есть два способа решить проблему. Один из них — просто добавить комментарий в код вызываемого объекта, чтобы следующий разработчик, который появится, был осведомлен о зависимости и, надеюсь, также изменил вашу процедуру.
Другой способ — использовать типы таблиц (если вы используете SQL 2008 или более позднюю версию). Вот пример:

 CREATE TYPE SalesByStore_tbl AS TABLE 
     (titleid varchar(80) NOT NULL PRIMARY KEY,
      qty     smallint    NOT NULL)
go
CREATE PROCEDURE SalesByStore @storeid varchar(30) AS
   DECLARE @ret SalesByStore_tbl
   INSERT @ret (titleid, qty)
      SELECT t.title, s.qty
      FROM   sales s
      JOIN   titles t ON t.title_id = s.title_id
      WHERE  s.stor_id = @storeid
   SELECT * FROM @ret
go
CREATE PROCEDURE BigSalesByStore @storeid varchar(30),
                                 @qty     smallint AS
   DECLARE @data SalesByStore_tbl
   INSERT @data
      EXEC SalesByStore @storeid
   SELECT title, qty FROM @data WHERE qty >= @qty
go
EXEC SalesByStore '7131'
EXEC BigSalesByStore '7131', 25
go
DROP PROCEDURE SalesByStore, BigSalesByStore
DROP TYPE SalesByStore_tbl
  

Ответ №2:

Вы можете создать таблицу и вставить ее следующим образом…

 CREATE TABLE #Temp(field dataType, field2 dataType... )
  

Затем вы можете вставить в эту таблицу вот так…

 Insert Into #Temp EXEC sp... PARAM1, PARAM2
  

Однако, я думаю, что это более сложно, если временная таблица не создается во время разработки.