标题：Transact-SQL管理与开发实例精粹
图书信息
书名：突出重围：Transact-SQL管理与开发实例精粹  作者：赵松涛 等编著
ISBN：978-7-121-11447-2
出版日期：2010年10月
定价：59.00元
开本：16开
页码：460页
宣传语
专业专注，独到独家，深度深入
内 容 简 介
由于Transact-SQL语言良好的传承和继承性，因此，本书的绝大部分代码可以跨越SQL Server版本的限制，在SQL Server 2008、2005甚至2000上都可以使用，即使今后推出的新版本，几乎也不用修改就可以移植使用。本书涉及Transact-SQL使用的各个方面，但又不是联机丛书语法的简单复制，而是侧重于通过实例来学习综合使用Transact-SQL各语法要素完成特定任务的方法。
本书既适合数据库管理人员，也适合开发人员阅读和参考，还可作为大中专院校及各类培训班的教材，极具实用性。
前 言
图书难做，技术类的图书越来越难做，因为网络已经让资料的搜索和盗版几乎没有成本，还缘于社会转型期的喧嚣和浮躁已经让人很难静下心来读书。在接连出版了几本叫好不叫座的数据库图书后，我几乎已经完全丧失了写作的勇气。是郭立主任和她领导的博文视点这个团体给了我勇气和力量，在历经3年的打磨和反复修改的基础上，才有了这本图书的问世。个中辛苦，唯有自知。
从SQL Server 6.5到SQL Server 2008，我一直在学习、研究并使用，10多年的过程中，对其了解和掌握也有一个逐步加深的过程。如果说有什么心得和体会的话，我的理解是Transact-SQL语言应该是SQL Server的核心和精髓，因为不论是管理和开发，最终落脚都是Transact-SQL语言的作用。遗憾的是，大部分学习SQL Server的人员都在简单掌握其图形化管理界面操作后，往往忽略对Transact-SQL的学习和了解。一方面是SQL Server的联机丛书已经做得足够仔细，另外一方面也是因为Transact-SQL的学习没有好的实例和代码可以借鉴。
最近几年，我逐步深入研究SQL Server的核心机制，在此基础上形成了自己的一些研究结论。这本图书就是将自己对Transact-SQL的了解和掌握，以及研究使用的实例代码呈现给读者，绝非对联机丛书的简单雷同使用。因此，本书可以称为是一名数据库技术爱好者的独家秘笈。
原创留口碑，专业出精品。无论是管理还是开发人员，我相信这本书都可以作为您的案头丛书。
踏实做人，用心做事，我相信付出总会有回报。您的批评、建议和反馈就是对我最大的回报。本书中涉及的所有实例源代码进行下载。
本书主要由赵松涛编写，参与编写的还有李翔鹰（第6、11、13章）、余艳、王恩春、赵迎春、赵高飞、卢颖、朱远妮、李黎明、彭兴文、杜从云、朱春凤、邓新华。
感谢郭立女士和她领导的博文视点这个年轻的、充满朝气的团队给予我充分的创作自由并提出了宝贵的意见。
献给所有我的读者家人、父母和读者。
作 者
目 录
第1章 Transact-SQL语法元素 1
1.1 标识符 1
1.1.1 必须有标识符吗 1
1.1.2 标识符的排序规则 1
1.1.3 常规标识符 2
1.1.4 带分隔符的标识符 3
1.2 数据类型 3
1.2.1 哪些对象需要数据类型 3
1.2.2 如何选择恰当的数据类型 4
1.2.3 基本数据类型 5
1.2.4 SQL Server 2008新增数据类型 5
1.2.5 深入研究tinyint数据类型 6
1.2.6 深入研究smallint数据类型 8
1.2.7 深入研究int（Integer）数据类型 10
1.2.8 深入研究bigint数据类型 12
1.2.9 decimal（numeric）数据类型的使用 14
1.2.10 float数据类型的使用 16
1.2.11 real数据类型的使用 17
1.2.12 char数据类型的使用 17
1.2.13 varchar数据类型的使用 17
1.2.14 用CAST函数转换数据类型 18
1.2.15 用CONVERT函数转换数据类型 18
1.3 常量 19
1.3.1 数值型常量的格式 19
1.3.2 字符串型常量的格式 20
1.3.3 日期时间型常量的格式 20
1.4 注释 20
1.4.1 添加单行注释信息 20
1.4.2 添加多行注释信息 20
1.5 变量 21
1.5.1 变量的数据类型 21
1.5.2 变量的分类 21
1.5.3 局部变量的声明 21
1.5.4 局部变量的赋值 22
1.5.5 局部变量的作用域 23
1.6 常用聚合函数 23
1.6.1 计算平均值AVG 23
1.6.2 计算最小值MIN 24
1.6.3 计算最大值MAX 25
1.6.4 计算求和值SUM 26
1.6.5 计算项数值COUNT（COUNT_BIG） 26
1.6.6 计算标准偏差值STDEV 27
1.6.7 计算方差VAR 28
1.7 常用日期时间函数 29
1.7.1 获取当前日期GETDATE 29
1.7.2 获取年度信息YEAR 30
1.7.3 获取月份信息MONTH 30
1.7.4 获取天数信息DAY 30
1.7.5 任意获取日期时间值部分DATEPART 31
1.7.6 日期加法DATEADD 31
1.7.7 日期减法DATEDIFF 32
1.7.8 2008中新增的日期时间型函数 33
1.7.9 判断是否为日期数据ISDATE 33
1.8 常用字符串函数 33
1.8.1 获取字符的ASCII码ASCII 33
1.8.2 获取ASCII码对应的字符CHAR 34
1.8.3 获取字符的Unicode编码UNICODE 35
1.8.4 获取Unicode编码对应的字符NCHAR 36
1.8.5 获取字符串第一次出现位置PATINDEX 36
1.8.6 生成空格字符串SPACE 37
1.8.7 按指定次数重复生成字符串REPLICATE 38
1.8.8 截取子串SUBSTRING 39
1.8.9 获取字符串长度LEN 39
1.8.10 替换字符串中内容STUFF 40
1.8.11 指定位置搜索字符串中内容CHARINDEX 41
1.8.12 生成带分隔符的Unicode字符串QUOTENAME 42
1.8.13 转换浮点数字为字符串STR 42
1.8.14 截取左边字符串LEFT 43
1.8.15 截取右边字符串RIGHT 43
1.8.16 截取左边空格LTRIM 44
1.8.17 截取右边空格RTRIM 44
1.8.18 转换为小写字符串LOWER 45
1.8.19 转换为大写字符串UPPER 45
1.8.20 反序字符串REVERSE 46
1.8.21 获取字符串字节数DATALENGTH 46
1.9 常用文本和图像函数 47
1.9.1 查找特定字符串PATINDEX 47
1.9.2 获取文本指针TEXTPTR 47
1.9.3 检测文本指针是否有效TEXTVALID 49
1.9.4 读取文本图像列内容READTEXT 49
1.9.5 写入文本图像列内容WRITETEXT 50
1.9.6 更新文本图像列内容UPDATETEXT 51
1.10 常用数学函数 52
1.10.1 计算绝对值ABS 52
1.10.2 获取大于等于的最小整数值CEILING 53
1.10.3 获取小于等于的最大整数值FLOOR 53
1.10.4 获取随机数RAND 53
1.10.5 获取指定长度和精度ROUND 54
1.11 常用元数据函数 54
1.11.1 获取数据库标识符DB_ID 54
1.11.2 获取数据库名称DB_NAME 55
1.11.3 获取数据库属性值DATABASEPROPERTYEX 56
1.11.4 获取文件组标识符FILEGROUP_ID 57
1.11.5 获取文件组名称FILEGROUP_NAME 58
1.11.6 获取文件组属性值FILEGROUPPROPERTY 58
1.11.7 获取文件标识符FILE_ID 60
1.11.8 获取文件名称FILE_NAME 61
1.11.9 获取文件属性值FILEPROPERTY 62
1.11.10 获取数据对象标识符OBJECT_ID 63
1.11.11 获取数据对象名称OBJECT_NAME 64
1.11.12 获取文件属性值OBJECTPROPERTYEX 66
1.12 运算符 67
1.12.1 算术运算符 67
1.12.2 位运算符 68
1.12.3 比较运算符 68
1.12.4 逻辑运算符 68
1.12.5 字符串连接运算符 69
1.12.6 赋值运算符 69
1.12.7 运算符的优先级 69
第2章 Transact-SQL语句 70
2.1 控制流语句 70
2.1.1 程序块语句BEGIN..END 70
2.1.2 判断语句IF..ELSE 71
2.1.3 循环语句WHILE 72
2.1.4 分支判断语句CASE 74
2.1.5 无条件退出语句RETURN 75
2.1.6 无条件跳转语句GOTO 77
2.1.7 延期执行语句WAITFOR 78
2.2 运行时生成语句 79
2.2.1 用EXECUTE执行动态命令 80
2.2.2 用SP_EXECUTESQL执行动态命令 81
2.2.3 参数替换 83
2.2.4 为什么提倡使用SP_EXECUTESQL 84
2.2.5 使用输出参数的SP_EXECUTESQL 85
2.3 语句之间数据的传递 86
2.3.1 Transact-SQL语句之间数据的传递 86
2.3.2 Transact-SQL与高级语言之间数据的传递 87
2.4 错误处理 90
2.4.1 SQL Server数据库引擎错误 91
2.4.2 用TRY..CATCH发现错误 91
2.4.3 捕获错误的系统函数 92
2.4.4 用@@ERROR捕获上一条语句的错误 93
2.4.5 用RAISERROR反馈错误 94
2.5 批处理 96
2.5.1 GO的含义 96
2.5.2 研究批处理的执行 96
2.5.3 批处理的意义 99
2.5.4 为什么临时变量作用域不能跨批处理 100
2.5.5 如何编写批处理 101
2.5.6 批处理如何处理错误 101
2.5.7 脚本 102
第3章 查询服务器配置信息 103
3.1 配置查询环境 103
3.2 查询服务器属性值 104
3.2.1 ServerProperty系统函数 104
3.2.2 查询数据库引擎版本 105
3.2.3 综合使用ServerProperty函数查询 105
3.3 判断登录账户身份 106
3.4 读写注册表信息 106
3.4.1 读注册表xp_regenumvalues 107
3.4.2 读注册表xp_regread 107
3.4.3 写注册表xp_regwrite 108
3.4.4 删除注册表项xp_regdeletevalue 108
3.4.5 读注册表项xp_instance_regread 109
3.4.6 写注册表xp_instance_regwrite 109
3.4.7 读注册表中的主要数据文件路径信息 110
3.4.8 读注册表中的错误日志文件路径信息 111
3.4.9 读注册表中的日志文件路径信息 112
3.5 综合实例 113
3.5.1 获取“常规”选项卡信息 113
3.5.2 获取服务器配置参数信息 114
3.5.3 获取服务器上数据库信息 115
3.5.4 获取服务器上处理器数量 115
3.5.5 提升SQL Server服务器优先级 116
3.5.6 获得Windows版本信息 116
3.5.7 获得身份验证机制 117
3.5.8 获得登录审核机制 118
3.5.9 自动检测服务器重要的配置参数 118
3.5.10 查询服务器的用户或用户组 126
3.5.11 查询用户角色或应用程序角色 127
第4章 登录过程 129
4.1 连接 129
4.1.1 查询所有连接信息 129
4.1.2 查询连接总数 130
4.1.3 查询阻塞的连接 130
4.1.4 查询用户建立的连接 130
4.1.5 查询系统建立的连接 130
4.1.6 查询活动的用户连接 131
4.1.7 查询用户连接的不同客户机 131
4.2 配置 131
4.2.1 查询当前系统配置 131
4.2.2 查询当前最大工作线程数 132
4.3 会话 132
4.3.1 查询服务器上的所有会话 132
4.3.2 查询会话建立的游标 132
4.3.3 查询会话的错误信息 133
4.3.4 查询会话的缓冲区命中率 133
4.3.5 查询会话的操作系统线程 134
4.3.6 查询当前会话ID 135
4.4 综合运用 135
4.4.1 综合查询连接统计信息 135
4.4.2 判断当前登录的权限 137
4.4.3 查询会话超时设置 137
4.4.4 判断连接是否为DAC 138
4.4.5 查询当前连接的网络参数 138
4.4.6 查询SQL Server版本信息 139
4.4.7 查询服务器基本属性 139
4.4.8 查询当前登录名 141
4.4.9 查询当前的活动事务数 141
4.4.10 查询数据库缓冲区命中率低的会话 141
4.4.11 查询数据库缓冲区命中率最低的会话的SQL语句 142
第5章 数据库相关 144
5.1 查询数据库信息 144
5.1.1 查询所有的用户数据库名称 144
5.1.2 用sp_dboption存储过程配置数据库 145
5.1.3 配置数据库的恢复模式 145
5.1.4 判断数据库的名称是否含有特定字符 146
5.1.5 判断两个数据库的排序规则是否一致 147
5.1.6 判断数据库是否系统数据库和可读 148
5.1.7 查询可以访问的数据库 148
5.1.8 查询数据库的文件 149
5.1.9 查询数据库的系统表 150
5.1.10 查询数据库的排序规则 151
5.1.11 查询数据库的排序规则Windows代码 152
5.1.12 查询数据库支持的排序规则 152
5.1.13 统计数据库上的进程数 152
5.1.14 查询数据库的兼容性级别 153
5.1.15 查询数据库的最后备份时间 153
5.1.16 查询数据库的最后日志备份时间 153
5.2 数据库的存储空间 154
5.2.1 查询数据库的总空间 154
5.2.2 查询数据库的数据文件总空间 154
5.2.3 查询数据库的日志文件总空间 155
5.2.4 查询数据文件已经分配的空间 155
5.2.5 查询数据文件的可用空间 155
5.2.6 查询日志文件已经分配的空间 157
5.3 综合运用 159
5.3.1 查询数据库的属性 159
5.3.2 获取所有数据库的数据文件空间使用率排序 159
第6章 未公开的DBCC命令 162
6.1 DBCC PAGE查询数据页面 162
6.1.1 查询DBID和DBNAME 163
6.1.2 查询FILENUM和PAGENUM 163
6.1.3 DBCC PAGE的典型用法 163
6.2 DBCC LOG查询日志 164
6.3 DBCC ERRORLOG初始化错误日志 165
6.4 DBCC FLUSHPROCINDB清除缓存存储过程 166
6.5 DBCC BUFFER查询缓冲区 166
6.6 DBCC DBINFO显示数据库结构 167
6.7 DBCC DBTABLE显示数据字典 168
6.8 DBCC IND显示表的索引页面信息 168
6.9 DBCC PRTIPAGE显示索引每行的数据页 169
6.10 DBCC RESOURCE显示服务器资源情况 169
6.11 DBCC DBRECOVER恢复质疑数据库 170
6.12 DBCC CACHESTATS查看内存统计信息 170
6.13 DBCC MEMORYSTATUS查询内存分配 171
6.14 DBCC跟踪标记 171
6.14.1 概念 171
6.14.2 打开跟踪标记 172
6.14.3 关闭跟踪标记 172
6.14.4 查询跟踪标记状态 172
6.15 DBCC SHOWFILESTATS显示数据文件空间 172
6.16 WITH TABLERESULTS表格显示信息 173
6.17 DBCC LOGINFO查询虚拟日志信息 173
6.18 DBCC EXTENTINFO查询盘区数 174
第7章 数据和日志文件 176
7.1 FILEPROPERTY函数获得文件属性 176
7.1.1 判断文件是否只读 176
7.1.2 判断文件是否主要数据文件 177
7.1.3 查询文件已经使用空间 177
7.2 FN_VIRTUALFILESTATS获得文件I/O性能 177
7.2.1 查询指定文件的I/O性能 178
7.2.2 查询指定数据库所有文件的I/O性能 178
7.2.3 查询所有数据库所有文件的I/O性能 179
7.2.4 查询文件I/O性能的动态性能视图 180
7.3 日志文件相关 180
7.2.1 查询VLF分布情况 180
7.2.2 移动日志文件的内容 182
7.2.3 删除日志文件的内容 182
7.4 数据文件相关 183
7.4.1 查询所有数据库的数据文件空间情况 183
7.4.2 查询数据库存储空间的详细分布 185
7.4.3 查询已分配空间中的行内数据 192
7.4.4 查询已分配空间中的LOB大型数据 193
7.4.5 查询已分配空间中的行溢出数据 194
7.4.6 查询哪些类型的对象使用了数据空间 194
7.4.7 查询使用数据空间的对象类型及其数量 194
7.5 综合查询数据库文件的I/O性能 195
第8章 数据对象 197
8.1 索引 197
8.1.1 更新表上所有索引的统计信息 197
8.1.2 更新表上特定索引的统计信息 199
8.1.3 统计数据库中索引使用的空间总和 200
8.1.4 索引使用的空间详细情况 203
8.2 表 208
8.2.1 获得数据库表的存储空间分布 208
8.2.2 获得数据缓冲区中数据对象的存储分布 212
第9章 性能监控 218
9.1 对象分配性能 218
9.1.1 监控盘区分配情况 218
9.1.2 监控盘区回收情况 219
9.1.3 监控页面拆分情况 220
9.1.4 监控表上锁升级情况 221
9.2 内存性能 222
9.2.1 SQL Server内存详解 223
9.2.2 查询SQL Server服务器使用的内存数量 225
9.2.3 查询连接使用的内存数量 225
9.2.4 查询锁使用的内存数量 226
9.2.5 查询优化器使用的内存数量 226
9.2.6 查询SQL使用的内存数量 226
9.2.7 查询服务器能够使用的最大内存数量 227
9.2.8 查询当前服务器上可用内存数量 227
9.2.9 查询最小服务器内存 228
9.2.10 查询最大服务器内存 228
9.2.11 查询计算机的物理内存 229
9.2.12 查询计算机的虚拟内存 229
9.3 过程缓冲区性能 229
9.3.1 查询过程缓冲区使用的内存 229
9.3.2 查询过程缓冲区内容类别 230
9.3.3 查询过程缓冲区命中率 230
9.3.4 查询过程缓冲区对象分布比例 231
9.3.5 查询过程缓冲区中各类对象的命中率 232
9.3.6 查询过程缓冲区各类对象使用的比例 232
9.3.7 清除过程缓冲区中的对象 233
9.3.8 过程缓冲区中消耗资源Top对象 234
9.4 数据缓冲区性能 238
9.4.1 查询数据缓冲区的内存数量 238
9.4.2 查询数据缓冲区的理想内存数量 239
9.4.3 查询数据缓冲区的可用内存数量 239
9.4.4 查询数据缓冲区中数据使用的内存 239
9.4.5 查询数据缓冲区的命中率 240
9.4.6 清除数据缓冲区中的对象 240
9.4.7 数据缓冲区中消耗资源Top对象 241
9.5 其他实例 242
9.5.1 查询资源等待情况 242
9.5.2 查询计数器种类和性能值 243
9.5.3 查询执行计划的属性 244
9.5.4 查询性能计数器表是否可以使用 245
9.5.5 查询服务器内存总体分布情况 245
第10章 管理其他实例 250
10.1 检测和使用XP_CMDSHELL 250
10.1.1 检测XP_CMDSHELL是否启用 250
10.1.2 用XP_CMDSHELL执行命令 253
10.2 错误日志 253
10.2.1 产生并使用新的错误日志文件 253
10.2.2 获得错误日志文件的信息 254
10.3 代理服务 254
10.3.1 判断代理服务是否启动 254
10.3.2 查询代理服务上产生的警报 254
10.3.3 配置代理服务自启动 255
10.3.4 判断代理服务是否允许访问 255
10.3.5 获得代理服务启动信息 256
10.3.6 记录代理服务启动时间 256
10.3.7 获得代理服务子系统的信息 256
10.3.8 获得代理服务详细配置信息 256
10.3.9 运行代理服务监视器 258
10.3.10 刷新代理服务作业 258
10.3.11 查询代理服务活动作业 259
10.4 设置登录环境 259
10.5 数据库 260
10.5.1 产生数据库检查点 260
10.5.2 设置数据库单用户模式 260
10.5.3 分离数据库 260
10.5.4 附加数据库 260
10.5.5 判断指定路径的日志文件是否存在 261
10.5.6 获取主要数据文件中的文件信息 261
10.5.7 获取主要数据文件中的数据库信息 262
10.5.8 获取数据库的用户表信息 263
10.5.9 脱机数据库 264
10.5.10 联机数据库 264
10.5.11 收缩数据库 264
10.5.12 判断用户是否可以访问master数据库 264
10.6 访问注册表 265
10.7 读取硬盘空间信息 266
10.8 判断文件是否存在 266
10.9 存储空间的碎片 266
10.9.1 数据的存储类型 267
10.9.2 数据的存储结构 270
10.9.3 存储空间的碎片类型 270
10.9.4 碎片对数据操作性能的影响 271
10.9.5 dbcc showcontig检测碎片 272
10.9.6 dm_db_index_physical_stats检测碎片 274
10.9.7 消除碎片的方法 277
10.9.8 自动检测当前数据库的碎片 278
10.9.9 自动消除数据库的碎片 283
第11章 数据查询 288
11.1 语法结构 288
11.2 选择列表 289
11.2.1 选择所有列 289
11.2.2 选择特定列 293
11.2.3 包含运算符的查询 295
11.2.4 包含函数的查询 296
11.2.5 消除重复项 297
11.3 FROM子句 298
11.3.1 使用表别名 298
11.3.2 使用表提示 301
11.4 WHERE子句 305
11.4.1 WHERE子句中的运算符 306
11.4.2 比较查询 307
11.4.3 范围查询 308
11.4.4 列表查询 309
11.4.5 模式匹配查询 310
11.5 GROUP BY子句 312
11.5.1 语法结构 312
11.5.2 实例分析 313
11.6 ORDER BY子句 314
11.6.1 语法结构 314
11.6.2 实例分析 315
11.7 HAVING筛选查询 316
11.7.1 HAVING筛选查询的语法结构 316
11.7.2 HAVING筛选查询实例 316
11.8 INTO查询 316
11.8.1 INTO查询的语法结构 316
11.8.2 INTO查询实例 317
11.9 SELECT联结查询 317
11.9.1 SELECT联结查询的语法结构 317
11.9.2 SELECT联结查询的分类 317
11.9.3 笛卡儿积查询 318
11.9.4 等值联结查询 318
11.9.5 自然联结查询 318
11.9.6 自身联结查询 318
11.9.7 内联结查询 319
11.9.8 左外联结查询 319
11.9.9 右外联结查询 320
11.9.10 全外联结查询 320
11.10 SELECT嵌套查询 320
11.10.1 什么是SELECT嵌套查询 320
11.10.2 什么是SELECT嵌套子查询 321
11.10.3 简单嵌套查询 321
11.10.4 in嵌套查询 322
11.10.5 some嵌套查询 322
11.10.6 all嵌套查询 323
11.10.7 exists嵌套查询 324
11.11 操作结果集 324
11.11.1 Union形成并集 324
11.11.2 Except形成差集 325
11.11.3 InterSect形成交集 326
11.11.4 用公用表表达式临时存储结果集 326
第12章 数据操作 328
12.1 INSERT语句研究 328
12.1.1 表结构和索引结构 328
12.1.2 执行前的日志情况分析 329
12.1.3 执行情况分析 329
12.1.4 执行后的日志情况分析 331
12.1.5 研究数据的变化情况 332
12.1.6 研究结论 333
12.2 UPDATE语句研究 334
12.2.1 执行前的日志情况分析 334
12.2.2 执行情况分析 334
12.2.3 执行后的日志情况 335
12.2.4 研究结论 338
12.3 DELETE语句研究 338
12.3.1 执行前的日志情况分析 338
12.3.2 执行情况分析 339
12.3.3 执行后的日志情况 339
12.3.4 研究结论 341
12.4 深入探讨语句内部机制 341
12.4.1 谁先插入数据 342
12.4.2 谁先更新数据 342
12.4.3 谁先删除数据 342
第13章 T-SQL游标 343
13.1 游标概述 343
13.1.1 什么是游标 343
13.1.2 游标的类型 344
13.1.3 默认结果集是如何使用的 344
13.1.4 什么是MARS 345
13.1.5 使用游标还是默认结果集 345
13.1.6 使用服务器游标还是客户机游标 346
13.2 T-SQL游标定义及使用 346
13.2.1 T-SQL游标的生命周期 346
13.2.2 T-SQL游标的声明 347
13.2.3 T-SQL游标的打开 347
13.2.4 T-SQL游标的读取 348
13.2.5 T-SQL游标的关闭 348
13.2.6 T-SQL游标的释放 349
13.2.7 T-SQL游标的综合实例 349
第14章 事务和锁 351
14.1 多用户数据库的并发问题 351
14.1.1 并发访问的实例 351
14.1.2 并发问题 352
14.2 事务 353
14.2.1 事务的特性 353
14.2.2 事务的状态 354
14.3 SQL SERVER中的事务机制 355
14.3.1 事务模式 355
14.3.2 更改事务模式 356
14.3.3 事务的启动 357
14.3.4 事务日志记录 357
14.3.5 事务编程语句 357
14.3.6 事务的调度 358
14.3.7 事务的隔离性级别 358
14.3.8 批（GO） 359
14.4 锁 360
14.4.1 锁的粒度 360
14.4.2 锁的类型（模式） 361
14.4.3 锁持有度 361
14.4.4 动态锁机制 362
14.4.5 查看锁 362
14.5 死锁 363
14.5.1 死锁的发生 364
14.5.2 消除死锁的方法 364
14.5.3 SQL Server 死锁检测和结束机制 365
14.5.4 跟踪和检测死锁 365
第15章 存储过程 367
15.1 存储过程概述 367
15.1.1 从批处理谈起 367
15.1.2 存储过程的引入 368
15.1.3 存储过程是什么 369
15.1.4 可不可以不使用存储过程 370
15.1.5 存储过程的优点 370
15.1.6 T-SQL的注入式攻击与防范 371
15.1.7 用参数化的存储过程防范T-SQL的注入式攻击 372
15.2 存储过程的类型 373
15.2.1 按照定义主体分类 374
15.2.2 按照生命周期分类 374
15.3 T-SQL存储过程的创建 374
15.3.1 创建T-SQL存储过程的规则 374
15.3.2 创建T-SQL存储过程的语法 375
15.3.3 创建无参数T-SQL存储过程 376
15.3.4 创建带输入参数的T-SQL存储过程 377
15.3.5 创建带输出参数的T-SQL存储过程 377
15.4 T-SQL存储过程的执行 378
15.4.1 执行无参数的T-SQL存储过程 379
15.4.2 执行带输入参数的T-SQL存储过程 379
15.4.3 执行带输出参数的T-SQL存储过程 379
15.5 数据操作T-SQL存储过程 380
15.5.1 数据查询 380
15.5.2 数据录入 381
15.5.3 数据删除 381
15.5.4 数据统计和求和 382
15.5.5 数据更新 383
15.5.6 将图像数据存入数据库 385
15.6 数据库操作T-SQL存储过程 387
15.6.1 附加数据库 387
15.6.2 完全备份数据库 387
15.6.3 收缩数据库 388
15.6.4 检查数据库备份 388
15.6.5 删除数据库 389
15.6.6 创建数据库 390
15.7 表操作T-SQL存储过程 391
15.7.1 清除所有表的内容 391
15.7.2 根据需要对表的内容进行处理 391
15.7.3 统计表数据 393
15.7.4 导出表数据为文件 393
15.7.5 导出数据库中特定的表数据为文件 395
15.7.6 导入文本文件到表中 396
15.8 文件操作T-SQL存储过程 397
15.8.1 创建操作系统目录 397
15.8.2 删除操作系统文件 397
15.8.3 判断文件是否存在 398
15.8.4 获得服务器名称 398
15.8.5 统计特定字符串出现的次数 399
15.9 异构数据操作T-SQL存储过程 400
15.9.1 提取Foxpro数据到SQL Server 400
15.9.2 提取Access数据到SQL Server 401
第16章 自定义函数和触发器 402
16.1 自定义函数概述 402
16.1.1 什么是自定义函数 402
16.1.2 自定义函数的优点 404
16.1.3 T-SQL自定义函数的语法 405
16.2 T-SQL自定义函数实例 407
16.2.1 转换Bool型到字符型 407
16.2.2 转换不同的日期表达 407
16.2.3 转换字符串到日期 408
16.3 触发器概述 408
16.3.1 触发器类型 409
16.3.2 触发器的内部实现机制 409
16.3.3 触发器工作原理 409
16.3.4 触发器的使用 410
16.3.5 触发器的创建语法 410
16.4 T-SQL触发器实例 411
16.4.1 自动记录数据库DDL事件的触发器 411
16.4.2 自动更新表数据的触发器 412
16.4.3 不允许删除表数据的触发器 413
16.4.4 不允许某些插入表数据的触发器 413
16.4.5 表上发生更新操作后级联更新其他表的触发器 414
第17章 某项目数据库T-SQL开发实例 416
17.1 特殊的表设计 416
17.1.1 数据库设计历史表DBBuildVersion 416
17.1.2 数据库DDL语句执行情况表DatabaseLog 418
17.1.3 数据库错误信息情况表ErrorLog 419
17.2 特殊的表字段设计 421
17.3 存储过程设计 423
17.3.1 记录数据库错误信息 423
17.3.2 显示数据库错误信息 424
17.3.3 返回服务器时间 425
17.3.4 根据需要备份数据库 425
17.3.5 录入图书数据 428
17.3.6 更新图书数据 430
17.3.7 检索图书数据 431
17.3.8 删除图书数据 431
17.4 触发器设计 432
17.4.1 自动更新表的ModifiedDate字段 432
17.4.2 自动记录数据库DDL语句 433
17.5 自定义函数设计 434
17.5.1 获得两个日期之间的年份数 434
17.5.2 获得图书的折扣价 435
17.5.3 获得价格区间的图书信息 435