将动态结果存储到临时表中的存储过程

时间:2016-02-10 19:07:58

标签: sql sql-server

我在SQL 2014中有一个存储过程,它在内部进行动态查询并返回两个静态列,其余列是动态的。如果我需要将sp的结果放入临时表中,我需要使用列和数据类型的名称创建临时表。

如何在不声明临时表的情况下将结果放入临时表中?

这就是我所说的:

SELECT * INTO #TempTable 
FROM OPENROWSET
('SQLNCLI','Server=cimplsql-d1.turtle.local;Trusted_Connection=yes;', 'EXEC [dbo].[AttributeSelect] ''2016-01-01'', ''2016-01-01'', 1')

我不能很好地定义我的临时表,因为结果是动态的,它可以返回4,10或20列,我不知道。

现在这是错误:

The metadata could not be determined because statement 'EXEC SP_EXECUTESQL @Qry;' in procedure 'AttributeEntitiesSelect'  contains dynamic SQL.  Consider using the WITH RESULT SETS clause to explicitly describe the result set.

我在sp中的动态sql中使用了WITH RESULT SETS UNDEFINED选项,但是没有用

2 个答案:

答案 0 :(得分:1)

您需要使用open rowset

SELECT * INTO #TempTable 
FROM OPENROWSET
('SQLNCLI','Server=yourservername;Trusted_Connection=yes;',
     'EXEC OtherDb.DataProd.abc')

SELECT * FROM #TempTable

Rowset处理查询结果,而不是query.so动态表是可能的,你还需要启用adhoc分布式查询

从MSDN中提取:

是否向提供程序发送并执行字符串常量。 SQL Server的本地实例不处理此查询,而是处理提供程序返回的查询结果,即传递查询。传递查询在用于不通过表名提供表格数据但仅通过命令语言提供表格数据的提供程序时非常有用。只要查询提供程序支持OLE DB Command对象及其强制接口,远程服务器就支持传递查询

参考文献: Exec stored procedure into dynamic temp table

根据错误消息进行编辑:
我运行探查器以查看当我们调用rowset时发生了什么,我可以看到在sp下面使用rowset来获取要插入的表的元数据..

尝试执行下面的sp,如果它不起作用问题是你的sp ..

exec [sys].sp_describe_first_result_set N'EXEC tempdb.[dbo].usp_test ''sateesh''',NULL,1

此外,我创建了一个sp来测试,我看不出任何问题..

select * into #temp from openrowset
('SQLNCLI','Server=tejith\sateesh;Trusted_Connection=yes;', 'EXEC tempdb.[dbo].usp_test ''sateesh''')

答案 1 :(得分:0)

由于你的查询是针对同一台服务器运行的(虽然也应该对远程服务器起作用),我认为你可以像这样解决它:

1)定义指向同一实例的链接服务器。我们称之为loopback

2)使用OPENQUERY

SELECT * INTO #TempTable 
FROM FROM OPENQUERY(loopback, 
    'set fmtonly off exec loopback.yourdb.dbo.yourprocedure 
    WITH RESULT SETS ((@param1 INT, @param2 VARCHAR(20)))');
WITH RESULT SETS以来

SQL2012是必需的。