为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪4524236 2019-05-27 10:57:12
将存储过程的结果插入临时表我该怎么办SELECT * INTO [temp table] FROM [stored procedure]?不FROM [Table],没有定义[temp table]?Select所有数据都可以BusinessLine正常tmpBusLine工作。select *into tmpBusLinefrom BusinessLine我尝试相同,但使用stored procedure返回数据,并不完全相同。select *into tmpBusLinefromexec getBusinessLineHistory '16 Mar 2009'输出消息:消息156,级别15,状态1,行2关键字'exec'附近的语法不正确。我已经阅读了几个创建一个与输出存储过程结构相同的临时表的例子,它工作正常,但不提供任何列会很好。
查看完整描述

4 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

你可以使用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


查看完整回答
反对 回复 2019-05-27
?
跃然一笑

TA贡献1826条经验 获得超6个赞

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

CREATE TABLE #tmpBus(
   COL1 INT,
   COL2 INT)INSERT INTO #tmpBusExec SpGetRecords 'Params'


查看完整回答
反对 回复 2019-05-27
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

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

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

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

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

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

SELECT * FROM CustomersbyRegion(1)

或者做一个SELECT INTO:

SELECT * INTO CustList FROM CustomersbyRegion(1)

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

CREATE PROCEDURE uspCustomersByRegion 
(  
    @regionID int  
)ASBEGIN
     SELECT * FROM CustomersbyRegion(@regionID);ENDGO

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

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

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

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


查看完整回答
反对 回复 2019-05-27
  • 4 回答
  • 0 关注
  • 2690 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信