RANDBETWEEN pour SQL Server 2012

Comment créer une fonction qui renvoie un nombre random entre deux nombres?

exemple de syntaxe

RandBetween (3,300)

Que diriez-vous

  • Utilisez RAND() (qui renvoie une valeur comprise entre 0 et 1 (exclusif).
  • multipliez par 298 (puisque vous voulez une gamme dynamic de [300-3] = 297 + 1)
  • append 3 à Offset
  • et cast à INT?

c'est à dire

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

Violon

( Editez aussi la réponse de @ ivo pour savoir comment transformer ceci en une fonction définie par l'user)

Basé sur la solution de StuartLC, vous pouvez également utiliser une procédure stockée comme ceci si vous souhaitez réutiliser votre code plus souvent

 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; 

Et appelez-le comme ceci:

 DECLARE @tmp INT; EXECUTE [dbo].[RANDBETWEEN] 0,10, @ret=@tmp OUT ; SELECT @tmp 

Pour créer une fonction, vous devez d'abord créer une vue:

 CREATE VIEW Get_RAND AS SELECT RAND() AS MyRAND GO 

Vous pouvez ensuite créer une fonction comme celle-ci (accéder à la vue avec 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 

Et enfin vous pouvez appeler votre fonction comme ceci:

 SELECT [dbo].[RANDBETWEEN](1,10) 

La plage de rand() sur SQL Server est [0, 1].

Si vous voulez mapper cela dans une gamme d' entiers commençant par A et se terminant par 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; 

La conversion en int tronque mais il y a toujours une possibilité très mince de l'expression évaluant à @B + 1 que vous voudriez probablement gérer cela en générant un nouveau nombre ou en le traduisant arbitrairement à une autre valeur.

Si vous voulez mapper cela dans une gamme de réels commençant par A et allant jusqu'à B:

 rand() * (@B - @A) + @A