有没有办法在不使用游标的情况下遍历 TSQL 中的表变量?

2021-12-02 00:00:00 loops tsql sql-server

假设我有以下简单的表变量:

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).

相关文章