Un de mes collègues a découvert un comportement dans SQL Server que je ne connaissais pas.Est-ce une bonne ou une mauvaise façon de générer des nombres aléatoires pour chaque enregistrement?
CREATE VIEW dbo.vRandNumber AS
SELECT RAND() as RandNumber
GO
CREATE FUNCTION dbo.RandNumber() RETURNS float AS
RETURN (SELECT RandNumber FROM vRandNumber)
GO
DECLARE @mytable TABLE (id INT)
INSERT INTO @mytable SELECT 1
INSERT INTO @mytable SELECT 2
INSERT INTO @mytable SELECT 3
SELECT *, dbo.RandNumber() FROM @mytable
Ce semble être le moyen le plus rapide de générer une valeur « aléatoire » pour chaque enregistrement dans un ensemble de données. Mais je ne suis pas complètement sûr si c'est le résultat d'un comportement documenté, ou en profitant d'une convergence de coïncidences bizarre.
Est-ce que utiliser quelque chose comme ça?
EDIT
Ce n'est pas une question sur le bien-fondé de la fonction RAND() elle-même, mais l'utilisation de la combinaison UDF/VIEW pour forcer à recalcule sur chaque ligne . (Utiliser simplement RAND() dans la requête finale, au lieu de dbo.RandNumber(), donnerait la même valeur pour chaque enregistrement.)
De plus, le but est que la valeur soit différente chaque fois que vous le regardez . Permettant ainsi la sélection aléatoire d'enregistrements, par exemple.
EDIT
Pour SQL Server 2000+.
CHECKSUM (NEWID()) fonctionne au moins sur SQL 2000+. Cela dépend d'un certain comportement qui peut être supprimé dans un correctif SQL 2005 – gbn