SQLServer – 将存储过程的结果插入临时表

我该怎么办SELECT * INTO [temp table] FROM [stored procedure]?不FROM [Table],没有定义[temp table]

Select所有数据都可以BusinessLine正常tmpBusLine工作。

select *
into tmpBusLine
from BusinessLine

我正在尝试相同,但使用stored procedure返回数据,并不完全相同。

select *
into tmpBusLine
from
exec getBusinessLineHistory '16 Mar 2009'

输出消息:

消息156,级别15,状态1,行2关键字’exec’附近的语法不正确。

我已经阅读了几个创建一个与输出存储过程结构相同的临时表的例子,它工作正常,但不提供任何列会很好。


你可以使用OPENROWSET。看一看。我还包括sp_configure代码以启用Ad Hoc Distributed Queries,以防它尚未启用。

CREATE PROC getBusinessLineHistory
AS
BEGIN
    SELECT * FROM sys.databases
END
GO

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

SELECT * INTO #MyTempTable FROM OPENROWSET('SQLNCLI', 'Server=(local)\SQL2008;Trusted_Connection=yes;',
     'EXEC getBusinessLineHistory')

SELECT * FROM #MyTempTable

如果要在不先声明临时表的情况下执行此操作,可以尝试创建用户定义的函数而不是存储过程,并使该用户定义的函数返回表。或者,如果您想使用存储过程,请尝试以下方法:

CREATE TABLE #tmpBus
(
   COL1 INT,
   COL2 INT
)

INSERT INTO #tmpBus
Exec SpGetRecords 'Params'

在SQL Server 2005中,您可以使用INSERT INTO ... EXEC将存储过程的结果插入表中。从MSDN的INSERT文档(事实上​​对于SQL Server 2000):

--INSERT...EXECUTE procedure example
INSERT author_sales EXECUTE get_author_sales

这是对您问题的略微修改版本的答案。如果您可以放弃对用户定义函数使用存储过程,则可以使用内联表值用户定义函数。这本质上是一个存储过程(将采用参数),它返回一个表作为结果集; 因此,将很好地与INTO声明。

这是一篇关于它和其他用户定义函数的快速文章。如果仍然需要存储过程,则可以使用存储过程包装内联表值用户定义函数。当存储过程从内联表值用户定义函数调用select *时,它只传递参数。

因此,例如,您有一个内联表值用户定义函数来获取特定区域的客户列表:

CREATE FUNCTION CustomersByRegion 
(  
    @RegionID int  
)
RETURNS TABLE 
AS
RETURN 
  SELECT *
  FROM customers
  WHERE RegionID = @RegionID
GO

然后,您可以调用此函数来获得结果:

SELECT * FROM CustomersbyRegion(1)

或者做一个SELECT INTO:

SELECT * INTO CustList FROM CustomersbyRegion(1)

如果仍需要存储过程,则将函数包装为:

CREATE PROCEDURE uspCustomersByRegion 
(  
    @regionID int  
)
AS
BEGIN
     SELECT * FROM CustomersbyRegion(@regionID);
END
GO

我认为这是获得预期结果的最“无懈怠”的方法。它使用现有功能,因为它们的使用目的没有其他复杂性。通过在存储过程中嵌套内联表值的用户定义函数,您可以通过两种方式访问​​该功能。加!实际的SQL代码只有一个维护点。

已经建议使用OPENROWSET,但这不是OPENROWSET函数的用途(来自联机丛书):

包括从OLE DB数据源访问远程数据所需的所有连接信息。此方法是访问链接服务器中的表的替代方法,是使用OLE DB连接和访问远程数据的一次性临时方法。要更频繁地引用OLE DB数据源,请改用链接服务器。

使用OPENROWSET将完成工作,但是它会产生一些额外的开销,用于打开本地连接和编组数据。它也可能不是所有情况下的选项,因为它需要临时查询许可,这会带来安全风险,因此可能不是所希望的。此外,OPENROWSET方法将排除使用返回多个结果集的存储过程。在单个存储过程中包装多个内联表值用户定义函数可以实现此目的。

添加评论

友情链接:蝴蝶教程