在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
面举一个例子来具体说明一下: 复制代码 代码如下: declare @UserName varchar(10) = 'user2'--表示某个登陆的用户名 merge into TargetTable as tg using (select UserName,[Level] from SourceTable where UserName=@UserName) as sr(UserName,[Level]) on tg.UserName=sr.UserName when matched then update set [Level]=sr.[Level]--更新授权级别 when not matched by target then insert (UserName,[Level]) values(@UserName,0)--表示游客 output $action; 执行结果为UPDATE,表示执行了更新操作,也正是我们想要的。 但是如果我们把@UserName赋值为'user6',希望能在TargetTable中插入一条记录,但是实际执行结果为空,显示什么都没执行。原因就是using (select UserName,[Level] from SourceTable where UserName=@UserName) as sr(UserName,[Level]) on tg.UserName=sr.UserName这个语句中,sr结果集为空,所以merge语句就不向后执行了,不知道这是不是SQL Server的bug。 下面的SQL可以解决上面的问题: 复制代码 代码如下: declare @UserName varchar(10) = 'user7'--表示某个登陆的用户名 merge into TargetTable as tg using (select @UserName) as sr(UserName) on tg.UserName=sr.UserName when matched then update set [Level]= (select top 1 [Level] from SourceTable where UserName=@UserName) --更新授权级别 when not matched by target then insert (UserName,[Level]) values(@UserName,0)--表示游客 output $action; |
请发表评论