Я пытаюсь вставить случайно сгенерированные числа в пустую таблицу с помощью курсора, но я хочу, чтобы он прошел через все возможные комбинации без дубликатов одного и того же числа, и я хочу добавить условия к тому, что нужно вставить. Я хочу, чтобы он запускал код несколько раз, я не хочу выполнять его все время, чтобы получить около 1 миллиона строк.
Итак, я хочу знать, как добавить условия во вставку? и нужно ли мне создавать процедуру, чтобы она запускалась несколько раз?
DECLARE @iNumber1 INT
,@iNumber2 INT
,@iNumber3 INT
,@iNumber4 INT
,@iNumber5 INT
,@iNumber6 INT
,@iNumber7 INT
,@iNumber8 INT
,@iNumber9 INT
,@iNumber10 INT
DECLARE GenRandNum CURSOR FOR
SELECT ABS(CAST(NEWID() AS binary(6)) %50) + 1 AS Number1
,ABS(CAST(NEWID() AS binary(6)) %50) + 1 AS Number2
,ABS(CAST(NEWID() AS binary(6)) %50) + 1 AS Number3
,ABS(CAST(NEWID() AS binary(6)) %50) + 1 AS Number4
,ABS(CAST(NEWID() AS binary(6)) %50) + 1 AS Number5
,ABS(CAST(NEWID() AS binary(6)) %50) + 1 AS Number6
,ABS(CAST(NEWID() AS binary(6)) %50) + 1 AS Number7
,ABS(CAST(NEWID() AS binary(6)) %50) + 1 AS Number8
,ABS(CAST(NEWID() AS binary(6)) %50) + 1 AS Number9
,ABS(CAST(NEWID() AS binary(6)) %50) + 1 AS Number10
OPEN GenRandNum
FETCH NEXT FROM GenRandNum INTO @iNumber1, @iNumber2, @iNumber3, @iNumber4, @iNumber5, @iNumber6, @iNumber7, @iNumber8, @iNumber9, @iNumber10
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO GenNumbers (Number1, Number2, Number3, Number4, Number5, Number6, Number7, Number8, Number9, Number10)
VALUES (@iNumber1, @iNumber2, @iNumber3, @iNumber4, @iNumber5, @iNumber6, @iNumber7, @iNumber8, @iNumber9, @iNumber10 )
FETCH NEXT FROM GenRandNum INTO @iNumber1, @iNumber2, @iNumber3, @iNumber4, @iNumber5, @iNumber6, @iNumber7, @iNumber8, @iNumber9, @iNumber10
END
CLOSE GenRandNum
DEALLOCATE GenRandNum
помощь будет очень признательна
Почему вы хотите использовать CURSOR
? Обычно это последнее, что вам следует использовать.
Итак, чтобы уточнить, вы хотите сгенерировать число от 1 до 50, 10 раз, а затем получить каждую перестановку этих чисел? Это 50^10 (97 656 250 000 000 000) строк! И тогда вам нужен произвольный 1 000 000 таких строк?
Я думал, что курсор будет правильным способом продолжить, так как я хотел, чтобы он вставил строку случайных чисел, затем перешел к следующей строке и вставил новую строку случайных чисел.
По правде говоря, если вы вставляете 10 случайно сгенерированных чисел в 10 столбцов, вероятность столкновения, когда 2 строки имеют одно и то же число 10, мала... Я бы просто наложил уникальное ограничение на таблицу, и если вы получите столкновение, запустите оператор еще раз, вероятность того, что это произойдет дважды, бесконечно мала.
да, и если мне нужно сгенерировать больше чисел, я мог бы просто увеличить количество раз, которое нужно запускать.
Меня не беспокоит, если одно и то же число находится в двух разных строках, я просто не хочу, чтобы одно и то же число отображалось в одной строке.
Это то, что должно быть объяснено в вашем вопросе... Отредактируйте его, чтобы правильно объяснить проблему; обеспечить расходуемые результаты (и неожиданные результаты).
Для этого вам не нужен курсор. Если вы используете таблицу Numbers, вы можете реплицировать столько строк, сколько захотите. Однако NEWID()
— плохой выбор для случайных чисел, поскольку на самом деле случайными являются только несколько байтов. Если вас действительно не волнует случайность, просто достаточно разные значения
@PanagiotisKanavos CHECKSUM(NEWID())
достаточно случайен, по-видимому, даже более случайен, чем RAND()
.
Случайные числа могут привести к тому, что все значения в одной строке будут одинаковыми, и эта строка может повторяться. Возможно, вам нужно лучшее описание, например. каждая строка должна быть заполнена 10 различными значениями, взятыми из пула из 50 значений. Это по-прежнему позволяет повторяющиеся строки. Возможно, вы захотите посетить Random.org для получения дополнительной информации и действительно случайных чисел.
Курсор не нужен. Просто используйте GENERATE_SERIES
INSERT INTO GenNumbers
(Number1, Number2, Number3, Number4, Number5, Number6, Number7, Number8, Number9, Number10)
SELECT
CHECKSUM(NEWID()),
CHECKSUM(NEWID()),
CHECKSUM(NEWID()),
CHECKSUM(NEWID()),
CHECKSUM(NEWID()),
CHECKSUM(NEWID()),
CHECKSUM(NEWID()),
CHECKSUM(NEWID()),
CHECKSUM(NEWID()),
CHECKSUM(NEWID())
FROM GENERATE_SERIES(1, 1000000);
Если я добавлю предложениеwhere для фильтрации сгенерированных чисел, будет ли оно генерировать новые числа для создания 1 миллиона сгенерированных чисел или будет фильтроваться только 1-й миллион сгенерированных чисел?
Для этого вам нужно будет выполнить подзапрос. Он будет фильтровать сигналы на расстоянии 1 метра и ниже этого значения. Или вы можете сгенерировать более 1 метра, затем отфильтровать его и взять TOP (1000000)
. Какая фильтрация вам нужна?
Я хочу отфильтровать строки, содержащие повторяющиеся числа в одной строке. @Чарлифейс
Так что тебе мешает это сделать. Как я уже сказал, просто используйте подзапрос и выполните несколько сопоставлений для всех случаев.
А у вас есть проблемы с этим заданием? Хотите задать вопрос?