Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 使用游标、while循环或任何其他方式?_Sql Server 2008_Stored Procedures_Cursor_While Loop_Recordset - Fatal编程技术网

Sql server 2008 使用游标、while循环或任何其他方式?

Sql server 2008 使用游标、while循环或任何其他方式?,sql-server-2008,stored-procedures,cursor,while-loop,recordset,Sql Server 2008,Stored Procedures,Cursor,While Loop,Recordset,我已经进行了几次与此相关的讨论(不确切),但我想知道我的情况的正确解决方案,因此发布了这个问题 我需要根据某些条件从表中选择一些记录,并将每个记录值传递给SP 我曾想过使用游标在记录集中循环,在谷歌搜索了几次之后,我发现while loop也被使用了,很多人都在讨论哪一个是最好的,大多数人说这取决于具体情况。现在,我无法判断自己的处境,因此不得不面对专家 以下是我想到的while循环: Table Test { id int value int -- Some more fields

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

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

我曾想过使用游标在记录集中循环,在谷歌搜索了几次之后,我发现while loop也被使用了,很多人都在讨论哪一个是最好的,大多数人说这取决于具体情况。现在,我无法判断自己的处境,因此不得不面对专家

以下是我想到的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访问两个表中的数据,并进行一些处理,然后将数据插入两个其他表中。

看起来像是一种迂回的方法:

UPDATE Test SET isValid = 0 WHERE isValid = 1
至于哪种方法最好,你没有提供足够的细节来回答

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


您需要解释您正试图实现的目标。

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


请在此处查看表值参数:

oops您误解了我的问题。您在选择和更新状态之间错过了我的注释块。我将使用select语句中的值调用另一个SP。@JPReddy-不,我没有。这根本不够信息。我已经更新了我的问题以提供更多信息。我希望这些信息足够了,如果您需要更多信息,请告诉我。@JPReddy-这取决于SP的功能。您可以简单地一次性将整个ID列表传递给存储过程。一般来说,最好使用集合运算(连接、联合等)而不是任何类型的循环。明白你的意思了,不能这样做。因为这是一个现有的SP,我必须使用它。看来,我必须与while或CURSORCE您可能要考虑使用。我不确定它的利弊。也许有人对它更了解,可以投下更多的光。