2011-07-28 65 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