SELECT () следующая строка в операторе присваивания значения? - PullRequest
1 голос
/ 29 июля 2011

Я пытаюсь выбрать строки по одной в цикле while в SQL Server. И я использую единственный известный мне способ выбора следующей строки с помощью функции ROW_NUMBER. Но я также должен присваивать значения переменным 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 aspnet_Users.UserName=@searchUserName AND ROWID = @i

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

   @i = @i + 1
   END

Буду очень признателен, если вы покажете мне способ выбора следующего альтернативным способом без получения этой ошибки или способ ее устранения в моем текущем коде. Спасибо.

Ответы [ 2 ]

4 голосов
/ 29 июля 2011

Вам необходимо отделить выбор данных от извлечения этих данных в переменную.Вы можете использовать, например, CTE (Common Table Expression) для настройки данных, а затем работать с этими данными.Однако на более простом уровне: почему вы назначаете 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 голосов
/ 29 июля 2011

Я вижу, что вам нужен 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 aspnet_Users.UserName=@searchUserName
    ORDER BY dateAdded DESC

, а затем выполнить итерацию @SomeCursor?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...