如何在UDF(SQL Server)中生成唯一数字

时间:2011-06-16 09:31:23

标签: sql-server tsql sql-server-2008 random user-defined-functions

有没有办法在用户定义的函数中生成唯一的数字(例如int)?

由于副作用,

rand()和newid()不起作用。

感谢。

4 个答案:

答案 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