Создание недетерминированного функции в SQL Server с использованием RAND ()

После небольшого поиска и чтения документации становится ясно, что вы можете написать пользовательские функции в SQL Server, которые помечены как детерминированные или недетерминированные в зависимости от того, какие встроенные функции используются в теле.

RAND ( ) перечислены под недетерминированными функциями (см. MSDN статья ). Так почему я не могу использовать его в функции?

9
задан BG100 20 August 2010 в 13:49
поделиться

2 ответа

Потому что у него есть побочные эффекты.

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

Я думаю, вы можете обойти это, включив его в определение представления, а затем выбрав его из представления.

13
ответ дан 4 December 2019 в 06:40
поделиться

Использование просмотра может сработать для вас.
Из Возвращение случайных чисел из оператора select

CREATE VIEW vRandNumber
AS
SELECT RAND() as RandNumber

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

CREATE FUNCTION RandNumber()
RETURNS float
AS
  BEGIN
  RETURN (SELECT RandNumber FROM vRandNumber)
  END

Наконец, вы можете использовать эту функцию в любом операторе SELECT, чтобы теперь возвращать случайное число от 0 до 1 для каждой строки:

SELECT dbo.RandNumber(), *
FROM Northwind..Customers
19
ответ дан 4 December 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: