1. Merge语句用来在没有数据时插入数据,在有数据时更新数据,用来更新批量数据;Merge操作是原子性的,要么全部成功,要么全部失败;在Merge中指定目标表,在USING中指定源表,源表除了实际表以外,还可以是视图、子查询或者派生表(带别名)、CTE、值语句(带别名)
  1. WHEN MATCH语句用来定义在源表中的行匹配目标表中的行时的行为,包括UPDATEDELETEINSERT,只可以更新目标表,如果更新其他表的话会返回错误;最多可以包含两个WHEN MATCH语句,第一个语句必须包含AND条件,当AND条件满足时,执行第一个WHEN MATCH,当AND条件不满足时,执行第二个WHEN MATCH,必须一个指定UPDATE操作,一个指定DELETE操作;这个语句大部分情况下是用来更新目标表中已经存在的行
  2. WHEN NOT MATCHED BY TARGET语句用来定义当源表中的行在目标表中找不到时的行为,BY TARGET是可选的可忽略的,在行为语句中不能包含表明,因为操作只能针对目标表,不可以更新其他表;通常用来在目标表中插入一个新行,可以不指定Column列表,但是建议是指定的,这个和标准的INSERT语句是一直的
  3. WHEN NOT MATCHED BY SOURCE定义当源表中的行在目标表中不存在时的行为,不经常使用,主要用于删除目标表中不匹配的行,也可以进行更新操作
  4. OUTPUT语句提高了被操作的数据行的详细信息,这些信息不仅可以返回给客户端,也可以插入另外一张表中
  5. OUTPUT语句可以和Merge语句一起使用,$action返回执行的行为,即INSERTUPDATEDELETE,自SQL Server 2008其,OUTPUT结果集可以作为INSERT SELECTUPDATE SELECTDELETE SELECT的数据源
  6. 使用标准的带JOINUPDATE语句时,允许多个源行更新一个目标行,但是使用MERGE语句时,每个源行必须匹配一个目标行或者不匹配,否则出错并回滚;通常来说,使用MERGE语句比使用分开的UPDATEINSERTDELETE语句效率要高,特别是MERGE操作对数据只做一次处理
  7. 在许多应用程序中,时间都花在命令在应用程序和数据库往返的时间上,通常比执行命令时间都长,因为开发者通常都将开发可以被重用的代码作为目标,这导致执行一个任务时,将任务拆分为多个小任务,导致在数据库服务器之间多次往返;设计系统最大化一致性的黄金法则是不要将事务打开太久
  8. 当使用带有分隔符的列表时,整个值集合都作为字符串被发送,其问题如下:
  • 传递的数据类型无法控制
  • 结构松散,比如即可以传递五列又可以传递六列
  • 需要写自定义的解析逻辑
  1. SQL Server 2005开始,可以使用XML,这使得数据解析变得容易,处理XML数据其内部也有优化
  2. SQL Server 2000中可以声明一个TABLE类型的变量,需要定义这个表的架构(即表结构),表架构即变量仅仅在声明变量的批处理范围内有效;SQL Server 2008引入了创建用户自定义表类型的能力,其比带有分隔符列表优势是轻松传递复杂架构,包含明确数据类型,减少潜在的不一致性;注意不可以修改表类型,只能删除重建
  1. SQL Server 2008引入了引入了行构造和多行插入语句,这对于使用表变量和数据库中的表来说非常有用,在SQL Server 2008之前除非使用INSERT...SELECT或者INSERT...EXEC语句,否则每次只能插入一行;注意多行插入是原子操作,要么全部成功,要么全部失败,最多不超过1000行,减少了往返数量
  1. 用户自定义的表数据类型可以用作存储过程的输入参数,必须在定义中包含READONLY,不能用作输出参数;表变量的使用可以有效减少数据往返,比如要保存客户订单数据,则需要保存订单数据以及订单详细信息数据,这需要在一个事务中完成多个操作,进行多次往返,而使用表变量的话,只需要将这些信息都封装成表变量,然后传递给存储过程,在存储过程内部使用事务完成所有工作即可,这样只需要一次往返
  2. 行构造器是操作表变量的理想方法