2011-07-28 105 views
1

我想在SQL Server的while循環中逐一選擇行。我正在使用我知道的唯一方法來使用ROW_NUMBER函數來選擇下一行。但我也必須在同一個SELECT語句中爲t-sql變量賦值,因此我收到以下錯誤;SELECT賦值語句中的下一行?

將一個值賦給變量的SELECT語句不能與數據檢索操作結合使用 。

無論如何,我的代碼是這樣的;

WHILE (@i < 5) 
    BEGIN 
     SELECT -- This is where the error occurs 
      @resultId = video.id, -- this is the value assigning i need to do 
      ROW_NUMBER() OVER (ORDER BY dateAdded DESC) AS ROWID 
     FROM videoTest.dbo.video 
     LEFT JOIN videoTest.dbo.aspnet_Users 
     ON video.userId=aspnet_Users.UserId 
     WHERE [email protected] AND ROWID = @i 

    -- Processing @resultId  
     SELECT 
      compilationId 
     FROM videoTest.dbo.comp 
     WHERE vidId = @resultId -- i need the id from above 
     .... 
     .... 
     ..... 
     ...... 

    @i = @i + 1 
    END 

我將不勝感激,如果你能告訴我的方式沒有得到這個錯誤,或者解決這個錯誤在我當前的代碼的方式來選擇以另一種方式旁邊。 謝謝。

回答

4

您需要將從檢索數據中選擇的數據分離出來。您可以使用例如CTE(公用表表達式)來設置數據,然後對該數據進行操作。但是,在更基本的層面上:爲什麼要將id分配給@resultId五次?在此期間,您似乎沒有對@resultId做任何事情.....

您是否可以將您的邏輯更改爲基於集合的?取而代之的是WHILE構建的 - 剛剛從CTE中選擇適當的值:

;WITH VideoData AS 
(
    SELECT 
     video.id, 
     ROW_NUMBER() OVER (ORDER BY dateAdded DESC) AS ROWID 
    FROM 
     videoTest.dbo.video 
    LEFT JOIN 
     videoTest.dbo.aspnet_Users ON video.userId = aspnet_Users.UserId 
    WHERE 
     aspnet_Users.UserName = @searchUserName 
) 
SELECT id, ROWID 
FROM VideoData 
WHERE ROWID <= 5 

更新:如果您需要後續處理五個video.id值,嘗試這樣的事情:

DECLARE @VideoIDs TABLE (VideoID INT) 

;WITH VideoData AS 
(
    ... (same as before) 
) 
INSERT INTO @VideoIDs(VideoID) 
    SELECT id 
    FROM VideoData 
    WHERE ROWID <= 5 

-- use your values in the table variable here..... 
+0

代碼繼續從那裏,我用這5個不同的視頻ID的抱歉誤解。我認爲這就是我期待的讓我抓住機會的感謝! – umutto

+0

對不起,以前不夠清楚,但我實現了你的代碼,但沒有找到一種方法來訪問video.id在後面的語句。有了CTE,您可以將video.id作爲變量保存以備將來使用?我以後需要@resultId進程,我已經更新了我的代碼以滿足我的需求。謝謝! – umutto

+0

@umutto:如果你以後需要它,你需要將它填充到一個表變量 - CTE只適用於立即,下一個語句 –

0

我看到你需要video.id。爲什麼不只是按dateAdded排序,並將其存儲在光標中:

SELECT 
    INTO CURSOR @SomeCursor 
    video.id 
    FROM videoTest.dbo.video 
    LEFT JOIN videoTest.dbo.aspnet_Users 
    ON video.userId=aspnet_Users.UserId 
    WHERE [email protected] 
    ORDER BY dateAdded DESC 

然後迭代@SomeCursor?

+0

編輯:哦,對不起,我錯過了遊標部分,你可以爲遊標實現顯示一個簡單的代碼。 – umutto

+0

你需要ROWID還是隻有ID? – CristiC

+0

不,我只是需要身份證你是對的我誤解了你我的第一條評論。雖然我不熟悉遊標的使用。我會欣賞一個簡單的代碼塊。謝謝! – umutto