We now that merge
statement in SQL SERVER. With Merge
statement we can merge the data from Source table into Target table.
These articles we will work around
merge statement over xml data type. We know that xml data type SQL SERVER. XML
Data type is used to storing xml data used Bulk Insert Data into SQL Tables.
Example:
--Create
Student Table
if object_id('Student') is null
create table Student(id int identity(1,1) ,Name varchar(20), Marks int)
Declare Xml Data Type and Assign Some Xml Data.
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>
</Root>'
select @Data as StudentData
--no
record in Student Table
Merge Statement usign
Xml Data.
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
by target then
insert (Name,Marks) values(Src.Name,Src.Marks);
select * from
Student
Here All rows gets
inserted because of no matched records existed in Student table with Name Key
This time I changed the Xml Data Marks
Column With Same Data this time need to update Student table Data.
Declare @Data xml
set @Data=
'<Root>
<Student>
<Name>Rakesh</Name>
<Marks>60</Marks>
</Student>
<Student>
<Name>Mahesh</Name>
<Marks>90</Marks>
</Student>
<Student>
<Name>Gowtham</Name>
<Marks>80</Marks>
</Student>
</Root>'
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
by target then
insert (Name,Marks) values(Src.Name,Src.Marks);
select * from
Student
Remove Some Data from
Xml (“Here GoWtham “ Record)
Declare @Data xml
set @Data=
'<Root>
<Student>
<Name>Rakesh</Name>
<Marks>60</Marks>
</Student>
<Student>
<Name>Mahesh</Name>
<Marks>90</Marks>
</Student>
</Root>'
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
by target then
insert (Name,Marks) values(Src.Name,Src.Marks)
when not matched
by source then Delete;
select * from
Student
Comments
Post a Comment