有没有一种方法可以在不使用游标的情况下遍历TSQL中的表变量?

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


declare @databases table

(

    DatabaseID    int,

    Name        varchar(15),   

    Server      varchar(15)

)

-- insert a bunch rows into @databases

如果要遍历行,是否声明和使用游标是我唯一的选择?还有另一种方法吗?


紫衣仙女
浏览 618回答 3
3回答

Smart猫小萌

首先,您应该绝对确定需要遍历每行-在我能想到的每种情况下,基于集合的操作都将更快地执行,并且通常将使用更简单的代码。根据您的数据,可能仅使用select语句就可以进行循环,如下所示:Declare @Id intWhile (Select Count(*) From ATable Where Processed = 0) > 0Begin    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   #TempFrom   ATableDeclare @Id intWhile (Select Count(*) From #Temp) > 0Begin    Select Top 1 @Id = Id From #Temp    --Do some processing here    Delete #Temp Where Id = @IdEnd您应该选择的选项实际上取决于数据的结构和数量。注意:如果您使用的是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唯一需要触摸的第一行。

烙印99

这是我的方法:declare @RowNum int, @CustId nchar(5), @Name1 nchar(25)select @CustId=MAX(USERID) FROM UserIDs&nbsp; &nbsp; &nbsp;--start with the highest IDSelect @RowNum = Count(*) From UserIDs&nbsp; &nbsp; &nbsp; --get total number of recordsWHILE @RowNum > 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --loop until no more recordsBEGIN&nbsp; &nbsp;&nbsp; &nbsp; select @Name1 = username1 from UserIDs where USERID= @CustID&nbsp; &nbsp; --get other info from that row&nbsp; &nbsp; print cast(@RowNum as char(12)) + ' ' + @CustId + ' ' + @Name1&nbsp; --do whatever&nbsp; &nbsp; select top 1 @CustId=USERID from UserIDs where USERID < @CustID order by USERID desc--get the next one&nbsp; &nbsp; set @RowNum = @RowNum - 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;--decrease countEND没有游标,没有临时表,没有额外的列。像大多数主键一样,USERID列必须是唯一的整数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server