如何在一个 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, ...
";
但是,您可能需要澄清如何获取任务类型。
您应该能够以IDataReader
或DataTable.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)的结果集?