TSQL RAND随机值

时间:2010-08-17 08:27:56

标签: sql sql-server database

我需要在表格中填充虚拟值。

我需要为每个创建的行创建一个随机生成的值“RANDOM_VALUE”。

随机值必须是字符串,其范围可以只是“A”或“B”。

该脚本应该能够列出一系列具有值A或B随机生成的行

这是一个应该如何工作的例子:

ROW   RANDOM_VALUE
1     A
2     B
3     B
4     A
...   ...

任何想法怎么做?谢谢!

3 个答案:

答案 0 :(得分:14)

Rand()每列仅评估一次,因此对于所有行都是相同的,您可以使用NewId(),如下所示。

SELECT CHAR(65+ABS(CHECKSUM(NEWID()))%2), RestOfCols
FROM YourTable

如果你需要完全按照你的问题输出,只需加入一个足够大的桌子。 e.g。

WITH cte AS
(
SELECT 
      ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS ROW,
      CHAR(65+ABS(CHECKSUM(NEWID()))%2) AS RANDOM_VALUE
FROM sys.objects
)
INSERT INTO DummyTable
SELECT ROW,RANDOM_VALUE 
FROM cte 
WHERE ROW<= 4

答案 1 :(得分:2)

创建您自己的随机数函数,您可以使用它来代替Rand()。

CREATE VIEW dbo.RandomNumberView
AS
SELECT Rand() AS RandomNumber

GO

CREATE FUNCTION dbo.RandomNumber()
RETURNS float
AS
BEGIN
    RETURN (SELECT RandomNumber FROM dbo.RandomNumberView)
END
GO

答案 2 :(得分:2)

用于生成测试数据,您可能会发现拥有确定性数据很有价值。换句话说,每次生成数据时都是一样的。这样就可以更容易地重现错误。

为此,您可以对确定性种子使用hashbytes()。换句话说:

create function dbo.fn_RandishInt(@seed nvarchar(max), @min int, @max int)
returns int
as
begin
    declare @crc bigint
    declare @p float

    set @crc = cast(cast(hashbytes('md5', @seed) as int) as bigint) & 0xffffffff
    set @p = cast(@crc as float) / 4294967296

    return round(((@max - @min) * @p) + @min, 0)
end
go


SELECT
      ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS s,
      char(dbo.fn_RandishInt(ROW_NUMBER() OVER (ORDER BY (SELECT 0)), 65, 66)) AS t
FROM
    sys.objects

这将始终产生相同的,随机的结果。