#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
Однако, я думаю, что это более сложно, если временная таблица не создается во время разработки.