Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将动态结果存储到临时表中的存储过程_Sql_Sql Server - Fatal编程技术网

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

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

我在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上使用了未定义结果集的选项,但不起作用

您需要使用开放行集

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表,现在我有一个:元数据无法确定,因为语句使用临时表。