2015-06-02 3 views
3

Как создать функцию, которая возвращает случайное число между двумя номерами?RANDBETWEEN для SQL Server 2012

пример синтаксиса

RANDBETWEEN (3.300)

+0

бы хорошо, если поплавок или INT вариант. да, включает 300. – Bill

ответ

6

Как насчет

  • Использование RAND() (который возвращает значение между 0 и 1 (эксклюзивный).
  • умножить на 298 (так как вы требуется динамический диапазон [300-3] = 297 + 1)
  • добавить 3 в смещение
  • и бросили INT?

т.е.

SELECT CAST(RAND() * 298 + 3 AS INT) 

Fiddle

(Edit Также смотрите ответ @ Иво о том, как превратить это в определенной пользователем функции)

3

на основе решения 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) 
+0

Могу ли я сделать это без вида? – Bill

+0

Спасибо. Это действительно хорошо знать. Вместо использования представления я могу использовать SP? т.е. может ли функция вызвать SP для получения случайного значения? – Bill

+0

Да, вы просто создаете представление один раз, после чего вы просто используете функцию – ivo

0

Диапазон 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