我需要用虛擬值填充一個表。TSQL RAND隨機值
我需要爲創建的每一行創建一個隨機生成的值「RANDOM_VALUE」。
隨機值必須是一個字符串,其範圍可能只有'A'或'B'。
腳本應該能夠列出與值A或B隨機生成
這裏的應該是如何工作的一個例子的一系列行:
ROW RANDOM_VALUE
1 A
2 B
3 B
4 A
... ...
任何想法怎麼辦呢?謝謝!
我需要用虛擬值填充一個表。TSQL RAND隨機值
我需要爲創建的每一行創建一個隨機生成的值「RANDOM_VALUE」。
隨機值必須是一個字符串,其範圍可能只有'A'或'B'。
腳本應該能夠列出與值A或B隨機生成
這裏的應該是如何工作的一個例子的一系列行:
ROW RANDOM_VALUE
1 A
2 B
3 B
4 A
... ...
任何想法怎麼辦呢?謝謝!
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
創建您自己的隨機數字功能就像這樣,您可以使用它來代替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
爲了生成測試數據,您可能會發現確定性數據很有價值。換句話說,每次生成數據時都是一樣的。這樣就可以更容易地重現錯誤。
爲此,您可以在確定性種子上使用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
這總會產生相同的,隨機的結果。
+1 - 我見過RAND()問題只被評估一次,但在TSQL書籍中沒有發現它。很高興得到證實! – mdma 2010-08-17 08:34:41