本文介绍了有没有办法在不使用游标的情况下遍历 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).

这篇关于有没有办法在不使用游标的情况下遍历 TSQL 中的表变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-23 00:28