SQL Server高级开发(Merge Into的使用)
我们先创建一张临时表 #TempTable包含三列:学生姓名,科目名称和成绩,建表语句如下:
Create Table #TempTable
(
StudentName nvarchar(20) Not Null,
SubjectName nvarchar(20) Not Null,
Score int null
)
其中学生姓名和科目名称是不能重复的,那么我们在插入数据时就会先检测数据是否存在,不存在就写入,存在就更新,SQL的写法如下:
Declare @StudentName As nvarchar(20)
Declare @SubjectName As nvarchar(20)
Declare @Score As int
Select @StudentName = N'小明'
Select @SubjectName = N'语文'
Select @Score = 88
If Exists (Select Top 1 * From #TempTable Where StudentName=@StudentName And SubjectName=@SubjectName)
Update #TempTable Set Score=@Score Where StudentName=@StudentName And SubjectName=@SubjectName
Else
Insert Into #TempTable(StudentName,SubjectName,Score) Values(@StudentName,@SubjectName,@Score)
我们第一次执行这个语句时,会在#TempTable写入一行数据,再次执行时就会更新这行数据。
下面我们来看一下如何使用Merge Into语法来替代上面的代码。
Declare @StudentName As nvarchar(20)
Declare @SubjectName As nvarchar(20)
Declare @Score As int
Select @StudentName = N'小明'
Select @SubjectName = N'语文'
Select @Score = 88
Merge Into #TempTable T1
Using (Select * From (Values(@StudentName,@SubjectName,@Score)) TempTable(StudentName,SubjectName,Score)) T2 On T2.StudentName=T1.StudentName And T2.SubjectName=T1.SubjectName
When Matched Then
Update Set T1.Score = T2.Score
When Not Matched Then
Insert (StudentName,SubjectName,Score)
Values (T2.StudentName,T2.SubjectName,T2.Score);
是不是感觉代码也没省多少,这只是对一行数据的操作,当需要大量数据写入更新时,我们将要更新的数据先写入临时表,再使用Merge Into语法进行更新时,效率会有很大提升。