#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 ?