2010-08-17 94 views
3

我需要用虛擬值填充一個表。TSQL RAND隨機值

我需要爲創建的每一行創建一個隨機生成的值「RANDOM_VALUE」。

隨機值必須是一個字符串,其範圍可能只有'A'或'B'。

腳本應該能夠列出與值A或B隨機生成

這裏的應該是如何工作的一個例子的一系列行:

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

任何想法怎麼辦呢?謝謝!

回答

14

Rand()僅對每列評估一次,因此對於所有行都是相同的,以避免這種情況,您可以使用如下的NewId()

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

如果您需要輸出與您的問題完全一致,只需加入足夠大的表格即可。例如

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 
+2

+1 - 我見過RAND()問題只被評估一次,但在TSQL書籍中沒有發現它。很高興得到證實! – mdma 2010-08-17 08:34:41

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

爲了生成測試數據,您可能會發現確定性數據很有價值。換句話說,每次生成數據時都是一樣的。這樣就可以更容易地重現錯誤。

爲此,您可以在確定性種子上使用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 

這總會產生相同的,隨機的結果。