SQL Server创建随机数函数报错求助:newid与rand操作符使用无效
解决SQL Server标量函数中使用NEWID()和RAND()的报错问题
你遇到的这个错误是因为SQL Server的标量用户定义函数对内置函数有严格限制:它不允许使用具有「副作用」的非确定性函数,NEWID()和RAND()都属于这类函数——它们每次执行的结果都不一样,不符合标量函数要求的「确定性」(相同输入必须返回相同输出)规则。
下面给你两种简单可行的解决方案:
方案一:用视图包装非确定性函数,再在标量函数中调用视图
首先创建一个视图,把NEWID()和RAND()的逻辑封装进去:
CREATE VIEW vw_RandomGenerator AS SELECT RAND(CHECKSUM(NEWID())) AS RandomValue
然后修改你的标量函数,通过查询这个视图来获取随机值:
CREATE FUNCTION [GetRandomNumber]() RETURNS bigint AS BEGIN DECLARE @randomNo bigint -- 从视图获取随机值并计算目标范围的整数 SELECT @randomNo = ROUND(RandomValue * 10001 + 50000, 0) FROM vw_RandomGenerator RETURN @randomNo END
方案二:改用内联表值函数(推荐)
内联表值函数的限制比标量函数宽松,可以直接使用NEWID()和RAND(),写法更简洁:
CREATE FUNCTION [GetRandomNumber]() RETURNS TABLE AS RETURN ( SELECT ROUND(RAND(CHECKSUM(NEWID())) * 10001 + 50000, 0) AS RandomNumber )
调用这个函数的方式是:
SELECT RandomNumber FROM dbo.GetRandomNumber()
验证效果
不管用哪种方案,每次调用函数都会返回一个50000到60001之间的随机整数(匹配你原逻辑的区间),而且不会再出现Msg 443的报错。
内容的提问来源于stack exchange,提问作者Dip Girase
相关产品推荐
相关产品推荐

