SQL Server: как настроить слияние при сопоставлении областей

#tsql

#tsql

Вопрос:

Смотрите мой код, в котором я вставляю или обновляю таблицу из XML с помощью инструкции merge.

 drop table if exists Student
       
  Declare @Data xml  
             
   set @Data=  
   '<Root>  
   <Student>  
   <Name>Rakesh</Name>  
   <Marks>80</Marks>  
   </Student>  
   <Student>  
   <Name>Mahesh</Name>  
   <Marks>90</Marks>  
   </Student>  
   <Student>  
   <Name>Gowtham</Name>  
   <Marks>60</Marks>  
   </Student>  
   <Student>  
   <Name>Manoj</Name>  
   <Marks></Marks>  
   </Student>  
   </Root>'  
         
    create table Student (
    Name varchar(10),
    Marks int
    )
       
    insert into Student values
    ('Rakesh',90),
    ('Mahesh',80),
    ('Jack',80),
    ('Manoj',57)
       
  DECLARE @archive TABLE
  (
     ActionType  varchar(10),
     Name varchar(10),
     Marks int
  );
       
   Merge into Student as Trg  
   Using (select d.x.value('Name[1]','varchar(20)') as Name ,  
   d.x.value('Marks[1]','int') as Marks from  
   @data.nodes('/Root/Student')as d(x)) as Src  
   on Trg.Name=Src.Name  
   When Matched Then update set  
   Trg.Marks=Src.Marks  
   when not matched  then  
   insert (Name,Marks) values (Src.Name,Src.Marks)
   OUTPUT
     $action ,
     inserted.*
  INTO @archive;
  

Я хочу, чтобы при совпадении имен выполнялось ОБНОВЛЕНИЕ, но когда совпадение имен, но метки пусты, тогда записи будут удалены на основе совпадения имен.

итак, скажите мне, как я могу это настроить.

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

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

Могу ли я использовать условие множественного сопоставления? если да, то это будет возможно.

пожалуйста, подскажите мне, как этого добиться. Спасибо

Комментарии:

1. Он может выполнять удаления. Вы просто вводите DELETE для операции.

Ответ №1:

Вы должны иметь возможность использовать несколько WHEN MATCHED частей, каждая из которых имеет условие поиска предложения. Один поиск проверяет, что Src.Marks не равен нулю, а другой проверяет, что это было.

Я также поставил условие поиска в NOT MATCHED части, поскольку, как я предполагаю, вы не хотите вставлять людей, у которых тоже нет меток.

 MERGE INTO Student as Trg  
USING (
    SELECT 
        d.x.value('Name[1]','varchar(20)') AS Name ,  
        d.x.value('Marks[1]','int') AS Marks 
    FROM  
        @data.nodes('/Root/Student') AS d(x)
) AS Src  
ON Trg.Name=Src.Name  
WHEN MATCHED AND Src.Marks <> 0 THEN 
    UPDATE 
    SET  
        Trg.Marks=Src.Marks  
WHEN MATCHED AND Src.Marks = 0 THEN
    DELETE
WHEN NOT MATCHED AND Src.Marks <> 0 THEN  
   INSERT (Name,Marks) 
   VALUES (Src.Name,Src.Marks)
   OUTPUT
     $action,
     inserted.*
  INTO @archive;
  

Комментарии:

1. Сэр, когда найдено совпадение, могу ли я обновить / вставить данные в другие таблицы оттуда? смотрите пример кода. посмотрите и скажите мне, работает ли это? MERGE INTO Student as Trg USING ( Select * from T1 ) AS Src ON Trg.Name=Src.Name WHEN MATCHED AND Src.Marks <> 0 THEN UPDATE SET Trg.Marks=Src.Marks UPDATE AnotherTable1 SET col=val1 where INSERT AnotherTable2(col1,col2) values ('a','b') WHEN MATCHED AND Src.Marks = 0 THEN DELETE WHEN NOT MATCHED AND Src.Marks <> 0 THEN INSERT (Name,Marks) VALUES (Src.Name,Src.Marks)

2. Не могли бы вы сказать мне, пожалуйста, какую блокировку sql server помещает в таблицу, когда мы вставляем данные Insert into table1(....) в Begin Tran amp; Commit Tran ?