2009-07-01 91 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秒。所以這在性能上有很大的不同。