摘要: SQL Server许多方面都用到了XML:SQL Server可以存储XML数据、XML架构、根据XML架构验证XML数据DDL触发器返回事件详细数据是XML数据结构(EVENTDATA)的,导致触发器被触发Extended events返回的trace数据是XML格式的Logon触发器返回的详细数据和DDL触发器是相似的,都是EVENTDATA结构的Service Broker中传输的数据都是基于XML的Event notifications通过Service Broker队列发送DDL事件详细信息。这些通知都是基于XML的XML是纯文本、基于Unicode的元数据语言(描述语言的语言), 阅读全文
posted @ 2012-12-25 14:05 马啸西风 阅读(2372) 评论(0) 推荐(0) 编辑
 
摘要: 许多SQL Server的组件都可以扩展,过去扩展数据库引擎都是通过extended stored procedures,其问题是编程复杂,基于C++的,直接在SQL Server的处理空间上执行,这个位置不是一个安全执行位置,任何错误都可能引起数据库引擎不稳定;即使最不安全的托管代码也比非托管代码安全托管代码的优点:类型安全性丰富的类库高级的异常处理有些情形性能更高在托管代码中可以创建的数据库对象:用户自定义函数、存储过程、触发器(DML、DDL),托管代码还允许创建其他类型对象:自定义数据类型、自定义的聚合函数T-SQL是在数据库中操作数据的主要方法,它被设计用来直接的数据访问,提供高性能 阅读全文
posted @ 2012-12-25 14:04 马啸西风 阅读(690) 评论(0) 推荐(0) 编辑
 
摘要: 触发器是特殊的存储过程,在事件发生时执行;DML触发器在INSERT、UPDATE、DELETE时触发,DDL触发器在像CREATE、ALTER、DROP时触发,Logon触发器在建立会话时触发触发器和触发它的语句被认为是一个操作,如果回滚的话,这两个一起回滚,如果这个语句是外层事务的一部分的话,外层事务也会被回滚;触发器也可以级联修改相关表,但是这样的操作,还是使用级联引用完整性约束更高效一些相对于CHECK约束来说,触发器可以完成更加复杂的约束检查,在触发器中还可以引用其他表;触发器还可以定制错误消息,使得传递给客户的消息更有意义;可以为同一类型的操作定义多个触发器AFTER Trigge 阅读全文
posted @ 2012-12-25 14:03 马啸西风 阅读(2012) 评论(0) 推荐(0) 编辑
 
摘要: 使用CHECK约束时,当返回FALSE时,插入值将被拒绝,但是如果为NULL的话不会被拒绝,需要非常小心返回NULL值的情况在数据库术语中,候选键用来描述列或者列的组合,这些列用来唯一标示一行数据,所有这些列都不允许为NULL;主键就是一个候选键,是用来唯一确定一行的主要方式;最好是为主键约束定义一个名称,而不是让SQL Server为主键定义名称;SQL Server内部会为主键约束创建索引UNIQUE约束要求只有一行可以为NULL,SQL Server内部会为UNIQUE约束创建索引,和其他约束一样,最好为UNIQUE约束定义一个名称,而不是让SQL Server去定义名称FOREIGN 阅读全文
posted @ 2012-12-25 14:01 马啸西风 阅读(834) 评论(0) 推荐(0) 编辑
 
摘要: Merge语句用来在没有数据时插入数据,在有数据时更新数据,用来更新批量数据;Merge操作是原子性的,要么全部成功,要么全部失败;在Merge中指定目标表,在USING中指定源表,源表除了实际表以外,还可以是视图、子查询或者派生表(带别名)、CTE、值语句(带别名)WHEN MATCH语句用来定义在源表中的行匹配目标表中的行时的行为,包括UPDATE、DELETE、INSERT,只可以更新目标表,如果更新其他表的话会返回错误;最多可以包含两个WHEN MATCH语句,第一个语句必须包含AND条件,当AND条件满足时,执行第一个WHEN MATCH,当AND条件不满足时,执行第二个WHEN M 阅读全文
posted @ 2012-12-25 00:32 马啸西风 阅读(1760) 评论(0) 推荐(0) 编辑

