Как я возвращаю случайные числа как столбец в SQL Server 2005?

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

21
задан Taryn 27 June 2013 в 02:53
поделиться

10 ответов

Я понимаю, что это - более старое сообщение..., но Вам не нужно представление.

select column1, column2, 
  ABS(CAST(CAST(NEWID() AS VARBINARY) AS int)) % 10000 as column3 
from table1
41
ответ дан Sam Saffron 16 October 2019 в 23:40
поделиться

ПРЕДУПРЕЖДЕНИЕ

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

Вместо этого Вы могли использовать этот ответ .

Доказательство:

CREATE VIEW vRandNumber
AS
SELECT RAND() as RandNumber

go 

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

go 

create table bigtable(i int)

go 

insert into bigtable 
select top 100000 1 from sysobjects  a
join sysobjects b on 1=1

go 

select cast(dbo.RandNumber() * 10000 as integer) as r into #t from bigtable 
-- CPU (1607) READS (204639) DURATION (1551)

go

select ABS(CAST(CAST(NEWID() AS VARBINARY) AS int)) % 10000 as r  into #t1 
from bigtable
-- Runs 15 times faster - CPU (78) READS (809) DURATION (99)

трассировка Профилировщика:

сопроводительный текст http://img519.imageshack.us/img519/8425/destroydbxu9.png

Это - доказательство, что материал достаточно случаен для чисел между от 0 до 9 999

-- proof that stuff is random enough 
select avg(r) from #t
-- 5004
select STDEV(r) from #t
-- 2895.1999 

select avg(r) from #t1
-- 4992
select STDEV(r) from #t1
-- 2881.44 


select r,count(r) from #t
group by r 
-- 10000 rows returned 

select r,count(r) from #t1
group by r 
-- 10000 row returned 
4
ответ дан Community 16 October 2019 в 23:40
поделиться

Ответ Adam работает действительно хорошо, таким образом, я отметил его, как принято. В то время как я ожидал ответа, хотя, я также нашел эту запись в блоге с несколькими другими (немного менее случайными) методами. Метод Kaboing был среди них.

http://blog.sqlauthority.com/2007/04/29/sql-server-random-number-generator-script-sql-query/

3
ответ дан Joshua Carmody 16 October 2019 в 23:40
поделиться

Необходимо использовать UDF

сначала:

CREATE VIEW vRandNumber
AS
SELECT RAND() as RandNumber
116-секундный:

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

тест:

SELECT dbo.RandNumber(), *
FROM <table>

Выше одолженного от Блог

SQL Server Jeff
1
ответ дан Adam 16 October 2019 в 23:40
поделиться

Для SQLServer существует несколько опций.
1. Некоторое время цикл для обновления пустого столбца с одним случайным числом за один раз
2. .net блок, который содержит функцию, которая возвращает случайное число

1
ответ дан hova 16 October 2019 в 23:40
поделиться

Вы хотели бы рассматривать генерацию UUID вместо случайного числа с помощью функции newid. Они, как гарантируют, будут уникальны каждый раз сгенерированные, тогда как существует значительный шанс, что некоторое дублирование произойдет с простым случайным числом (и в зависимости от того, для чего Вы используете его, мог дать Вам phenominally твердый отладить ошибку позже)

1
ответ дан Cruachan 16 October 2019 в 23:40
поделиться

newid () я верю, является очень интенсивно использующим ресурсы. я вспоминаю попытку, что метод на таблице нескольких миллионов записей и производительности не был почти так же хорош как рэнд ().

1
ответ дан Adam 16 October 2019 в 23:40
поделиться

Запрос

select column1, column2, cast(new_id() as varchar(10)) as column3 
from table1
1
ответ дан Ullas 16 October 2019 в 23:40
поделиться

Согласно моему тестирование, приведенный выше ответ никогда не генерирует значение 10000. Вероятно, это не большая проблема, когда вы генерируете случайное число от 1 до 10000, но тот же алгоритм между 1 и 5 будет заметен. Добавьте 1 в свой мод.

1
ответ дан 16 October 2019 в 23:40
поделиться

Этот фрагмент, кажется, обеспечивает разумную замену для rand () , поскольку он возвращает значение с плавающей запятой между 0,0 и 1,0. Он использует только последние 3 байта, предоставленные newid () , поэтому общая случайность может немного отличаться от преобразования в VARBINARY , затем INT , а затем изменение из рекомендованного ответа . У меня не было возможности проверить относительную производительность, но кажется достаточно быстрым (и достаточно случайным) для моих целей.

SELECT CAST(SubString(CONVERT(binary(16), newid()), 14, 3) AS INT) / 16777216.0 AS R
1
ответ дан 16 October 2019 в 23:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: