30.01.2019

SQL: Использование функции RAND внутри другой функции

Не так давно писал на T-SQL генератор данных, включающий в себя функцию со случайным значением шума. Наткнулся на то, что функция RAND() не может быть использована в рамках UDF (user defined function), выдавая при этом сообщение "Invalid use of a side-effecting operator ‘rand’ within a function". Удалось найти достаточно интересны способ обхода данного ограничения. 
Сначала необходимо создать представление, которое при каждом вызове будет генерировать новое рандомное значение:

CREATE VIEW v_RandomizeView
AS
SELECT RAND() AS Result

Теперь можно создавать функцию, возвращающую произвольные значения. С учетом того, что мне нужно было создать функцию, которая бы выдавала произвольные значения от -1 до 1, то выглядит она так:

CREATE FUNCTION f_Randomize()
RETURNS float
AS
BEGIN
   RETURN 2 * (SELECT TOP 1 Result FROM v_RandomizeView) - 1
END
GO

Комментариев нет:

Отправить комментарий