Как создать функцию, которая возвращает случайное число между двумя номерами?RANDBETWEEN для SQL Server 2012
пример синтаксиса
RANDBETWEEN (3.300)
Как создать функцию, которая возвращает случайное число между двумя номерами?RANDBETWEEN для SQL Server 2012
пример синтаксиса
RANDBETWEEN (3.300)
Как насчет
RAND()
(который возвращает значение между 0 и 1 (эксклюзивный).т.е.
SELECT CAST(RAND() * 298 + 3 AS INT)
(Edit Также смотрите ответ @ Иво о том, как превратить это в определенной пользователем функции)
на основе решения StuartLC, вы также можете использовать хранимую процедуру Нравится это, если вы хотите повторно использовать свой код чаще всего
CREATE PROCEDURE [dbo].[RANDBETWEEN]
@LowerBound int = 0 ,
@UpperBound int = 1 ,
@ret int OUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ret = (CAST((RAND() * (@UpperBound - @LowerBound)) + @LowerBound AS INT));
RETURN ;
END;
И называть это так:
DECLARE @tmp INT;
EXECUTE [dbo].[RANDBETWEEN] 0,10, @[email protected] OUT ;
SELECT @tmp
Для создания функции вы должны сначала создать вид:
CREATE VIEW Get_RAND
AS
SELECT RAND() AS MyRAND
GO
Тогда вы можете создать такую функцию (доступ вид с SELECT MyRand ...):
CREATE FUNCTION RANDBETWEEN(@LowerBound INT, @UpperBound INT)
RETURNS INT
AS
BEGIN
DECLARE @TMP FLOAT;
SELECT @TMP = (SELECT MyRAND FROM Get_RAND);
RETURN CAST(@TMP* (@UpperBound - @LowerBound) + @LowerBound AS INT);
END
GO
И, наконец, вы c вызов вашей функции так:
SELECT [dbo].[RANDBETWEEN](1,10)
Могу ли я сделать это без вида? – Bill
Спасибо. Это действительно хорошо знать. Вместо использования представления я могу использовать SP? т.е. может ли функция вызвать SP для получения случайного значения? – Bill
Да, вы просто создаете представление один раз, после чего вы просто используете функцию – ivo
Диапазон rand()
на SQL Server является [0, 1].
Если вы хотите отобразить, что в диапазоне целых начиная с A и заканчивая B:
-- option #1
declare @rnd int = @B + 1;
while @rnd = @B + 1
set @rnd = cast(rand() * (@B - @A + 1) + @A as int);
-- option #2
declare @rnd int;
set @rnd = cast(rand() * (@B - @A + 1) + @A as int);
if @rnd = @B + 1 set @rnd = @B;
Кастинг в целое обрезает, но есть еще очень тонкий возможность выражения оценки в @ B + 1, вы, вероятно, захотите обработать это, создав новое число или произвольно переведя его на другое значение.
Если вы хотите отобразить, что в диапазоне реалов начиная с А и, подойдя к B:
rand() * (@B - @A) + @A
бы хорошо, если поплавок или INT вариант. да, включает 300. – Bill