我发现了许多答案,其中对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被调用一次,然后在每一行中使用该值。
答案 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;