有没有办法在用户定义的函数中生成唯一的数字(例如int)?
由于副作用,rand()和newid()不起作用。
感谢。
答案 0 :(得分:3)
CRYPT_GEN_RANDOM绕过NEWID()限制
SELECT CHECKSUM(CRYPT_GEN_RANDOM(8000))
所以你可以像这样使用它。没有“副作用”错误
CREATE FUNCTION dbo.test ()
RETURNS int
AS
BEGIN
RETURN CHECKSUM(CRYPT_GEN_RANDOM(8000))
END
GO
SELECT dbo.test()
答案 1 :(得分:1)
在DB2中,我使用时间戳的微秒部分,但SQL服务器只使用毫秒。我怀疑那不够好吗?
答案 2 :(得分:1)
发布了我使用的读者友好的解决方法。我编写了一个独立的proc来使用NewId方法返回一个随机的int
CREATE PROCEDURE sp_RandUpTo
@max int
AS
BEGIN
declare @return int
SET NOCOUNT ON;
SELECT @return = abs(checksum(newid())) % (@max)
return @return
END
然后将proc执行到UDF中的所需变量
declare @OptionSelect int, @OptionMax int = 100
exec @OptionSelect = spRandUpTo @OptionMax
答案 3 :(得分:0)
您还可以使用导致副作用的函数定义视图(在本例中为RAND())
CREATE VIEW randomView
AS
SELECT RAND() randomResult
GO
然后使用UDF中的视图
DECLARE @random DECIMAL(18,18)
SELECT @random = randomResult FROM randomView
RETURN @random