SQL随机数不起作用

use*_*312 2 sql sql-server random

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
Run Code Online (Sandbox Code Playgroud)

该 T-SQL 命令应该在“ SaleValue”表的“ MonthlySales”列中插入随机值。

但每次都是插入'1'。

可能是什么问题?

Jer*_*yth 5

两个问题:

  • 首先,rand() 函数返回 0 到 1 之间的数字。
  • 其次,当在同一个查询中多次调用 rand() 时(例如,对于更新语句中的多行),它通常返回相同的数字(我怀疑上面的算法正在尝试通过将其拆分为多个调用来解决这个问题)

解决第二个问题我最喜欢的方法是使用一个保证每次返回唯一值的函数,例如 newid(),将其转换为 varbinary,并将其用作种子:)

编辑:经过一些测试,似乎您需要尝试使用不同的数据类型@RandomNoSeed;float 的行为与十进制有些不同,但仍然接近固定值,因此我建议完全避免使用 @RandomNoSeed,而只需使用:

INSERT INTO MonthlySales(FFCode, SaleDate, SaleValue) 
VALUES(@fieldForceCounter, @SaleDate, RAND(convert(varbinary,newid())))
Run Code Online (Sandbox Code Playgroud)