SQL Server使用Merge语句当源表数据集为空时,无法进行查询的问题

 更新时间:2009年07月22日 08:22:15   作者:  
今天使用Merge语句时遇到了一个问题,当源表数据集为空时,merge就不工作了。

面举一个例子来具体说明一下:
有两个表SourceTable为登陆表,TargetTable为授权表,如果访问用户在登陆表中,更新授权表的授权级别,否则授权0表示游客。sql语句如下:

--SourceTable为登陆表,TargetTable为授权表
--如果访问用户在登陆表中,更新授权表的授权级别,否则授权0表示游客。
create table SourceTable(UserName nvarchar(10),Pwd int,[Level] int)
create table TargetTable(UserName nvarchar(10),[Level] int)
go
--下面是SQL Server2008新增的赋值功能,更多新功能请参见

insert into SourceTable values('user1','111',1),('user2','222',2),('user3','333',3)
insert into TargetTable values('user1',1),('user2',2)

一般情况,我们会写如下的语句:

复制代码 代码如下:

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;

相关文章

  • 删除Table表中的重复行的方法

    删除Table表中的重复行的方法

    在写SQL的时候经常会有这样的需求: 在一个Table中会有多条重复的数据,如何有效的取出来不重复的数据,或者是删除掉重复的数据,或者取出某列重复值的第一条数据.
    2010-06-06
  • SQL SERVER先判断视图是否存在然后再创建视图的语句

    SQL SERVER先判断视图是否存在然后再创建视图的语句

    SQL SERVER中先判断视图是否存在,使用IF NOT EXISTS,然后再创建视图,使用create view,整个过程如下
    2014-08-08
  • SQL SERVER常用的日期与时间查询总结

    SQL SERVER常用的日期与时间查询总结

    这篇文章介绍了SQL SERVER常用日期与时间查询的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • sqlServer实现分页查询的三种方式

    sqlServer实现分页查询的三种方式

    在SqlServer中分页查询是经常用到的查询语句,一个好的分页查询语句,不能将代码省略,下面这篇文章主要给大家介绍了关于sqlServer实现分页查询的三种方式,需要的朋友可以参考下
    2023-03-03
  • sql2000挂起无法安装的问题的解决方法

    sql2000挂起无法安装的问题的解决方法

    关于:以前的某个程序安装已在安装计算机上创建挂起的文件操作 解决办法
    2008-11-11
  • sql条件查询语句的简单实例

    sql条件查询语句的简单实例

    这篇文章介绍了sql条件查询语句的简单实例,有需要的朋友可以参考一下
    2013-10-10
  • 文本、Excel、Access数据导入SQL Server2000的方法

    文本、Excel、Access数据导入SQL Server2000的方法

    昨天参加一个项目的维护,因为各种原因,数据在不同服务器上不一致,所以需要重新将数据库清空一次,并将整理后的数据重新导入。需导入的数据源为文本文件,记录以行存储,“,”逗号分割各字段,每个字段值用“”双引号封闭。
    2008-10-10
  • SQL Server中row_number函数的常见用法示例详解

    SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • SQL Server 2005作业设置定时任务

    SQL Server 2005作业设置定时任务

    这篇文章主要介绍了SQL Server 2005作业设置定时任务的相关详细步骤,需要的朋友可以参考下
    2017-01-01
  • 公网远程访问局域网SQL Server数据库

    公网远程访问局域网SQL Server数据库

    数据库的重要性相信大家都有所了解,在某些场景下,数据库已经成为企业正常运行必不可少的条件之一。与企业的其他工作一样,数据库也需要进行必要的维护,想详细了解的同学可以参考这篇文章
    2023-04-04

最新评论