2010-05-02 158 views
0

我試圖把SELECT的結果爲通過的結果的變量和循環來操作這些數據,都在同一個存儲proceedure ......這就是我到目前爲止有:我怎樣才能返回一個SQL SELECT到SQL變量

DECLARE @i int 

@Result = (SELECT * FROM UserImport) 

SET @i = 0 
WHILE @i < (SELECT Count(@Result) As Count) 
BEGIN 
    /* Do Stuff */ 
END 

我知道我的路要走,因爲它說@Result未聲明,但我不知道如何聲明一個變量,以便能夠容納SELECT語句的結果。

任何人都可以告訴我我哪裏錯了,如何解決它?

謝謝
馬特

+4

你能在你想在/發生什麼擴大*做的東西* /?可能有更好的解決方案。 – BradBrening 2010-05-03 00:37:18

回答

2

你可以使用遊標,至少這是做它的傳統方式。您也可以按照您的要求使用while循環。有關遊標和替代方法的示例,請參閱這篇文章。

Avoiding SQL cursors

1

考慮使用表變量,而不是光標

http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=529

當然,你應該總是偏袒任何這些基於集合的操作。 SQL是爲基於集合的操作而設計的。

+0

遊標循環的最糟糕的方式,谷歌'SQL服務器遊標免費looping',有許多文章是這樣的:http://searchsqlserver.techtarget.com/tip/Avoid-cursors-in-SQL-Server-with-these - 方法對環過記錄 – 2010-05-03 04:19:09

1

,而不是遍歷結果的角度思考,在「做的東西」的一部分辛苦一下,看看你能不能做到這一切爲一體的步驟,無需循環或遊標。

發佈更多關於您需要做的實際工作的詳細信息,如果可以的話,可能不需要光標。

0

循環是殺死數據庫性能的最糟糕方法之一!

我建議你嘗試處理在單個命令select語句,像這樣:

UPDATE t2 
    SET Cola=t1.col1, Colb=t1.col2 
    FROM UserInput t1 
    JOIN YourTable t2 ON t1.id=t2.id 

但是如果你必須循環做這種方式:

DECLARE @Current int, @LastRow int 
DECLARE @Col1 datatype, @Col2 datatype .... 
DECLARE @Results table (RowId int identity1,1) primary key, col1 ...,col2 ...) 

INSERT INTO @Results SELECT * FROM UserImport 
SELECT @Current=0, @[email protected]@ROWCOUNT 

WHILE @Current<@LastRow 
BEGIN 
    SET @[email protected]+1 
    SELECT @Col1=Col1, @Col2=col2 FROM @Results WHERE [email protected] 

    /* Do Stuff */ 

END 

,如果你正在處理超過100行,替換表變量:@Results與臨時表:#Results,如:

CREATE TABLE #RESULTS (RowId int identity1,1) primary key, col1 ...,col2 ...) 

,因爲這會更快。

相關問題