小编典典

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

all

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

declare @databases table
(
    DatabaseID    int,
    Name        varchar(15),   
    Server      varchar(15)
)
-- insert a bunch rows into @databases

如果我想遍历行,声明和使用游标是我唯一的选择吗?还有其他方法吗?


阅读 79

收藏
2022-05-04

共1个答案

小编典典

首先,你应该绝对确定你需要遍历每一行——基于集合的操作在我能想到的每一种情况下都会执行得更快,并且通常会使用更简单的代码。

根据您的数据,可能只使用SELECT如下所示的语句进行循环:

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

另一种选择是使用临时表:

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

您应该选择的选项实际上取决于数据的结构和数量。

注意: 如果您使用的是 SQL Server,则最好使用:

WHILE EXISTS(SELECT * FROM #Temp)

使用COUNT将不得不触摸表格中的每一行,EXISTS只需要触摸第一行(见下面)。

只是一个简短的说明,如果您使用的是 SQL Server(2008 及更高版本),则具有以下示例:

While (Select Count(*) From #Temp) > 0

会更好地服务

While EXISTS(SELECT * From #Temp)

Count 必须触摸表格中的每一行,EXISTS只需要触摸第一行。

2022-05-04