SQL Случайное число не работает - PullRequest
1 голос
/ 24 июня 2009
declare @fieldForceCounter as int
declare @SaleDate as dateTime
declare @RandomNoSeed as decimal

set @fieldForceCounter = 1
set @SaleDate = '1 Jan 2009'
set @RandomNoSeed = 0.0

WHILE @fieldForceCounter <= 3
   BEGIN

    while @SaleDate <= '1 Dec 2009' 
    begin       

        INSERT INTO MonthlySales(FFCode, SaleDate, SaleValue) VALUES(@fieldForceCounter, @SaleDate, RAND(@RandomNoSeed))

        set @saleDate = @saleDate + 1
        set @RandomNoSeed = Rand(@RandomNoSeed) + 1

    end

    set @SaleDate = '1 Jan 2009'
    set @fieldForceCounter = @fieldForceCounter + 1
   END
GO

Эта команда T-SQL должна была вставить случайные значения в столбец 'SaleValue' таблицы 'MonthlySales'.

Но каждый раз вставляется '1'.

В чем может быть проблема?

Ответы [ 3 ]

4 голосов
/ 24 июня 2009

Две проблемы:

  • Во-первых, функция rand () возвращает число от 0 до 1.
  • Во-вторых, когда rand () вызывается несколько раз в одном и том же запросе (например, для нескольких строк в операторе обновления), обычно возвращается одно и то же число (что, как я подозреваю, ваш алгоритм выше пытается решить, разбив его на несколько вызовов)

Мой любимый способ решения второй проблемы - использовать функцию, которая гарантированно каждый раз будет возвращать уникальное значение, например, newid (), преобразовывать ее в varbinary и использовать в качестве начального числа:)

Редактировать: после некоторого тестирования кажется, что вам нужно попробовать использовать другой тип данных для @RandomNoSeed; float немного отличается от десятичного, но все еще приближается к фиксированному значению, поэтому я бы рекомендовал вообще избегать использования @RandomNoSeed и просто использовать:

INSERT INTO MonthlySales(FFCode, SaleDate, SaleValue) 
VALUES(@fieldForceCounter, @SaleDate, RAND(convert(varbinary,newid())))
2 голосов
/ 30 августа 2009

У вас есть серьезные проблемы здесь ...

Десятичные числа

Точность / масштаб по умолчанию для десятичной дроби составляет 38,0. Таким образом, вы не храните ни одной десятичной части.

Таким образом, вы используете только RAND (0) для первой итерации и RAND (1) для всех последующих итераций, что составляет 0,943597390424144 и 0,713591993212924

Я не могу вспомнить, как применяется округление / усечение, и я не знаю, что такое тип данных SalesValue, но округление будет давать "1" каждый раз.

Теперь, если вы исправите это и правильно объявите десятичную ...

Проблемы с посевом

RAND принимает целое число семя. Посев с 1,0001 или 1,3 или 1,999 дает то же значение (0,713591993212924).

Итак, "Rand (1.713591993212924) + 1" = "RAND (1) + 1" = "1.713591993212924" для каждой последующей итерации.

Вернуться на круги своя ...

Исправить

  • Избавьтесь от @ RandomNoSeed
  • Либо: генерировать случайное целочисленное значение, используя CHECKSUM (NEWID ())
  • Или: сгенерировать случайное значение с плавающей запятой, используя RAND () * CHECKSUM (NEWID ()) (сейчас не волнует начальное значение)
0 голосов
/ 24 июня 2009

Просто предположение, но часто функции rand генерируют число от 0 до 1. Попробуйте умножить ваше случайное число на 10.

...