После небольшого поиска и чтения документации становится ясно, что вы можете написать пользовательские функции в SQL Server, которые помечены как детерминированные или недетерминированные в зависимости от того, какие встроенные функции используются в теле.
RAND ( ) перечислены под недетерминированными функциями (см. MSDN статья ). Так почему я не могу использовать его в функции?
Потому что у него есть побочные эффекты.
В функции нельзя использовать конструкции с побочными эффектами. Побочный эффект, который он имеет, заключается в изменении некоторого внутреннего состояния, которое отслеживает последнее выданное значение rand ()
.
Я думаю, вы можете обойти это, включив его в определение представления, а затем выбрав его из представления.
Использование просмотра может сработать для вас.
Из Возвращение случайных чисел из оператора 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