我需要在表格中填充虚拟值。
我需要为每个创建的行创建一个随机生成的值“RANDOM_VALUE”。
随机值必须是字符串,其范围可以只是“A”或“B”。
该脚本应该能够列出一系列具有值A或B随机生成的行
这是一个应该如何工作的例子:
ROW RANDOM_VALUE
1 A
2 B
3 B
4 A
... ...
任何想法怎么做?谢谢!
答案 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
这将始终产生相同的,随机的结果。