У меня возникла проблема со случайными значениями, генерируемыми для каждой строки в результирующем наборе в SQL Server 2008. Я нашел аналогичный вопрос here, но после реализации предлагаемого ответа я увидел такой же проблема как раньше. При выполнении запроса, который я привел ниже, кажется, что одни и те же значения иногда появляются в последовательных строках, хотя я призываю новый NEWID()
с каждой строкой.sql server 2008 не генерирует случайное значение
DECLARE @Id int = 0
DECLARE @Counter int = 1
DECLARE @Value int
CREATE TABLE #Table1
(
id int identity(1,1)
,Value int
)
WHILE @Counter < 100000
BEGIN
INSERT INTO #Table1 (Value)
SELECT CAST(RAND(CHECKSUM(NEWID())) * 100000 as INT)
SET @Counter += 1
END
SET @Counter = 0
WHILE @Counter < 5
BEGIN
SELECT
@Value = T.Value
,@Id = T.id
FROM #Table1 T
WHERE T.id = CAST(RAND(CHECKSUM(NEWID())) * 100000 as INT) + 1 + @Counter
IF @Id <> 0
SELECT @Value AS Value ,@Id as ID
SET @Counter += 1
END
DROP TABLE #Table1
Если изменить INT
к BIGINT
, как это было предложено в ссылке я представил, ничего не решается, так что я не верю, что что это «переполнение» вопрос.
Редактировать: На самом деле, я добавляю счетчик к оператору 'WHERE' здесь, поэтому это не может быть проблемой при генерации случайного числа, а, скорее, при обновлении переменных, правильно ли? – whobetter
Вы никогда не устанавливаете @Id обратно на 0 после его отображения, поэтому он будет отображаться снова на следующей итерации цикла, если ничего не найдено. –
Это не тот случай. Двойные строки происходят с идентификаторами и значениями, отличными от 0. Кроме того, @Id обновляется с помощью оператора select во время каждой итерации независимо от того, отображается ли она. – whobetter