【问题标题】:Using cursor or while loop or any other way?使用游标或while循环或任何其他方式?
【发布时间】:2011-05-06 05:54:37
【问题描述】:

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

我需要根据某些条件从表中选择一些记录并将每个记录值传递给 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 和 cursor 的情况下提出更好的解决方案,那就太好了(我想避免两者)。

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

【问题讨论】:

  • 您可能需要考虑使用CLR Stored Procedure。我不确定它的优点和缺点。可能是对它更了解的人可以提供更多的信息。

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


【解决方案1】:

看起来有点绕路:

UPDATE Test SET isValid = 0 WHERE isValid = 1

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

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

您需要确切地说明您要达到的目标。

【讨论】:

  • 哎呀你误解了我的问题。您错过了选择和更新语句之间的评论块。我将使用从 select 语句中获得的值调用另一个 SP。
  • @JPReddy - 不,我没有。信息不足。
  • 我更新了我的问题以提供更多信息。我希望信息足够,如果您需要更多信息,请告诉我。
  • @JPReddy - 这取决于 SP 做什么。您可以简单地将整个 ID 列表一次性传递给存储过程。一般来说,最好使用集合操作(​​连接、联合等)而不是任何类型的循环。
  • 明白你的意思,不能这样做。因为那是一个现有的 SP,我必须使用它。看起来我必须使用 While 或 Cursor
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多