Есть ли способ использовать SQL для вставки повторяющихся строк в таблицу A в зависимости от результатов числового столбца в таблице B? - PullRequest
0 голосов
/ 08 мая 2019

Я использую TSQL на SQL Server и столкнулся с проблемой ...

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

Однако, как дополнительный уровень сложности, один из столбцов в Таблице A содержит числовое число (это может быть любое число от 0 до 50), и в зависимости от этого числа я должен сделать n чисел для дубликатов.этот конкретный ряд.(например, в TableA у нас есть столбец с именем TableA.RepeatNumber, и он будет определять, сколько дублирующих строк мне нужно создать для этой строки в TableB. Стоит отметить, что некоторые строки не будут нуждаться в дубликатах, так как они будут иметьзначение 0 в TableA.RepeatNumber)

(Эта хранимая процедура ниже прекрасно работает для вставки отдельных строк в TableB.)

ALTER PROCEDURE [dbo].[Insert_rows]

    @IDCode     As NVarChar(20),
    @UserName   As NVarChar(20)

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here

Insert INTO TableB (Status, Number, Date, Time, User)
    SELECT Status, Number, date, Time, User, 
      FROM TableA where Status = 1 AND RepeatNumber > 0 AND Code = @IDCode AND User = @UserName

END

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

С наилучшими пожеланиями

Дик

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

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

declare @TableA table(Status nvarchar(10),RepeatNumber int,[date] date,Time time,[User] nvarchar(10));
insert into @TableA values('Status 0',0,'20190101','00:00:00','User 0'),('Status 1',1,'20190101','01:01:01','User 1'),('Status 2',2,'20190102','02:02:02','User 2'),('Status 3',3,'20190103','03:03:03','User 3');

with t(t)as(select t from(values(1),(1),(1),(1),(1),(1),(1),(1))as t(t))
    ,n(n)as(select top 50 row_number()over(order by(select null)) from t,t t2)
select Status
      ,RepeatNumber
      ,[date]
      ,Time
      ,[User]
      ,n.n
from @TableA as a
    join n
        on a.RepeatNumber >= n.n
where RepeatNumber > 0
order by a.Status
        ,n.n;

выход

+----------+--------------+------------+------------------+--------+---+
|  Status  | RepeatNumber |    date    |       Time       |  User  | n |
+----------+--------------+------------+------------------+--------+---+
| Status 1 |            1 | 2019-01-01 | 01:01:01.0000000 | User 1 | 1 |
| Status 2 |            2 | 2019-01-02 | 02:02:02.0000000 | User 2 | 1 |
| Status 2 |            2 | 2019-01-02 | 02:02:02.0000000 | User 2 | 2 |
| Status 3 |            3 | 2019-01-03 | 03:03:03.0000000 | User 3 | 1 |
| Status 3 |            3 | 2019-01-03 | 03:03:03.0000000 | User 3 | 2 |
| Status 3 |            3 | 2019-01-03 | 03:03:03.0000000 | User 3 | 3 |
+----------+--------------+------------+------------------+--------+---+
0 голосов
/ 08 мая 2019

Вы можете использовать рекурсивный CTE:

with a as (
      select a.Status, a.Number, a.date, a.Time, a.User, a.RepeatNumber, 1 as seqnum
      from tablea a
      where Status = 1 and RepeatNumber > 0 and Code = @IDCode and User = @UserName
      union all
      select Status, Number, date, Time, User, RepeatNumber, seqnum + 1
      from a
      where seqnum < RepeatNumber
     )
insert INTO TableB (Status, Number, Date, Time, User)
    select Status, Number, date, Time, User 
    from a;

Вам нужно до 50 дубликатов, поэтому вам не нужно беспокоиться о максимальной рекурсии.

Таблица чисел также может быть использована для этой цели.

...