2012年12月25日

摘要: 标量函数,当使用T-SQL实现时不能返回rowversion、cursor、table,当使用托管代码实现时,不能返回rowversion、cursor、table、text、ntext、image创建标量函数时,CREATE FUNCTION必须是批处理中唯一语句;和存储过程不同,使用函数时,必须使用BEGIN...END抱住函数体,存储过程中BEGIN...END是可选的创建用户自定以的标量函数的Guidelines:函数使用两部分命名法,函数中引用的数据库对象也使用两部分命名法在函数中,错误将导致整个函数停止执行,而存储过程或者触发器则是只取消产生错误的语句执行,然后继续执行接下来的语句 阅读全文
posted @ 2012-12-25 13:59 马啸西风 阅读(7062) 评论(0) 推荐(1) 编辑
 
摘要: 错误可能发生执行的各个阶段,包括语法检查阶段、对象名称识别阶段、语句执行阶段;错误即可以在数据库引擎中处理,也可以在应用程序中处理错误类型,根据错误发生时机区分:Syntax Errors,语法错误Object Resolution Errors,对象识别错误Statement Terminating Errors,语句终止错误,发生错误的下一条语句继续执行Batch、Connection、Server Terminating Errors,通常都是非常严重的错误,比如硬件错误,非常少见错误本身也是一个对象,具有如下属性:Error number:唯一的错误编码Error Message:错误 阅读全文
posted @ 2012-12-25 13:57 马啸西风 阅读(3123) 评论(0) 推荐(0) 编辑
 
摘要: 每个事务都是记录在事务日志中,数据修改首先写到事务日志中,然后在写到数据库中,如果事务的任何部分失败,修改全部回滚,数据库保持在原来的状态,事务使用锁阻止其他用户读取或者修改还没有提交的数据SQL Server默认是自动提交,即每个T-SQL语句执行成功就提交,执行失败就回滚,除非显式开启事务;默认是只回滚产生错误的语句,如果XACT_ABORT设置为ON的话,则出现错误时回滚整个批处理使用WITH MARK选项可以为事务指定一个描述,描述被标记在事务日志中,这个事务日志标记用于restore数据库,表明想要restore的点;SAVE TRANSACTION语句创建一个save point, 阅读全文
posted @ 2012-12-25 00:35 马啸西风 阅读(2919) 评论(0) 推荐(0) 编辑

2012年12月22日

摘要: 共有两类基本的system stored procedure:system stored procedure:T-SQL语言写的,在master数据库中提供的,大部分使用的是sp_前缀,在其他数据库中使用的时候,不需要指定master数据库作为他们的名称的一部分,典型应用于管理任务system extended stored procedure:非托管代码写的(主要是C++),通过DLL提供的,大部分使用的是xp_前缀,用来扩展无法使用T-SQL完成的任务还可以创建用户自定义的extended stored procedure,然后附加到SQL Server上,现在已经被遗弃,因为extend 阅读全文
posted @ 2012-12-22 23:25 马啸西风 阅读(1831) 评论(0) 推荐(0) 编辑
 
摘要: 非聚集索引也是基于二叉树,叶子节点存储的是指向表结构的指针,而不是数据,数据和索引是分开存储的,其Index ID=2或者更高;提高查询性能,降低数据修改性能;一张表最多可以建999个非聚集索引当表是作为堆构建时,叶子节点存储的是Row ID指针;当表是使用聚集键构建时,叶子节点存储的是聚集键,如果聚集键不唯一的话,还需要为每个数据行保存一份uniqueifier值获取索引信息的方法:SSMS:可以查看每个表的索引,还包括预先建好的报表,这些报表展示数据库的状态,其中就包括索引信息sp_helpindex系统存储过程Catalog Views:sys.indexes:索引类型、文件组或者par 阅读全文
posted @ 2012-12-22 23:23 马啸西风 阅读(481) 评论(0) 推荐(0) 编辑