Money NULL, SalePrice Money NULL, ListPrice Money NULL) GO INSERT INTO #ProductPrices VALUES('Standard Widget', NULL, NULL, 15.95) INSERT INTO #ProductPrices VALUES('Economy Widget', NULL, 9.95, 12.95) INSERT INTO #ProductPrices VALUES('Deluxe Widget', 19.95, 20.95, 22.95) INSERT INTO #ProductPrices VALUES('Super Deluxe Widget', 29.45, 32.45, 38.95) INSERT INTO #ProductPrices VALUES('Executive Widget', NULL, 45.95, 54.95) GO 所有的产品都有定价,有些有销售价,有些还有促销价。一项产品的当前价格是所有己有价格的最低价,或者在读取每个价格列时以列出顺序读到的第一个非空值:
SELECT ProductName, COALESCE(SuperSalePrice, SalePrice, ListPrice) AS CurrentPrice FROM #ProductPrices 这个方法比使用多行分支与判断逻辑要简洁得多,而结果也是同样简单,如下图所示:
DATALENGTH()函数
DATALENGTH()函数返回一个用于对值进行管理的字节数,这有助于揭示不同数据类型间的一些有趣差别。当把varchar类型传递给DATALENGTH()和LEN()函数时,它们将返回相同的值:
DECLARE @Value varchar(20) SET @Value = 'abc' SELECT DATALENGTH(@Value) SELECT LEN(@Value) 这些语句的返回值都为3。因为varchar类型使用了3个单字节字符来存储三个字符的值。然而,如果使用nVarchar类型来管理相同长度的值,就要占用多一倍的字节:
DECLARE @Value nvarchar(20) SET @Value = 'abc' SELECT DATALENGTH(@Value) SELECT LEN(@Value) DATALENGTH()函数返回值为6,因为每个使用Unicode字符集的字符都要占用2个字节。LEN()函数返回值为3,因为这个函数返回字符数,不是字节数。以下是一个有趣的测试:要存储一个值为2的整型变量,要占用多少个字节?而如果要存储一个值为20亿的整型变量,又将占用多少个字节呢?试一下:
DECLARE @Value1 int, @Value2 int SET @Value1 = 2 SET @Value2 = 2000000000 SELECT DATALENGTH(@Value1) SELECT LEN(@Value1) SELECT DATALENGTH(@Value2) SELECT LEN(@Value2) 在这两种情况下,DATALENGTH()函数都返回4。因为int类型不论值是多少,总是使用4个字节。LEN()函数本质上将整型值当成已转换成字符型的数据来处理,所以,在这个例子中,它分别返回1和10,即值的位数。
在下表中的全局系统变量都将返回int类型的值。这些变量可用于存储过程和其他实现定制业务逻辑的编程对象。
变 量 @@ERROR @@IDENTITY @@ROWCOUNT 说 明 当前会话最后一次发生的错误代码 当前会话最后一次生成的标识值 当前会话中最后一次返回结果集的执行操作所返回的行数 @@TRANCOUNT 当前会话中活动的事务数。这是在执行相关的COMMIT TRANSACTION或者ABORT TRANSACTION语句之前嵌套的多个BEGIN TRANSACTION语句的结果 系统统计变量
下表描述了用于确定数据库系统使用信息与环境信息的管理工具:
变 量 @@CONNECTIONS @@CPU_BUSY @@IDLE @@IO_BUSY @@PACK_RECEIVED @@PACK_SENT 返回打开连接的次数 说 明 从上次启动服务器开始,SQL Server一共工作的毫秒数 从上次启动服务器开始,SQL Server一共空闲的毫秒数 从上次启动服务器开始,SQL Server一共处理I/0的毫秒数 从上次启动服务器开始,SQL Server一共收到的网络数据包数 从上次启动服务器开始,SQL Server一共发送的网络数据包数 @@PACKET_ERRORS 从上次启动服务器开始,SQL Server一共收到的网络数据包错误数 @@TIMETICKS @@TOTAL_ERRORS @@TOTAL_READ @@TOTAL_WRITE 小结
函数用于实现业务逻辑,并且能够将编程功能带入查询中。许多有用而且强大的函数是T-SQL的标准功能。和面向过程、面向对象语言中的函数一样,SQL函数也将程序功能封装到一个简单的可重用的包中,这就减少了查询设计人员的很多工作。由于Transact-SQL是面向任务的语言,而不是过程语言。虽然函数可以进行过程编程,可以在查询中构建颇为复杂的逻辑,但是SQL语言的优势在于让设计人员表达出设计意图,而不是完成一项任务的确切步骤与方法。只要使用方法正确,这些步骤和方法都可以由函数来实现。
在T-SQL中,参数用于将值传递给函数,大多数函数的返回结果是一个标量,或者说单一值。函数分为确定性函数与非确定性函数。在使用相同的参数时,确定性函数总是返回相同的值,而非确定性函数的返回值则与其他资源有关,所以SQL Server必须显式地执行这种函数。因此,在定制的SQL编程对象中,对非确定性函数的使用是有限制的。
SQL函数执行种类繁多的重要任务,包括数学运算、比较、日期解析与操纵、高级字符串操纵等。
每个时钟滴答有多少毫秒 从上次启动服务器开始,SQL Server一共收到的磁盘I/O错误数 从上次启动服务器开始,SQL Server一共进行的物理磁盘读取次数 从上次启动服务器开始,SQL Server一共进行的物理磁盘写入次数