SQL Server 2008,如何使用种子随机值更新列?

时间:2015-07-21 19:15:19

标签: sql sql-server tsql

我发现了许多答案,其中对RAND的调用不断被重新接种,但这意味着虽然为每一行创建了不同的值,但操作不能以相同的结果重复。有没有办法确保每一行都获得一个新值但是它仍然在初始调用中播种?

以下尝试不起作用:

UPDATE #TestTable
SET
    Number = CONVERT(INT, FLOOR(RAND(CHECKSUM(NEWID())) * 1000))

每一行都有不同的值,但每次运行它时,给定行的值都会改变。

DECLARE @RandomSeeder FLOAT;

--Seeds the value, probably a better way to do this.
SELECT @RandomSeeder = RAND(5336); 

UPDATE #TestTable
SET
    Number = CONVERT(INT, FLOOR(RAND() * 1000));

看起来RAND被调用一次,然后在每一行中使用该值。

2 个答案:

答案 0 :(得分:0)

要将guid作为列值,您应该将其声明为例如:

[Number] UNIQUEIDENTIFIER CONSTRAINT [DF_Email_EmailID] DEFAULT(newsequentialid())NOT NULL

然后,您可以使用该值生成随机数。

答案 1 :(得分:0)

简而言之,RAND()默认情况下不会执行。在评论中,每个Conrad Frix,它被设计为确定性的,因此必须创建一个视图和调用它的函数来通过RAND()调用。

创建视图和功能的设置如下:

IF OBJECT_ID('RANDView') IS NOT NULL
BEGIN DROP VIEW RANDView END
GO

CREATE VIEW RANDView
AS SELECT RAND() AS RANDNumber
GO

IF OBJECT_ID('SeededRAND') IS NOT NULL
BEGIN DROP FUNCTION SeededRAND END
GO

CREATE FUNCTION SeededRAND() RETURNS FLOAT
AS BEGIN
    DECLARE @Return FLOAT
    SELECT @Return = RANDNumber FROM RANDView
    RETURN @Return
END
GO

使用此视图和功能的演示可以编写如下:

CREATE TABLE #TestTable (
TestNum INT);

INSERT INTO #TestTable
VALUES (1),(2),(3),(4);

SELECT * FROM #TestTable;

SELECT RAND(5336); -- Seed the RAND() function

UPDATE #TestTable
SET TestNum = CONVERT(INT, FLOOR(dbo.SeededRAND() * 1000));

SELECT * FROM #TestTable;

You can play with the demo in SQL Fiddle here.