http://5dblog.me
这个变量用于记录从打开当前连接开始发生的总错误次数。和@@ERROR变量一样,它对每个用户会话是唯一的,并将在连接关闭时被重置。 @@TOTAL_READ变量
这个变量记录从打开当前连接时开始计算的磁盘读取总数。DBA使用这个变量查看磁盘读取活动的情况。 @@VERSION变量
这个变量包含当前SQL Server实例的完整版本信息。
SELECT @@VERSION
比如,对于运行在Windows 7上的SQL Server 2008开发版实例,以上脚本能够返回如下信息:
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition on Windows NT 6.1
实际的版本号是一个简单的整型值,它在微软公司内部使用。而发行的产品可能有其他的商标名。在本例中,SQL Server 2005的版本是9,SQL Server 2008的版本是10。Windows XP Professional显示为Windows NT 5.l版,而Vista显示为6.0版。构建号用于内部控制,反映beta版和预览版以及正式发行后的补丁包的变化。 错误函数
前面学习了如何使用@@ERROR全局变量来检索错误信息。而返回所有错误数据的更好方法是使用错误函数。这些函数返回的信息可以存储在错误跟踪表中,以供错误审核。错误函数嵌套在错误处理例程中。第11章将详细讨论错误处理,其实通过使用嵌套在TRY和END TRY语句中的代码块,后跟一个放在CATCH和END CATCH语句中的代码块就可以实现错误处理。
--Try to do something BEGIN TRY SELECT 5 / 0 END TRY --If it causes an error, do this BEGIN CATCH PRINT ERROR_MESSAGE() END CATCH 所谓的错误捕获,其实就是这个意思。如果运行上面的示例,将不会出现可识别的错误,因为错误将被捕获并在CATCH语句块中进行处理。在编写错误处理代码时,SQL程序员必须把这些代码放在会引发系统错误的catch代码块中。
下列几个错误函数用于返回错误的特定信息:
函数 说明 返回错误的描述。 返回错误号。 返回错误的严重级别。错误的严重级别是一个从0到25的整数。 返回错误的状态号。错误状态是一个整数,可以唯一地表示系统错误的原因。 返回例程中导致出错的行号。 ERROR_MESSAGE() ERROR_NUMBER() ERROR_SEVERITY() ERROR_STATE() ERROR_LINE() http://5dblog.me
ERROR_PROCEDURE() 返回发生错误的存储过程名或触发器名。 下表简要描述了严重级别。 严 重 级 别 0~10 11~16 17 18 19 20 21 22 23 24 25 信息性消息。不会引发系统错误 用户可以更正的错误,例如违反了外键或主键规则 非致命的、不重要的资源错误 非致命的内部错误 致命的、不重要的资源错误 当前进程中的致命错误 所有进程中的致命数据库错误 致命的表完整性错误 致命的数据库完整性错误 致命的硬件错误 致命的系统错误 下面脚本使用T-SQL的内置错误处理功能,来捕获和输出遇到除0错误时返回的错误数据。SELECT命令的结果将显示在Management Studio的消息选项卡中。
说 明 --Try to do something BEGIN TRY SELECT 5 / 0 END TRY --If it causes an error, do this BEGIN CATCH SELECT ERROR_MESSAGE(),ERROR_NUMBER(),ERROR_SEVERITY(), ERROR_STATE(),ERROR_LINE(),ERROR_PROCEDURE() END CATCH 可以看出,执行这个脚本会在消息选项卡中返回有关错误的更多详细信息,而不仅仅是错误号本身。
ERROR_PROCEDURE()函数不能返回过程名,因为错误是在ad-hoc查询中生成的。
转换函数
数据类型转换可以通过CAST()和CONVERT()函数来实现。大多数情况下,这两个函数是重叠的,它们反映了SQL语言的演化历史。这两个函数的功能相似,不过它们的语法不同。虽然并非所有类型的值都能转变为其他数据类型,但总的来说,任何可以转换的值都可以用简单的函数实现转换。 CAST()函数
http://5dblog.me
CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。以下例子用于将文本字符串'123'转换为整型:
SELECT CAST('123' AS int)
返回值是整型值123。如果试图将一个代表小数的字符串转换为整型值,又会出现什么情况呢?
SELECT CAST('123.4' AS int)
CAST()函数和CONVERT()函数都不能执行四舍五入或截断操作。由于123.4不能用int数据类型来表示,所以对这个函数调用将产生一个错误:
Server: Msg 245, Level 16, State 1, Line 1 Syntax error converting the varchar value '123.4' to a column of data type int.
在将varchar 值'123.4' 转换成数据类型int 时失败。
要返回一个合法的数值,就必须使用能处理这个值的数据类型。对于这个例子,存在多个可用的数据类型。如果通过CAST()函数将这个值转换为decimal类型,需要首先定义decimal值的精度与小数位数。在本例中,精度与小数位数分别为9与2。精度是总的数字位数,包括小数点左边和右边位数的总和。而小数位数是小数点右边的位数。这表示本例能够支持的最大的整数值是9999999,而最小的小数是0.01。
SELECT CAST('123.4' AS decimal(9,2))
decimal数据类型在结果网格中将显示有效小数位:123.40
精度和小数位数的默认值分别是18与0。如果在decimal类型中不提供这两个值,SQL Server将截断数字的小数部分,而不会产生错误。
SELECT CAST('123.4' AS decimal)
结果是一个整数值:123
在表的数据中转换数据类型是很简单的。下面的例子使用Product表,首先执行如下查询:
SELECT ProductNumber, ProductLine, ProductModelID FROM Production.Product WHERE ProductSubcategoryID < 4
假定产品经理已经创建了一个系统,用于唯一地标识生产出来的每辆自行车,以便跟踪其型号、类型和类别。他决定合并产品号、产品生产线标识符、产品型号标识符和一个顺序号,为生产出来的每辆自行车创建一个唯一的序列号。在这个过程的第一步,他要求提供包括除顺序号之外的所有属性的所有可能产品的根标识符。
如果使用下面的表达式,就不能得到希望的结果,如图6-2所示。
SELECT ProductNumber + '-' + ProductLine + '-' + ProductModelID AS BikeSerialNum FROM Production.Product WHERE ProductSubcategoryID < 4 http://5dblog.me
消息245,级别16,状态1,第1 行 在将nvarchar 值'BK-R93R-62-R -' 转换成数据类型int 时失败。
我们没有得到希望的结果,而得到了有点奇怪的错误消息:请把nvarchar值转换为int。因为之前我们没有要求进行任何转换,所以这个错误很奇怪。这个查询的问题在于我们试图利用第一个连接符来连接字符值ProductNumber,利用第二个连接符连接另一个字符值ProductLine,最后连接的是ProductModelID字符值(它是一个整数)。
查询引擎会把连接符当成一个数学运算符,而不是一个字符。不管结果是什么,都需要更正这个表达式,以确保使用正确的数据类型。以下表达式执行了必要的类型转换,返回如图6-3所示的结果:
SELECT ProductNumber + '-' + ProductLine + '-' + CAST(ProductModelID AS char(4)) AS BikeSerialNum FROM Production.Product WHERE ProductSubcategoryID < 4
如果把整型值转换为字符类型就不会增加多余的空格了。查询引擎将把这些值用加号和连接符组合在一起,进行字符串连接运算,而不是和前面的数值进行加法或者减法运算了。
CONVERT()函数
对于简单类型转换,CONVERT()函数和CAST()函数的功能相同,只是语法不同。CAST()函数一般更容易使用,其功能也更简单。CONVERT()函数的优点是可以格式化日期和数值,它需要两个参数:第1个是目标数据类型,第2个是源数据。以下的两个例子和上一节的例子类似:
SELECT CONVERT(int, '123') SELECT CONVERT(decimal(9,2), '123.4')
http://5dblog.me
CONVERT()函数还具有一些改进的功能,它可以返回经过格式化的字符串值,且可以把日期值格式化成很多形式。有28种预定义的符合各种国际和特殊要求的日期与时间输出格式。下表列出了这些日期格式。
如果 expression 为 date 或 time 数据类型,则 style 可以为下表中显示的值之一。其他值作为 0 进行处理。SQL Server 使用科威特算法来支持阿拉伯样式的日期格式。 yy(1) yyyy - 1 2 3 4 5 6 7 8 - 10 11 12 0 或 100 (1, 2) 101 102 103 104 105 106 (1) 107 (1) 108 9 或 109 (1, 2) 110 111 112 标准 默认 美国 ANSI 英国/法国 德国 意大利 - - - 默认设置 + 毫秒 美国 日本 ISO 输入/输出 (3) mon dd yyyy hh:miAM(或 PM) mm/dd/yyyy yy.mm.dd dd/mm/yyyy dd.mm.yy dd-mm-yy dd mon yy mon dd, yy hh:mi:ss mon dd yyyy hh:mi:ss:mmmAM(或 PM) mm-dd-yy yy/mm/dd yymmdd yyyymmdd - 14 - - - - 13 或 113 (1, 2) 114 20 或 120 (2) 21 或 121 (2) 126 (4) 127(6, 7) 欧洲默认设置 + 毫秒 - ODBC 规范 ODBC 规范(带毫秒) ISO8601 带时区 Z 的 ISO8601。 dd mon yyyy hh:mi:ss:mmm(24h) hh:mi:ss:mmm(24h) yyyy-mm-dd hh:mi:ss(24h) yyyy-mm-dd hh:mi:ss.mmm(24h) yyyy-mm-ddThh:mi:ss.mmm(无空格) yyyy-mm-ddThh:mi:ss.mmmZ (无空格) - - 130 (1, 2) 131 (2) 回历 (5) 回历 (5) dd mon yyyy hh:mi:ss:mmmAM dd/mm/yy hh:mi:ss:mmmAM 1. 这些样式值将返回不确定的结果。包括所有 (yy)(不带世纪数位)样式和一部分 (yyyy)(带世纪数位)样式。 2. 默认值(style 0 或 100、9 或 109、13 或 113、20 或 120 以及 21 或 121)始终返回世纪数位 (yyyy)。 3. 转换为 datetime 时输入;转换为字符数据时输出。
4. 为用于 XML 而设计。对于从 datetime 或 smalldatetime 到字符数据的转换,其输出格式如上一个表所述。