存储过程不支持INSERT / EXECUTE INTO的功能原因?

时间:2009-07-16 15:34:26

标签: sql-server tsql stored-procedures temp-tables

在SQL Server中,无法从存储过程的结果中动态创建临时表,ala:

CREATE TABLE #temptable AS
EXEC spMyStoredProc

EXEC spMyStoredProc INTO #temptable

或类似的东西。相反,您必须事先知道SP布局,并且必须执行以下操作:

CREATE TABLE #temptable (col1 INT, col2 VARCHAR(255))

INSERT INTO #temptable
EXEC spMyStoredProc

是否有这样的功能性原因?可能是SQL Server的限制?或者它只是尚未添加到SQL规范中的东西,我希望有一天他们会支持它?

4 个答案:

答案 0 :(得分:10)

存储过程可以返回许多结果集,也可以不返回任何结果集,并且它可以完全根据存储过程的执行而变化。

编译时,它的元信息并未将其描述为具有任何特定的可预期结果集输出。

我希望考虑到这些限制,他们选择不执行此操作,因为缺少对存储过程可能返回的强类型。

答案 1 :(得分:0)

不是来自sproc,但你可以使用tabled values函数来做类似的事情。

Select * From fnMyFunction

如果需要,您可以插入#表。

答案 2 :(得分:0)

试试这个

DECLARE @temptable TABLE (ID INT, NAME VARCHAR(255))

declare @query varchar(max)

set @query='Select whatever from whereever'

INSERT INTO @temptable

EXEC (@Query)

select *from @temptable

答案 3 :(得分:0)

如果我需要这样的功能,我会使用内联UDF,如下所示:

CREATE PROCEDURE MySample
AS
SELECT a,b,c FROM dbo.MyInlineUDF(1,2,3)
GO

SELECT * INTO #t
FROM dbo.MyInlineUDF(1,2,3) WHERE 1=0

INSERT INTO #t EXEC MySample