如何基于给定SQL代码创建SQL Server自定义函数?创建失败求助
搞定SQL Server随机取数函数的创建问题
我懂你现在的困扰——手里有一段能随机从列表里挑名字的SQL,想把它改成自定义函数但一直失败对吧?这主要是因为SQL Server的标量函数对非确定性函数的使用有规则限制,再加上原代码里有个小细节没注意到,咱们一步步来解决。
为啥你的尝试没成功?
首先,你的原代码用了RAND(CHECKSUM(NEWID())),但SQL Server的标量函数里,RAND()是确定性函数——意思是在函数执行的整个过程中,它只会生成一次随机值,没法每次调用都产生新的随机数。另外你原代码里生成的随机数范围是0到4,但临时表的RowId是从1开始的,这会导致有时候查不到数据(当随机数是0的时候),还有你的尝试代码看起来没写完,语法不完整也会导致创建失败。
正确的函数写法
下面是可以正常运行的标量函数,完美实现你要的随机取数功能:
CREATE FUNCTION U228_TEST_USER_1.mask_firstn () RETURNS VARCHAR(15) AS BEGIN DECLARE @tbl TABLE(RowId INT IDENTITY(1, 1), ItemName VARCHAR(15)); DECLARE @randomInt INT; -- 把要随机选的名字插入临时表 INSERT INTO @tbl(ItemName) VALUES ('JAMES'), ('JOHN'), ('ROBERT'), ('MICHAEL'), ('MARY'); -- 生成1到5之间的随机整数(刚好匹配临时表的RowId范围) SET @randomInt = (SELECT FLOOR(ABS(CHECKSUM(NEWID())) % 5) + 1); -- 返回随机选中的名字 RETURN (SELECT ItemName FROM @tbl WHERE RowId = @randomInt); END;
关键调整说明
- 换了随机数生成方式:用
ABS(CHECKSUM(NEWID())) % 5生成0到4的非负整数,再加1变成1到5,完美对应临时表的RowId(原代码生成的0会导致无匹配)。 - 避开了
RAND()的限制:用CHECKSUM(NEWID())来获取真正的随机值,因为NEWID()每次生成的GUID都是唯一的,它的校验和也是随机的,在函数里可以正常使用。 - 确保语法完整:把函数逻辑补全,避免截断导致的语法错误。
测试一下
函数创建好之后,直接调用就能看到效果:
SELECT U228_TEST_USER_1.mask_firstn();
每次执行都会返回列表里的一个随机名字。
内容的提问来源于stack exchange,提问作者Дмитрий Крылов
相关产品推荐
相关产品推荐

