2013-07-29 54 views
0

我创建了一个创建临时表的存储过程。现在我需要能够使用.NET查询它。所以我需要这样的东西:动态查询在存储过程中创建的临时表

SELECT * FROM storedProcedure() WHERE ... 

由存储过程创建的表也是动态的,所以模式会改变。使用SQL Server 2005.

我不能使用一个函数,因为需要返回的是一个动态表。事先必须定义表格使得函数无用。

我最终创建了一个全局临时表,借助动态SQL我能够创建一个动态全局临时表并通过.NET访问它。

+1

看到这个帖子从存储过程中选择: [http://stackoverflow.com/questions/1492411/sql-server-select-from-stored-procedure][1] [1]:http://stackoverflow.com/questions/1492411/sql-server-select-from-stored-procedure – BWS

+1

我们应该假设SQL Server是你的RDBMS吗?全局临时表怎么样? – Bridge

+0

@Bridge我正在考虑全局临时表,但如果有多个事务同时进行,那么这不会被覆盖吗? – user1938919

回答

1

由于参考指示,你使用类似:

insert into @t(<columns here>) 
    exec stored_procedure; 

然而,在很多情况下,你可以用一个用户自定义函数替换该存储过程。这些被定义为返回值,并根据需要使用它可以准确地使用:

select * 
from dbo.udf_MyFunction(); 

有,当然,优点和缺点每种方法。存储过程方法的一个缺点是不能嵌套这样的存储过程。函数方法的一个缺点是不能使用动态SQL。

+0

使用函数然后是否可以返回一个动态表,因为正如我已经看到的函数一样,您必须在创建时声明返回的表及其模式? – user1938919

+0

@ user1938919。 。 。使用内联表值函数,return子句指定格式。对于多行表值函数,则需要将该类型声明为定义的一部分。但是,要将存储过程结果捕获到表中,您需要在执行插入操作之前定义表*,因此您还需要在其中定义表格。 –

+0

不工作,那么我需要能够从JSON创建一个动态表,然后将它与另一个表连接起来,然后返回被查询。不过谢谢。 – user1938919

0

其实,你可以这样

select * 
from openrowset('SQLNCLI', 'Server=<your server here>;Database=<your database here>;Trusted_Connection=yes;','set fmtonly off exec <your procedure here>') 

但是,我不能建议在生产中执行此操作,请考虑更改存储过程,用户自定义函数

相关问题