如何在 sql server 2008 中生成随机布尔值?
Posted
技术标签:
【中文标题】如何在 sql server 2008 中生成随机布尔值?【英文标题】:How to generate random boolean value in sql server 2008? 【发布时间】:2013-12-15 17:07:02 【问题描述】:我正在为某所大学编写一个数据库,并且有一个名为
的表Contact_Assign 它的参数是:
Is_Instructor UD_BOOLEAN NOT NULL,
Is_TeacherAssistant UD_BOOLEAN NOT NULL,
Is_Student UD_BOOLEAN NOT NULL,
Registration_ID UD_ID NOT NULL,
Contact_ID UD_ID NOT NULL,
现在我想在此表中插入虚拟数据,但我不知道如何为布尔参数执行此操作。
PS。 UD_BOOLEAN 是
CREATE TYPE UD_BOOLEAN FROM BIT
知道怎么做吗?
【问题讨论】:
我强烈建议只使用 BIT。使用 UD_BOOLEAN 会得到什么,除了 - 如果您后来决定更改名称、更改基础类型或在 NULL / NOT NULL 之间更改 - 一大堆头痛?你有没有尝试过在别名类型的触角进入你的所有对象之后更改它的任何内容?现在这似乎是一个明智的选择,但经过艰苦的学习,我可以向你保证,这不是这样的事情。 我同意@AaronBertrand。 CLR UDT 可能非常有用(尽管一旦部署后更新仍然很痛苦),但 SQL UDT 真的很没用。有关这方面的一些讨论,请参阅 T-SQL UDTs. (Huh!) What are they good for?。 还有 Bad habits to kick : using alias types - 那里也有很多优秀的 cmets。 【参考方案1】:你可以使用
CRYPT_GEN_RANDOM(1) % 2
相对于RAND
的优势在于它在加密方面更强大(您可能不在乎),并且如果插入多行,它会为每一行重新评估。
DECLARE @T TABLE(
B1 BIT,
B2 BIT);
INSERT INTO @T
SELECT TOP 10 CRYPT_GEN_RANDOM(1)%2,
CAST(ROUND(RAND(), 0) AS BIT)
FROM master..spt_values
SELECT *
FROM @T
将在第二列的所有行中给出相同的值
【讨论】:
+1 这是正确答案,不涉及RAND()
。【参考方案2】:
如果你只生成一行,你可以使用如下简单的东西:
SELECT CAST(ROUND(RAND(),0) AS BIT)
但是,如果您生成多行,RAND()
将为每一行计算相同的值,因此请参阅Martin Smith's answer。
【讨论】:
呃,不,这不好。SELECT TOP (1000) CAST(ROUND(RAND(),0) AS BIT) FROM sys.all_columns;
这对我来说似乎不是很随机。为什么不?因为RAND()
只被评估为 1 或 0 一次,并且该值在每一行中都存在。如果您一次生成每一行,这只有任何机会起作用 - 而且您也不应该这样做。
出于这个原因,我很想删除这个答案。当我更多地考虑它时,我意识到这是一个糟糕的解决方案。羞耻它被接受而不是@MartinSmith 回答
谢谢@AaronBertrand
您还可以通过执行以下操作来获得此解决方案以处理多行:CAST(ROUND(RAND(CHECKSUM(NEWID())),0) AS BIT)
【参考方案3】:
如果您想要第二列的值不同,可以使用newid()
。这是一个例子:
select cast((case when left(newid(), 1) between '0' and '7' then 1 else 0 end) as bit)
如果您在单个语句中插入多行,则只需要 newid()
。
【讨论】:
【参考方案4】:另一个使用NEWID()
的解决方案:
select ABS(CHECKSUM(NEWID())) % 2
【讨论】:
以上是关于如何在 sql server 2008 中生成随机布尔值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用存储过程在 SQL Server 中生成表的数据脚本文件?
在 SQL Server 2005 中生成多个 SQL 任务