SQL Server: использование курсора для зацикливания и вставки дополнительных значений - PullRequest
0 голосов
/ 20 сентября 2019

Мне нужно создать это задание SQL, которое выбирается из таблицы (ot) и вставляется в другую таблицу (est_Request).ReqDocNo - это столбец в таблице est_Request, в котором хранятся текущие числа.Как видно из приведенного ниже кода, он выберет максимальное число из таблицы est_Request и +1 для создания нового.На данный момент последнее число в столбце - 0000068150. Мне нужно выполнить цикл, потому что в таблицу будут вставлены тысячи записей из таблицы ot.
Но когда я пытаюсь выполнить запрос ниже, ошибка отображается как '' Не удаетсявставить строку дубликата ключа в объект «dbo.est_Request» с уникальным индексом «Request_ix1».Значение дубликата ключа: (0000068151, 20 сентября 2019, 12:00, 20 сентября 2019, 00:00).

declare @ReqDocNo       nvarchar(10)

Declare reqdocno cursor for
select ReqDocNo from est_Request
open reqdocno
fetch next from reqdocno into @ReqDocNo

while @@fetch_status = 0
Begin

Select @ReqDocNo = isnull(max(ReqDocNo),0) + 1 from est_Request  
select @ReqDocNo  = right('0000000000' + convert(nvarchar(10),@ReqDocNo),10) 

insert  into est_Request
select @ReqDocNo,'',convert(date, pick_up_date, 103),convert(time,shift_time,103),convert(date,send_back_date,103),convert(time,send_back_time,103),pic,'',ext,convert(date, getdate()), convert(time,  getdate()),'','','','',status
FROM ot

fetch next from reqdocno into @ReqDocNo
end

close reqdocno
deallocate reqdocno

Как этого добиться?

Редактировать:
Описание индекса для таблицы est_Request:
PK_est_Request |некластерный, уникальный первичный ключ, расположенный на PRIMARY |ReqDocNo Request_ix1 |кластерный, уникальный, расположенный на ПЕРВИЧНОМ |ReqDocNo, PickUpDate, SendBackDate

Edit2:
Мне тоже нужно вставить в другую таблицу, поэтому я попробовал использовать одно из приведенных ниже решений:

    insert into est_RequestDetail
    Select ReqDocNo = right('0000000000'  
                    + convert(varchar(10), 
                              @ReqDocNo + row_number() over (order by ot.pick_up_date)), 
                     10), ot.empid, RouteNo,BusStopID,'',''  
      from est_BusGuest , ot
      where est_BusGuest.empid = ot.empid  
      and   routeNo in (select routeno from est_busroute a, est_buszone b  
                          where a.zoneno = b.zoneno  
                          and   b.branchid = '2')

Спасибо всем за помощь!

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Вот ваш сценарий.

declare @max int
set @max = (select max(ReqDocNo) from est_Request);


with cte as (
    select  isnull(@max, 0) + 1 as ReqDocNo, 2 as ctr
    union all 
    select isnull(@max, 0) + ctr, ctr + 1 from  cte 
    where ctr <= @max

)
insert into est_Request 
(select right('0000000000' + convert(nvarchar(10), rn + ReqDocNo ), 10) 
    ,convert(date, pick_up_date, 103),convert(time,shift_time,103)
    ,convert(date,send_back_date,103),convert(time,send_back_time,103)
    ,pic,'',ext,convert(date, getdate()), convert(time,  getdate()),'','','','', [status] 
    from (
        select row_number() over (order by ReqDocNo) as rn, ReqDocNo from cte) t1 
    cross apply
        (select pick_up_date, shift_time, send_back_date,send_back_time,pic,ext,[status] 
            from ot) t2 
option (maxrecursion 0));
1 голос
/ 20 сентября 2019
Курсор

здесь не нужен.Подойдет простое базовое решение.

declare @ReqDocNo  int = 0;

-- first you get the max `ReqDocNo`. 
-- Assuming that the column only contains n umeric and no alpha
Select  @ReqDocNo = isnull(convert(int, max(ReqDocNo)), 0) 
from    est_Request;

-- while inserting into the table, use `row_number()` to generate a running number
insert  into est_Request ( {specify the column name here} )
select  ReqDocNo = right('0000000000' 
                        + convert(varchar(10), 
                                  @ReqDocNo + row_number() over (order by ot.pick_up_date)), 
                         10),
        {the rest of your convert query}
FROM    ot

Примечание: вы получаете ошибку duplicate key, потому что вы вставляете все строки из ot в est_Request с одинаковым значением ключа @ReqDocNo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...