惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
G
Google Developers Blog
雷峰网
雷峰网
WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
F
Full Disclosure
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
U
Unit 42
C
Cyber Attacks, Cyber Crime and Cyber Security
V
V2EX
C
Cisco Blogs
博客园 - 司徒正美
Project Zero
Project Zero
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
Scott Helme
Scott Helme
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
S
Securelist
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyberwarzone
Cyberwarzone
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
T
Threatpost
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
S
Security Archives - TechRepublic
博客园 - Franky
N
News | PayPal Newsroom
Simon Willison's Weblog
Simon Willison's Weblog
S
SegmentFault 最新的问题
W
WeLiveSecurity
A
Arctic Wolf
B
Blog

博客园 - 马啸西风

SQL Server 2008之XML数据存储 SQL Server 2008之托管代码 SQL Server 2008之触发器 SQL Server 2008之约束 SQL Server 2008之用户自定义函数 SQL Server 2008之错误处理 SQL Server 2008之创建高并发应用程序 SQL Server 2008之存储过程的设计和实现 SQL Server 2008之通过非聚集索引提高性能 SQL Server 2008之读取查询计划 SQL Server 2008之表结构实现 SQL Server 2008之索引设计 SQL Server 2008之视图的设计和实现 SQL Server 2008之表的设计和实现 SQL Server 2008之数据类型 启用Application library caching时,将多个不同步的程序集打包到一个ZIP包中的问题 垃圾收集导致的概率性发生的bug DataGridView中下拉列表框的实现 C#之集合
SQL Server 2008之合并数据和表传递
马啸西风 · 2012-12-25 · via 博客园 - 马啸西风
  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. 行构造器是操作表变量的理想方法

发表于 2012-12-25 00:32  马啸西风  阅读(1776)  评论()    收藏  举报

Powered By 博客园