Как генерировать уникальные числа внутри UDF (SQL Server) - PullRequest
1 голос
/ 16 июня 2011

Есть ли способ генерировать уникальные числа (например, int) внутри определенной пользователем функции?

rand () и newid () не работают из-за побочных эффектов.

Спасибо.

Ответы [ 4 ]

3 голосов
/ 16 июня 2011

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 голос
/ 31 марта 2015

размещение удобного для читателя обходного пути, который я использовал.Я написал автономный процесс для возврата случайного int с помощью метода NewId

CREATE PROCEDURE sp_RandUpTo
    @max int
AS
BEGIN
    declare @return int
    SET NOCOUNT ON;
    SELECT @return = abs(checksum(newid())) % (@max)    
    return @return
END

, а затем выполнил процедуру в нужной переменной в вашем UDF

declare @OptionSelect int, @OptionMax int = 100
exec @OptionSelect = spRandUpTo @OptionMax
1 голос
/ 16 июня 2011

В DB2 я использую микросекундную часть временной метки, но SQL-сервер идет только на миллисекунды.Я подозреваю, что это не будет достаточно хорошо?

0 голосов
/ 05 января 2015

Вы также можете определить представление, используя функцию, которая вызывает побочный эффект (в данном случае RAND ())

CREATE VIEW randomView
AS
SELECT RAND() randomResult
GO

Затем используйте представление в вашем UDF

DECLARE @random DECIMAL(18,18) 
SELECT @random = randomResult FROM randomView
RETURN @random
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...