2009-01-29 19 views
3

EDIT: en double de How do I return random numbers as a column in SQL Server 2005?numéros choisis au hasard dans la base de données

Bonjour Comment puis-je générer des nombres aléatoires dans le serveur MSSQL 2005.

par exemple: lorsque je sélectionne 500rows de la table, chaque ligne doit avoir un MISE À JOUR: J'ai besoin de la méthode la plus rapide, générer des nombres à partir de grandes tables, datepart, les mêmes calculs magiques sont très lents avec beaucoup de lignes

MISE À JOUR Merci pour les réponses, mais o finalement utilisé cette solution

SELECT ABS(CHECKSUM(NewId())) % 10 - 5 AS Random 

pour des nombres aléatoires -5 à 5 et le bonus est à peu près le même nombre d'occurences pour chaque numéro

+0

Est-ce que chaque colonne a besoin d'un nombre aléatoire UNIQUE ?? – edosoft

Répondre

3
SELECT TOP 500 
    CONVERT(INT, CONVERT(VARBINARY(16), NEWID())) 
FROM 
    dbo.MyTable 
+0

Votre requête produit des nombres négatifs, c'est pourquoi je n'ai pas voté. –

+1

Je ne me suis pas rendu compte que les nombres négatifs étaient mauvais: P ... vous pourriez l'envelopper dans l'ABS() –

0

easy google: 12. ..


de retour nombres aléatoires dans une instruction SELECT

Comme il est mis en œuvre, la fonction RAND() dans SQL Server ne retourne vous permet pas un autre nombre aléatoire par ligne dans votre instruction SELECT. Par exemple, si vous exécutez ceci:

SELECT Rand() as RandomNumber, * 
FROM Northwind..Customers 

Vous verrez le même nombre encore et encore. Cependant, parfois, vous voudrez peut-être retourner un nombre généré aléatoirement par ligne dans votre SELECT. Voici une façon de le faire, dans SQL Server 2000, en utilisant un fichier UDF.

D'abord, nous devons créer une vue qui renvoie un nombre aléatoire simple:

CREATE VIEW vRandNumber 
AS 
SELECT RAND() as RandNumber 

La vue est nécessaire, car normalement dans une UDF, nous ne pouvons pas utiliser la fonction rand(), car cela rendrait la fonction non-déterministe. Nous pouvons tromper l'UDF pour accepter un nombre aléatoire en utilisant une vue.

Une fois qui est mis en place, nous pouvons créer notre fonction:

CREATE FUNCTION RandNumber() 
RETURNS float 
AS 
    BEGIN 
    RETURN (SELECT RandNumber FROM vRandNumber) 
    END 

Enfin, vous pouvez utiliser cette fonction dans tout SELECT pour revenir maintenant un nombre aléatoire entre 0 et 1 par ligne:

SELECT dbo.RandNumber(), * 
FROM Northwind..Customers 

vous pouvez obtenir même colombophile dans votre fonction RandNumber en acceptant une graine si vous le souhaitez, ou permettant des paramètres de gamme comme celui-ci:

CREATE FUNCTION RandNumber2(@Min int, @Max int) 
RETURNS float 
AS 
BEGIN 
RETURN @Min + (select RandNumber from RetRandNumber) * (@[email protected]) 
END 
+0

Est-ce que c'est juste moi ou est-ce que ces simples réponses faciles à google finissent par se boucher SO et rendre plus difficile de trouver l'information précieuse difficile à google? – Tim

+1

Vrai, facile à Google ... mais les solutions que vous avez trouvées sont beaucoup plus compliquées qu'elles ne devraient l'être. –

+0

En regardant les réponses, je suppose que c'est valable .. Je venais de voir quelques questions trop triviales ces derniers temps .. En regardant de plus près ce n'est pas l'un d'entre eux. – Tim

3

J'aime cette astuce, son génial ...

-- 500 random numbers from 0 to 499 
select top 500 ABS(CAST(CAST(NEWID() AS VARBINARY) AS int)) % 500 from sysobjects 
+0

+1. J'ai supprimé ma réponse incorrecte! –

+0

Je suis triste ... J'ai répondu à cette question en premier, mais je n'ai reçu aucun +1: '( –

+0

@Timothy, je viens de voter pour faire bonne mesure, je jure que je n'ai pas vu ta réponse quand j'ai posté la mienne l'astuce de mod –

0

Il pourrait être utile de savoir pourquoi vous voulez que le nombre aléatoire.Par exemple, si vous voulez juste trier les résultats au hasard, vous pouvez faire ORDER BY NEWID() et ne pas vous soucier de générer le nombre aléatoire du tout. Si vous avez vraiment besoin du nombre aléatoire plus tard, utilisez la solution citée @Tim.

Questions connexes