为每条记录调用存储过程

时间:2010-08-16 18:35:30

标签: sql tsql

我有sql存储过程,它传递并返回一些值:

CREATE PROCEDURE [dbo].[GetMoney]
   @userId int,  
   @month DateTime
AS
BEGIN
  ....
  Select @something
END

我想为users表中的每个用户调用GetMoney过程,并在sql查询中使用结果。我该怎么办?

4 个答案:

答案 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.