SQL Server: поместите набор результатов хранимой процедуры в табличную переменную без указания ее схемы - PullRequest
12 голосов
/ 30 августа 2011

У меня есть хранимая процедура со многими параметрами.

Я хочу вставить (или, может быть, выбрать), как это:

INSERT INTO @TEMP_TABLE
    EXECUTE STORED_PROCEDURE

без определения схемы @TEMP_TABLE.

Ответы [ 6 ]

21 голосов
/ 30 августа 2011

например:

declare @temptable2 as table
(
 DatabaseName nvarchar(128),
 dbsize nvarchar(128),
 owner varchar(128),
 dbid nvarchar(128),
 created nvarchar(128),
 status nvarchar(128),
 compatibility_level nvarchar(128)
)

INSERT INTO @temptable2
EXEC ('sp_helpdb')
5 голосов
/ 30 августа 2011

Единственный способ добиться этого - использовать обходной обходной путь SELECT INTO таблицы #temp, что принесет больше хлопот, чем оно того стоит.

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

5 голосов
/ 30 августа 2011

Вы не можете сделать это с @tablevariable.

Обходной путь в по ссылке, опубликованной Джо , использует SELECT ... INTO.

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

1 голос
/ 02 декабря 2015
CREATE PROCEDURE [dbo].[Sp_TestA](@P1 AS VARCHAR(50), @P2 AS VARCHAR(50),@P3 AS VARCHAR(50)) AS BEGIN

    SELECT '1' AS Col1,@P1 AS Col2,@P2 AS Col3,@P3 AS Col4 UNION
    SELECT '1' AS Col1,'A1' AS Col2,'A2' AS Col3,'A3' AS Col4 UNION
    SELECT '2' AS Col1,'B1' AS Col2,'B2' AS Col3,'B3' AS Col4 UNION
    SELECT '3' AS Col1,'C1' AS Col2,'C2' AS Col3,'C3' AS Col4 UNION
    SELECT '4' AS Col1,'D1' AS Col2,'D2' AS Col3,'D3' AS Col4;
END

Declare @TblRtRcs TABLE(Col1 VARCHAR(50)NOT NULL,Col2 VARCHAR(50) NOT NULL,Col3 VARCHAR(50) NOT NULL,Col4 VARCHAR(50) NOT NULL);

DECLARE @Sql AS VARCHAR(MAX);

SET @Sql='EXEC [Sp_TestA @P1=''xA'',@P2=''xB'',@P3=''xC''';

INSERT INTO @TblRtRcs(Col1,Col2,Col3,Col4) EXEC(@Sql);

SELECT * FROM @TblRtRcs;
0 голосов
/ 18 октября 2017

Этот ответ @skorpk на самом деле мне кажется правильным ответом на заданный вопрос. Действительно, вы можете вставить в таблицу переменные, как кажется, вопрос указывает. Кроме того, вы также можете сделать это с помощью хранимых процедур, которые ожидайте параметры. Смотрите пример кода ниже:

Этот ответ на самом деле мне кажется правильным ответом на заданный вопрос. Действительно, вы можете вставить в таблицу переменные, как кажется, вопрос указывает. Кроме того, вы также можете сделать это с помощью хранимых процедур, которые ожидайте параметры. Смотрите пример кода ниже:

/*Create stored procedure for this example.       */
/*It will simulate results and we can clean it up */
/*later in this example                           */
create proc sproc_get_friends (@context_user_id int)
as
             select @context_user_id as id, 'me' as name
   union all select 1234678910 as id, 'Jane Doe' as name
   union all select 1112131415 as id, 'John Doe' as name
go

/*Create temp variable*/
declare @tmp as table ( friend_user_id int, friend_name nvarchar(100) )

/*Insert into temp variable from stored procedure*/
INSERT INTO @tmp exec  ('sproc_get_friends 10000')

/*Show data in temp variable*/
select * from @tmp
go

---Clean up
drop proc sproc_get_friends
go
0 голосов
/ 30 августа 2011

В чем ваша проблема?@TEMP_TABLE - тип таблицы.схема не нужна

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