Обновление цикла запросов SQL Server, пока не будет достигнут номер X - PullRequest
0 голосов
/ 28 мая 2018

Мне нужно обновить несколько строк в базе данных одновременно.Теперь проблема в том, что я буду знать только уникальный идентификатор ПЕРВОЙ строки, но после этого у меня будет X ряд других строк, которые также должны быть обновлены с некоторыми данными.Я буду знать, сколько циклов мне потребуется, чтобы обновить их - просто нужно знать, как это сделать.

Мой запрос выглядит так:

UPDATE bLine 
SET @val1 
WHERE theGuid = @val2;

Теперь данныедля @ val1 выглядит следующим образом:

ID | qty_SerialNum | qty_Location | qty_Property | theGUID 
---+---------------+--------------+--------------+---------------------------
5  | 6845fg56      | Home         | NA           | a45vz-u300-2bd-4710j-vf09
6  | fk469fkh      | Dock#4       | NA           |
7  | geww2         | Dock#1       | Local        |
...

Который, когда в строке для отправки на @ val1 :

@val1 = qty_SerialNum = '6845fg56,fk469fkh,geww2',
        qty_Location = 'Home,Dock#4,Dock#1',
        qty_Property = 'NA,NA,Local' 
@val2 = theGUID = 'a45vz-u300-2bd-4710j-vf09'

Так что все в порядке, так как язнаю GUID первой строки , который нуждается в обновлении, но каждую строку после , которую я не знаю .

Так1-е обновление будет выглядеть из 3:

UPDATE
   bLine
SET
   (qty_SerialNum = '6845fg56',qty_Location = 'Home',qty_Property = 'NA' )
WHERE 
   theGuid = 'a45vz-u300-2bd-4710j-vf09';

И это будет 2-е обновление из 3:

UPDATE
   bLine
SET
   (qty_SerialNum = 'fk469fkh',qty_Location = 'Dock#4',qty_Property = 'NA' )
WHERE 
   ???? = ????;

И, наконец, это будет 3-е обновление из 3:

UPDATE
   bLine
SET
   (qty_SerialNum = 'geww2',qty_Location = 'Dock#1',qty_Property = 'Local' )
WHERE 
   ???? = ????;

Итак, вопрос здесь - как я могу перебрать следующие X строк и обновить эту информацию с помощью 2,3, ...значения в @ val1 (пропуская первое, поскольку оно уже сохранено через theGUID)?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

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

Я принимаю некоторые предположения здесь и ниже рабочая демо

create table bline (ID int, qty_SerialNum varchar(100),qty_Location varchar(100),qty_Property varchar(100), theGUID  varchar(100))
insert into bline values 
(5,'random','garbage','existing','a45vz-u300-2bd-4710j-vf09')
,(6,'data','random','garbage', NULL)
,(7,'existing','data','.', NULL);

create table #V (qty_SerialNum varchar(100),qty_Location varchar(100),qty_Property varchar(100))
insert into #V values
('6845fg56','Home','NA'),
('fk469fkh','Dock#4','NA'),
('geww2','Dock#1','Local')


;with map as
  (
       select id, 
          rn=row_number() over ( order by id asc) 
       from bline 
          where theGUID is NOT NULL
   ),
mappedBline as
   (
       select 
           b1.*,
           rn
       from
           bline b1 join
       (
           select b.id,
               rn=max(rn)
           from bline b 
               join map m
                   on b.id >=m.id
           group by b.id
         )b2 
       on b2.id=b1.id
     ),
updateSet as
    (
        select 
            M.*, 
            updaterow=row_number() over( order by M.id)
        from mappedBline M join
          mappedBline M2 
              on M.rn=M2.rn 
                and M2.theGUID = 'a45vz-u300-2bd-4710j-vf09' --@val2
     )

 update U
     set
         qty_SerialNum=V.qty_SerialNum,
         qty_Location= V.qty_Location,
         qty_Property =V.qty_Property
 from
 updateSet U join
 ( select 
      *, updaterow =row_number() over (order by (select NULL))
  from #V
  )V
  on U.updaterow=V.updaterow

select * from bline
0 голосов
/ 29 мая 2018

У вас очень загадочная проблема.Как правило, обновления SQL не предназначены для «смежных» строк.Однако вы можете заставить его работать, сохранив значения в (виртуальной) таблице и соединив две стороны:

with v as (
      select v.*
      from (values (1, '6845fg56', 'Home', 'NA'),
                   (2, 'fk469fkh', 'Dock#4', 'NA'),
                   (3, 'geww2', 'Dock#1', 'Local')
           ) v(seqnum, qty_SerialNum, qty_Location, qty_Property)
     )
update b
   set qty_SerialNum = v.qty_SerialNum,
       qty_Location = v.qty_Location,
       qty_Property = v.qty_Property
    from (select top(3) b.*,
                 row_number() over (order by id) as seqnum
          from bline b
          where id >= (select id from bline where theGUID = 'a45vz-u300-2bd-4710j-vf09'
          order by id
         ) b join
         v
         on b.seqnum = v.seqnum;
...