我创建了一个创建临时表的存储过程。现在我需要能够使用.NET查询它。所以我需要这样的东西:动态查询在存储过程中创建的临时表
SELECT * FROM storedProcedure() WHERE ...
由存储过程创建的表也是动态的,所以模式会改变。使用SQL Server 2005.
我不能使用一个函数,因为需要返回的是一个动态表。事先必须定义表格使得函数无用。
我最终创建了一个全局临时表,借助动态SQL我能够创建一个动态全局临时表并通过.NET访问它。
我创建了一个创建临时表的存储过程。现在我需要能够使用.NET查询它。所以我需要这样的东西:动态查询在存储过程中创建的临时表
SELECT * FROM storedProcedure() WHERE ...
由存储过程创建的表也是动态的,所以模式会改变。使用SQL Server 2005.
我不能使用一个函数,因为需要返回的是一个动态表。事先必须定义表格使得函数无用。
我最终创建了一个全局临时表,借助动态SQL我能够创建一个动态全局临时表并通过.NET访问它。
由于参考指示,你使用类似:
insert into @t(<columns here>)
exec stored_procedure;
然而,在很多情况下,你可以用一个用户自定义函数替换该存储过程。这些被定义为返回值,并根据需要使用它可以准确地使用:
select *
from dbo.udf_MyFunction();
有,当然,优点和缺点每种方法。存储过程方法的一个缺点是不能嵌套这样的存储过程。函数方法的一个缺点是不能使用动态SQL。
使用函数然后是否可以返回一个动态表,因为正如我已经看到的函数一样,您必须在创建时声明返回的表及其模式? – user1938919
@ user1938919。 。 。使用内联表值函数,return子句指定格式。对于多行表值函数,则需要将该类型声明为定义的一部分。但是,要将存储过程结果捕获到表中,您需要在执行插入操作之前定义表*,因此您还需要在其中定义表格。 –
不工作,那么我需要能够从JSON创建一个动态表,然后将它与另一个表连接起来,然后返回被查询。不过谢谢。 – user1938919
其实,你可以这样
select *
from openrowset('SQLNCLI', 'Server=<your server here>;Database=<your database here>;Trusted_Connection=yes;','set fmtonly off exec <your procedure here>')
但是,我不能建议在生产中执行此操作,请考虑更改存储过程,用户自定义函数
看到这个帖子从存储过程中选择: [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
我们应该假设SQL Server是你的RDBMS吗?全局临时表怎么样? – Bridge
@Bridge我正在考虑全局临时表,但如果有多个事务同时进行,那么这不会被覆盖吗? – user1938919