如何在一个 SQL 查询中检索值并在存储过程中使用它?

Posted

技术标签:

【中文标题】如何在一个 SQL 查询中检索值并在存储过程中使用它?【英文标题】:How to retrieve value and use it in stored procedure in one SQL query? 【发布时间】:2009-01-19 14:13:49 【问题描述】:

我正在编写一个 Silverlight 客户端,它通过我也在开发的 ASP.NET 2.0 Web 服务与 SQL 数据库进行交互。其中一项服务需要返回存储过程的结果,并且运行良好。但是,在执行存储过程之前,需要从不同的位置检索存储过程的一个参数,并且这个对数据库的额外请求会导致明显的减速(当我缓存检索到的值而不是每次调用都获取它时很明显)。

不幸的是,缓存该值对我的情况无效,我宁愿将该值的检索和随后的存储过程执行组合到一个查询中,以便服务器可以优化请求。但是,我的 SQL 不强,我一点也不知道该怎么做。

我们称它为tasktype 的值是通过单个键id 引用的。存储过程getrecords 接受一些参数,包括tasktype,但可以假设在调用查询时其他参数值是已知的。存储过程返回一个记录表。

感谢您的帮助。

【问题讨论】:

您是否使用标量存储过程来获取任务类型的值? tasktype的值是通过常规的SQL查询得到的。目前没有存储过程。 【参考方案1】:

嗯,可能是这样的:

    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue("@id", ...); // your id arg
    cmd.Parameters.AddWithValue(... , ...); // your other args...
    cmd.CommandText = @"
DECLARE @TaskType int -- or whatever

SELECT @TaskType = // some existing query based on @id

EXEC getrecords @TaskType, ...
";

但是,您可能需要澄清如何获取任务类型。

您应该能够以IDataReaderDataTable.Load 的形式使用它。

【讨论】:

tasktype 值是使用常规 SELECT 查询获得的。目前没有存储过程来获取它。 谢谢。我知道这必须直截了当。非常感谢。【参考方案2】:

您应该能够创建一个 UDF,该 UDF 将获取 tasktype 的值并从您的数据检索存储过程中调用它。

类似

CREATE FUNCTION dbo.TaskType()
Returns int
   SELECT ... stuff that gets task type
END

然后从你的数据检索存储过程调用

DECLARE tasktype int

SELECT tasktype = dbo.TaskType

或类似的东西...可能需要一些返工:-)

【讨论】:

以上是关于如何在一个 SQL 查询中检索值并在存储过程中使用它?的主要内容,如果未能解决你的问题,请参考以下文章

从查询中检索特定键值并在查询中获取它们对的计数

如何在 asp.net 代码中获取引导文本框值并在存储过程中作为参数发送?

如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?

如何从 TempTable 中检索值并在局部变量中设置该值

如何在 SQL Server 2008 中检索已删除的存储过程、函数、表

如何使用 C# 从 SQL 查询中检索参数