Tsql SQL Server:如何在匹配区域时自定义合并

Tsql SQL Server:如何在匹配区域时自定义合并,tsql,Tsql,请参阅使用merge语句从XML插入或更新表的代码 drop table if exists Student Declare @Data xml set @Data= '<Root> <Student> <Name>Rakesh</Name> <Marks>80</Marks> </Student>

请参阅使用merge语句从XML插入或更新表的代码

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,有一个名为Manoj的学生,他的分数为空,然后将根据匹配的名称从表中删除记录

我怎么能在合并中提到这样一个条件:当名称匹配且标记不为空时,更新;当名称匹配但标记为空时,记录将从表中删除

我可以使用多个匹配条件吗?如果是的话,这是可能的


请指导我如何做到这一点。谢谢

您应该能够使用多个匹配部分,每个部分都带有子句搜索条件。一个搜索检查Src.Marks是否为零,另一个检查是否为零

我还对不匹配部分设置了子句搜索条件,因为我猜您也不希望插入没有标记的人

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;

它可以进行删除。您只是在操作中输入了DELETE。先生,当找到匹配项时,我可以从那里更新/插入数据到另一个表中吗?请参阅示例代码。看看,告诉我它能用吗?使用Select*from T1 as Src ON Trg.Name=Src.Name(匹配时为Src.Name)和Src.Marks 0将学生合并为Trg,然后更新集合Trg.Marks=Src.Marks更新另一个表格1集合col=val1,其中插入另一个表格2COL1,col2值“a”,匹配时为'b',Src.Marks=0,不匹配时删除,Src.Marks 0,然后插入名称,标记值Src.Name,Src.Marks当我们将数据插入到表1中时,您能告诉我sql server在表上放置了什么样的锁吗。。。。在Begin Tran和Commit Tran中使用?