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
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方法将排除使用返回多个结果集的存储过程。在单个存储过程中包装多个内联表值用户定义函数可以实现此目的。
添加回答
举报