SQL: Обертка на RAND()

В SQL есть функция RAND() которая может генерировать псевдослучайные числа.  Например такой запрос:

Select Rand()

Вернет:

rand

Дальше можно немного модифицировать выборку. Скажем, нам нужно, что бы выбиралось целое число от 0 до 100, тогда запрос будет таким:

SELECT FLOOR(100*RAND());

Ну и если от 10 до 100, то таким:

SELECT FLOOR(100*RAND()+10);

В языке SQL поддерживаются функции, так почему бы не написать обертку на Rand, которая будет генерировать числа от и до нужных нам границ?

Я попробовал написать такой код:

CREATE FUNCTION 
    [dbo].[getRandom](@min int, @max int)
RETURNS INT
AS
BEGIN
	Return FLOOR(@max*RAND() + @min);
END

Всё очевидно, но MSSQL генерирует ошибку:

Недопустимое использование оператора «rand», оказывающего побочное действие, в функции.

Google вернул один результат на этот сайт. Здесь предлогают решение: Создать представление, а потом от него сделать функцию.

Воспользуемся:

 

--Создаем представление
CREATE VIEW dbo.vRand(V) AS SELECT RAND();
--И Создаем функцию
CREATE FUNCTION 
    [dbo].[getRandom](@min int, @max int)
RETURNS INT
AS
BEGIN
	Return (SELECT FLOOR(@max*V + @min) FROM dbo.vRand)
END

Использование:

select dbo.getRandom(1,2)
select dbo.getRandom(4,20)

1 Response

Добавить комментарий