【问题标题】:Dynamically query a temp table created in a stored procedure [duplicate]动态查询在存储过程中创建的临时表 [重复]
【发布时间】:2013-07-30 22:37:44
【问题描述】:

我创建了一个创建临时表的存储过程。现在我需要能够使用 .NET 对其进行查询。所以我需要类似的东西:

SELECT * FROM storedProcedure() WHERE ...

存储过程创建的表也是动态的,因此架构会改变。使用 SQL Server 2005。

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

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

【问题讨论】:

  • 我们应该假设 SQL Server 是您的 RDBMS 吗?全局临时表怎么样?
  • @Bridge 我在考虑全局临时表,但如果同时进行多个事务,它不会被覆盖吗?
  • @BWS 感谢您的链接,我将尝试此解决方案。
  • @Bridge 我最终使用全局临时表作为函数无法返回动态表,这无济于事。感谢您的建议。

标签: sql stored-procedures


【解决方案1】:

如参考所示,您可以使用以下内容:

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

但是,在许多情况下,您可以将此类存储过程替换为用户定义的函数。这些被定义为返回值,并且可以完全按照您的意愿使用:

select *
from dbo.udf_MyFunction();

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

【讨论】:

  • 使用函数是否可以返回动态表,因为正如我在函数中看到的那样,您必须在创建时声明返回的表及其架构?
  • @user1938919 。 . .对于内联表值函数,return 子句指定格式。对于多行表值函数,您需要将类型声明为定义的一部分。但是,要将存储过程结果捕获到表中,您需要在 执行插入操作之前定义表,因此您还需要在那里定义表。
  • 不工作,那么我需要能够从 JSON 中创建一个动态表,将它与另一个表连接,然后将其返回以进行查询。不过还是谢谢。
【解决方案2】:

其实你可以像这样从存储过程中选择

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

但是,我不建议在生产中这样做,考虑将存储过程更改为用户定义的函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多