2015-09-18 3 views
0

У меня есть SP, который возвращает счетчик, мне нужно использовать этот счетчик и обновлять случайные строки (количество строк) в некоторой другой таблице, рассчитывать возвращается всегда будет меньше или равно, чем число строк, доступных, так что случайные строки всегда должны быть доступныНеверное количество строк, обновленных при использовании Rand (Checksum (Newid()))

ниже метод я использую

я в настоящее время есть 7 строки для пункта, где и подсчета возвращается также 7, но при разных попытках ниже логические метки 1 для 5 или 6 строк и никогда не 7, является ли это некоторым недостатком с использованием функции rand?

Есть ли альтернатива этому?

    EXEC @Randcount=dbo.[Usp_getcount] 

         UPDATE [mytable] 
         SET [output] = 1 
         WHERE [id] IN 
           (SELECT TOP (@Randcount) 
           [id] FROM [dbo].[mytable] 
           WHERE 
           [empid] = @empid AND [setId] = @setID 
           ORDER BY Rand(Checksum(Newid()))) 

любая помощь будет принята с благодарностью.

+0

Просьба предоставить полный работоспособный пример, иллюстрирующий проблему. –

ответ

0

Нет Гарантия на сколько раз этот подзапрос будет оцениваться. Если бы он был оценен всего один раз для всего запроса, вы ожидали получить ровно 7 строк. Но если он оценивается один раз за внешнюю строку, то это эффективная броска монеты для каждой строки.

Простейший способ, который должен работать, чтобы разделить это на два отдельных запроса:

EXEC @Randcount=dbo.[Usp_getcount] 

declare @IDs table (ID int not null) 

insert into @IDs(ID) 
SELECT TOP (@Randcount) 
    [id] FROM [dbo].[mytable] 
    WHERE 
[empid] = @empid AND [setId] = @setID 
ORDER BY Rand(Checksum(Newid())) 

UPDATE [mytable] 
SET [output] = 1 
WHERE [id] IN 
(SELECT ID from @IDs) 
+0

@ damien_the_unbeliever- да, он вызывается каждый раз за внешний ряд –

+0

@ G-- это не гарантируется в любом случае. Интеллектуальный оптимизатор * может * выбрать для генерации результатов подзапроса и поэтому он только оценил бы его один раз. В этом конкретном случае, похоже, это не так. –

+0

@ damien_the_unbeliever- так что я могу сделать, чтобы удостовериться, что он отмечает точное количество строк ?, потому что этот код запускается внутри цикла while, –

Смежные вопросы