2009-01-29 4 views
3

EDIT: Дубликат How do I return random numbers as a column in SQL Server 2005?Случайные числа из базы данных

Здравствуйте Как я могу генерировать случайные числа в MSSQL Server 2005.

, например: при выборе 500rows из таблицы, каждая строка должна иметь один порожденное случайное число, числа должны быть сгенерированы во время выполнения

ОБНОВЛЕНИЕ: мне нужен самый быстрый метод, генерация чисел из больших таблиц, datepart, то же самое волшебное вычисление реально медленно с большим количеством строк

UPDATE спасибо за ответы, но о, наконец, использовали этот раствор

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

для случайных чисел от -5 до 5 и бонус примерно такое же количество появлений для каждого номера

+0

Нужно ли каждому столбцу УНИКАЛЬНОЕ случайное число? – edosoft

ответ

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

Ваш запрос производит отрицательные числа, поэтому я не проголосую. –

+1

Я не понимал, что отрицательные числа были плохими: P ... вы можете обернуть его в ABS() –

0

easy google: 12. ..


Возвращение случайных чисел в ЗЕЬЕСТЕ

Как реализуются, функция RAND() в SQL Server не позволяет возвращать различные случайные числа для каждой строки в вашем ЗЕЬЕСТЕ. Например, если вы выполните это:

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

Вы увидите одно и то же число снова и снова. Однако иногда вам может понадобиться вернуть произвольно сгенерированный номер в строке в SELECT. Вот один из способов сделать это в SQL Server 2000, используя UDF.

Во-первых, нам нужно создать представление, которое возвращает единственное случайное число:

CREATE VIEW vRandNumber 
AS 
SELECT RAND() as RandNumber 

мнение необходимо, потому что обычно в ОДС мы не можем использовать функцию рэнд(), так что бы функцию без determistic. Мы можем обмануть UDF, чтобы принять случайное число, используя View.

Как только установлен, мы можем создать нашу функцию:

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

Наконец, вы можете использовать эту функцию в любом SELECT, чтобы теперь возвращает случайное число в диапазоне от 0 до 1 для каждой строки:

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

вы можете получить даже любитель в функции RandNumber, принимая семя, если вы хотите, или разрешение для параметров диапазона, как это:

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

Является ли это только мной или эти простые простые ответы на Google в конечном итоге засоряют SO и затрудняют поиск важной информации, труднодоступной для Google? – Tim

+1

Правда, легко для Google ... но решения, которые вы нашли, намного сложнее, чем они должны быть. –

+0

Глядя на ответы, я думаю, это действительно .. Недавно я видел несколько слишком тривиальных вопросов. При ближайшем рассмотрении это не один из них. – Tim

3

Я люблю этот трюк, его удивительный ...

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

+1. Я удалил свой неправильный ответ! –

+0

Мне грустно ... Я ответил на это первым, но не получил +1: '( –

+0

@ Тимоти, я просто проголосовал за вас за хорошую меру, клянусь, я не видел вашего ответа, когда я разместил свой, и у меня есть модный трюк –

0

Это может быть полезно знать, почему вы хотите, чтобы случайное число.Например, если вы просто хотите отсортировать результаты случайным образом, вы можете сделать ORDER BY NEWID() и не беспокоиться о генерации случайного числа вообще. Если вам действительно нужно случайное число позже, используйте цитированное решение @Tim.

Смежные вопросы