我有sql存储过程,它传递并返回一些值:
CREATE PROCEDURE [dbo].[GetMoney]
@userId int,
@month DateTime
AS
BEGIN
....
Select @something
END
我想为users表中的每个用户调用GetMoney过程,并在sql查询中使用结果。我该怎么办?
答案 0 :(得分:6)
RDBMS的全部目的是它们在集合中运行。而不是每个用户处理1个镜头中的所有用户,它将快许多倍
如果你真的想要去基于行的路由,加载游标中的所有用户并在光标上循环并为每个用户调用proc ...但是这样做你正在使用像磁带文件这样的数据库...在SETS中运行的数据库使用基于集合的解决方案
答案 1 :(得分:2)
你所追求的更适合于功能而不是程序,但这意味着你必须定义一个返回类型。
CREATE FUNCTION [dbo].[GetMoney]
@userId int,
@month DateTime
RETURNS
AS
BEGIN
....
SELECT @result = @something
RETURN @result
END
然后你就像使用它一样:
SELECT dbo.GetMoney(t.userid, t.month)
但是我想强调你在基于SET的世界中考虑过程/ OO编程方法,并且不建议追求这一点。它不会表现良好,因此不会随着负载的增加而扩展。
答案 2 :(得分:0)
不是为每一行调用过程,而是将过程重构为用户定义的函数并使用cross apply。结果将是相同的,但代码将更容易阅读,保持理解并将表现更好。
答案 3 :(得分:0)
或者,您可以定义存储过程以将表变量作为输入。然后,您可以在发送所有用户后调用proc,它将处理您以基于集合的方式发送的所有记录。无需游标,无需为一条记录或多条记录单独处理。这当然只适用于SQl Server 2008.