2009-07-01 27 views
0

在T-SQL中循环查询的最快方法是什么? 1)游标或 2)添加密钥的临时表或 其他任何东西。通过SQL查询循环的最快方法

+1

你想完成什么? – 2009-07-01 19:58:10

+0

我从查询中获取一些数据,并希望循环通过第一个到最后一个项目,并在结果集中执行字段的字符串连接。 – Greens 2009-07-01 20:03:27

+0

基本经验法则:尽可能避免游标 - 它们已经死了 - 缓慢,笨拙,并且不适合T-SQL。使用基于集合的方法 - 将其加载到临时表中并在其上运行UPDATE语句。 – 2009-07-01 20:40:57

回答

0

我不认为你需要一个游标(你对concat的评论),如果我明白你要去的是什么。 这是我的一个抓取联系人的所有电话号码,并将它们放在一个字段中并将其返回。

DECLARE @numbers VARCHAR(255) 

SELECT @numbers = COALESCE(@numbers + ' | ','') + PHONE_NUMB FROM my_table (NOLOCK) 
WHERE [email protected]_id RETURN @numbers 
1

取决于你想要做什么。一些任务更适合于游标,一些适合临时表。这就是他们都存在的原因。

+0

大声笑。任何因素都要考虑执行哪一个。 – Greens 2009-07-01 20:00:39

0

游标通常是资源霸王,特别是随着您的表大小的增长。所以如果你的表格尺寸很小,我会推荐一个游标,但是,更大的表格可能会更好用外部或临时表格。

5

通过查询“循环”的最快方法是不做。在SQL中,你应该考虑基于集合而不是基于循环的。你应该评估你的查询,询问为什么你需要循环,并寻找方法来做到这一点。

即便如此,在光标上使用FAST_FORWARD选项将有助于加快速度。

0

你想通过存储过程或从C#代码循环查询输出​​吗?

一般来说,您应该避免一次循环查询输出​​一行。 SQL意味着基于集合的操作,因此请参阅您是否可以使用基于集合的方法解决您的问题。

0

取决于结果集的大小 - 表变量在内存中,不需要读取磁盘,可以像处理表一样处理(设置操作),并且速度非常快,直到结果集变大为内存(然后需要交换文件写入)。

3

对于你所说的目标,这样的事实上是一个更好的选择 - 完全避免了“循环”问题。

declare @table table 
(
    ID int 
) 

insert into @table select 1 union select 2 union select 3 union select 4 union select 5 

declare @concat varchar(256) 

-- Add comma if it is not the first item in the list 
select @concat = isnull(@concat + ', ', '') + ltrim(rtrim(str(ID))) from @table order by ID desc 

-- or do whatever you want with the concatenated value now... 
print @concat 
0

这里有一个快捷方式,从返回的行数的查询得到一个逗号分隔的单场串。与游标等替代品相比,相当快,它可以是子查询的一部分(即获得一些东西,并在一列中列出与其他表中的每个东西相关的所有事物的ID):

SELECT 
    COALESCE(
     REPLACE(
     REPLACE(
      REPLACE(
     (SELECT MyField AS 'c' FROM [mytable] FOR XML PATH('')),'</c><c>',','), 
      '<c>',''), 
     '</c>',''), 
     '') 
    AS MyFieldCSV 

警告:如果您的列包含FOR XML PATH将逃脱的字符,它将无法正常播放。

0

光标不好避免光标,使用while循环来代替光标 临时表中添加了关键是使用循环的最佳方式。

我必须操纵表中的1000000多行,因为复杂的逻辑,光标需要2分钟的 。 但是,当将光标转换为while循环时,仅需要25秒25秒。所以这在性能上有很大的不同。