Я пытаюсь вставить случайно сгенерированные числа в пустую таблицу с помощью курсора

Я пытаюсь вставить случайно сгенерированные числа в пустую таблицу с помощью курсора, но я хочу, чтобы он прошел через все возможные комбинации без дубликатов одного и того же числа, и я хочу добавить условия к тому, что нужно вставить. Я хочу, чтобы он запускал код несколько раз, я не хочу выполнять его все время, чтобы получить около 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

помощь будет очень признательна

А у вас есть проблемы с этим заданием? Хотите задать вопрос?

Thorsten Kettner 18.07.2024 13:07

Почему вы хотите использовать CURSOR? Обычно это последнее, что вам следует использовать.

Thom A 18.07.2024 13:54

Итак, чтобы уточнить, вы хотите сгенерировать число от 1 до 50, 10 раз, а затем получить каждую перестановку этих чисел? Это 50^10 (97 656 250 000 000 000) строк! И тогда вам нужен произвольный 1 000 000 таких строк?

Thom A 18.07.2024 13:56

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

AlwaysThatGuy 18.07.2024 13:57

По правде говоря, если вы вставляете 10 случайно сгенерированных чисел в 10 столбцов, вероятность столкновения, когда 2 строки имеют одно и то же число 10, мала... Я бы просто наложил уникальное ограничение на таблицу, и если вы получите столкновение, запустите оператор еще раз, вероятность того, что это произойдет дважды, бесконечно мала.

Thom A 18.07.2024 13:59

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

AlwaysThatGuy 18.07.2024 13:59

Меня не беспокоит, если одно и то же число находится в двух разных строках, я просто не хочу, чтобы одно и то же число отображалось в одной строке.

AlwaysThatGuy 18.07.2024 14:00

Это то, что должно быть объяснено в вашем вопросе... Отредактируйте его, чтобы правильно объяснить проблему; обеспечить расходуемые результаты (и неожиданные результаты).

Thom A 18.07.2024 14:03

Для этого вам не нужен курсор. Если вы используете таблицу Numbers, вы можете реплицировать столько строк, сколько захотите. Однако NEWID() — плохой выбор для случайных чисел, поскольку на самом деле случайными являются только несколько байтов. Если вас действительно не волнует случайность, просто достаточно разные значения

Panagiotis Kanavos 18.07.2024 14:18

@PanagiotisKanavos CHECKSUM(NEWID()) достаточно случайен, по-видимому, даже более случайен, чем RAND().

Charlieface 18.07.2024 15:05

Случайные числа могут привести к тому, что все значения в одной строке будут одинаковыми, и эта строка может повторяться. Возможно, вам нужно лучшее описание, например. каждая строка должна быть заполнена 10 различными значениями, взятыми из пула из 50 значений. Это по-прежнему позволяет повторяющиеся строки. Возможно, вы захотите посетить Random.org для получения дополнительной информации и действительно случайных чисел.

HABO 19.07.2024 20:31
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
11
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Курсор не нужен. Просто используйте 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-й миллион сгенерированных чисел?

AlwaysThatGuy 18.07.2024 15:52

Для этого вам нужно будет выполнить подзапрос. Он будет фильтровать сигналы на расстоянии 1 метра и ниже этого значения. Или вы можете сгенерировать более 1 метра, затем отфильтровать его и взять TOP (1000000). Какая фильтрация вам нужна?

Charlieface 18.07.2024 16:09

Я хочу отфильтровать строки, содержащие повторяющиеся числа в одной строке. @Чарлифейс

AlwaysThatGuy 22.07.2024 14:04

Так что тебе мешает это сделать. Как я уже сказал, просто используйте подзапрос и выполните несколько сопоставлений для всех случаев.

Charlieface 22.07.2024 14:07

Другие вопросы по теме