有没有办法在不使用游标的情况下循环遍历 TSQL 中的表变量?
假设我有以下简单的表变量:
Let's say I have the following simple table variable:
declare @databases table
(
DatabaseID int,
Name varchar(15),
Server varchar(15)
)
-- insert a bunch rows into @databases
如果我想遍历行,那么声明和使用游标是我唯一的选择吗?还有其他方法吗?
Is declaring and using a cursor my only option if I wanted to iterate through the rows? Is there another way?
推荐答案
首先你应该绝对确定你需要遍历每一行——基于集合的操作在我能想到的每一种情况下都会执行得更快,并且通常会使用更简单的代码.
First of all you should be absolutely sure you need to iterate through each row — set based operations will perform faster in every case I can think of and will normally use simpler code.
根据您的数据,可能只使用 SELECT
语句进行循环,如下所示:
Depending on your data it may be possible to loop using just SELECT
statements as shown below:
Declare @Id int
While (Select Count(*) From ATable Where Processed = 0) > 0
Begin
Select Top 1 @Id = Id From ATable Where Processed = 0
--Do some processing here
Update ATable Set Processed = 1 Where Id = @Id
End
另一种选择是使用临时表:
Another alternative is to use a temporary table:
Select *
Into #Temp
From ATable
Declare @Id int
While (Select Count(*) From #Temp) > 0
Begin
Select Top 1 @Id = Id From #Temp
--Do some processing here
Delete #Temp Where Id = @Id
End
您应该选择的选项实际上取决于数据的结构和数量.
The option you should choose really depends on the structure and volume of your data.
注意:如果您使用的是 SQL Server,则最好使用:
Note: If you are using SQL Server you would be better served using:
WHILE EXISTS(SELECT * FROM #Temp)
使用 COUNT
将不得不触及表格中的每一行,EXISTS
只需要触及第一行(参见 约瑟夫的回答如下).
Using COUNT
will have to touch every single row in the table, the EXISTS
only needs to touch the first one (see Josef's answer below).
相关文章