使用游标或while循环或任何其他方式?

时间:2011-05-06 05:54:38

标签: sql-server-2008 stored-procedures cursor while-loop recordset

我经历了几次与此相关的讨论(不完全相同),但我想知道正确的解决方案,因此发布了这个问题。

我需要根据某些条件从表中选择一些记录,并将每个记录值传递给SP。

我想过使用Cursor循环遍历记录集,经过一些谷歌搜索我发现while循环也被使用,并且很多讨论哪个是最好的,并且大多数人说这取决于情况。现在我无法判断我的情况,因此放在专家面前。

这是我想到的while循环:

Table Test
{
  id int
  value int
  -- Some more fields
}

WHILE EXISTS(SELECT TOP 1 id FROM Test WHERE isValid=1)
BEGIN
  DECLARE @id AS INT
  DECLARE @value AS INT
  SELECT TOP 1 @id=id, @value=value FROM Test WHERE isValid=1
  EXEC SP_SomeProcessingSP @id, @value -- Some more fields passed to it from above table
  -- After execution of the above SP I need to update the record to invalid
  UPDATE Test SET isValid = 0 WHERE id=@id
END

这种方法比光标更好吗?如果有人能在没有光标的情况下提出更好的解决方案(我想避免两者),那将是很棒的。

编辑:修改了while块并提供了示例表。现在,在while块中调用的SP访问来自几个表的数据并进行一些处理并将数据插入到其他几个表中。

2 个答案:

答案 0 :(得分:1)

看起来像一个回合的方法:

UPDATE Test SET isValid = 0 WHERE isValid = 1

至于哪种方法最好,你没有提供足够的答案细节。

这完全取决于你想要做什么。也许递归CTE可以解决您的问题,而无需调用存储过程。也许一个好的联合会解决它。也许一个不同的解决方案是最好的。

您需要解释您想要实现的完全

答案 1 :(得分:0)

您可以修改存储过程以将表作为输入,然后选择表变量。对于更新,您可以加入该表变量。

在此处查看表格值参数:http://msdn.microsoft.com/en-us/library/bb510489.aspx