Sql 将动态结果存储到临时表中的存储过程
我在SQL 2014中有一个存储过程,它在内部进行动态查询并返回两个静态列,其余列是动态的。如果我需要将sp的结果放入临时表中,我需要专门创建带有列名称和数据类型的临时表 如何将结果放入临时表而不声明临时表 我这样称呼它:Sql 将动态结果存储到临时表中的存储过程,sql,sql-server,Sql,Sql Server,我在SQL 2014中有一个存储过程,它在内部进行动态查询并返回两个静态列,其余列是动态的。如果我需要将sp的结果放入临时表中,我需要专门创建带有列名称和数据类型的临时表 如何将结果放入临时表而不声明临时表 我这样称呼它: SELECT * INTO #TempTable FROM OPENROWSET ('SQLNCLI','Server=cimplsql-d1.turtle.local;Trusted_Connection=yes;', 'EXEC [dbo].[AttributeSele
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上使用了未定义结果集的选项,但不起作用您需要使用开放行集
SELECT * INTO #TempTable
FROM OPENROWSET
('SQLNCLI','Server=yourservername;Trusted_Connection=yes;',
'EXEC OtherDb.DataProd.abc')
SELECT * FROM #TempTable
行集处理查询结果,而不是查询。因此,动态表是可能的,而且您还需要启用临时分布式查询
从MSDN中提取:
是发送给提供程序并由提供程序执行的字符串常量。SQL Server的本地实例不处理此查询,但处理提供程序返回的查询结果,即传递查询。传递查询在提供程序上使用时非常有用,这些提供程序不通过表名而仅通过命令语言提供其表格数据。只要查询提供程序支持OLE DB命令对象及其必需接口,远程服务器上就支持传递查询
参考资料:
根据错误消息编辑:我运行了探查器来查看调用行集时发生了什么,我可以看到行集在sp下面使用来获取要插入的表的元数据 尝试在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) 定义指向同一实例的链接服务器。让我们称之为
环回
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)))');
与结果集一起使用
是必需的,因为SQL2012
可能与的重复,但我在同一个数据库上,我仍然需要使用这种方式?编辑,请查看它是否有助于我得到此错误:Msg 11529,级别16,状态1,过程sp\u描述\u第一个结果集,第158行无法确定元数据,因为每个代码路径都会导致错误;有关其中的一些错误,请参见前面的错误。Msg 2812,第16级,状态62,过程sp_description_first_result_set,第158行找不到存储过程'pit.attributeentiseselect'。可能是您提供的spname错误。如果在名为test的数据库中有一个sp,我会选择exec test.dbo.usp_testproc,显然它不喜欢存储过程中的temp表,现在我有一个:元数据无法确定,因为语句使用临时表。