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
从上次启动服务器开始,SQL Server一共工作的毫秒数
@@IDLE
从上次启动服务器开始,SQL Server一共空闲的毫秒数
@@IO_BUSY
从上次启动服务器开始,SQL Server一共处理I/0的毫秒数
@@PACK_RECEIVED
从上次启动服务器开始,SQL Server一共收到的网络数据包数
@@PACK_SENT
从上次启动服务器开始,SQL Server一共发送的网络数据包数
@@PACKET_ERRORS
从上次启动服务器开始,SQL Server一共收到的网络数据包错误数
@@TIMETICKS
每个时钟滴答有多少毫秒
@@TOTAL_ERRORS
从上次启动服务器开始,sql语句大全一共收到的磁盘I/O错误数
@@TOTAL_READ
从上次启动服务器开始,SQL Server一共进行的物理磁盘读取次数
@@TOTAL_WRITE
从上次启动服务器开始,SQL Server一共进行的物理磁盘写入次数
小结
函数用于实现业务逻辑,并且能够将编程功能带入查询中。许多有用而且强大的函数是T-SQL的标准功能。和面向过程、面向对象语言中的函数一样,SQL函数也将程序功能封装到一个简单的可重用的包中,这就减少了查询设计人员的很多工作。由于Transact-SQL是面向任务的语言,而不是过程语言。虽然函数可以进行过程编程,可以在查询中构建颇为复杂的逻辑,但是SQL语言的优势在于让设计人员表达出设计意图,而不是完成一项任务的确切步骤与方法。只要使用方法正确,这些步骤和方法都可以由函数来实现。
在T-SQL中,参数用于将值传递给函数,大多数函数的返回结果是一个标量,或者说单一值。函数分为确定性函数与非确定性函数。在使用相同的参数时,确定性函数总是返回相同的值,而非确定性函数的返回值则与其他资源有关,所以SQL Server必须显式地执行这种函数。因此,在定制的SQL编程对象中,对非确定性函数的使用是有限制的。
SQL函数执行种类繁多的重要任务,包括数学运算、比较、日期解析与操纵、高级字符串操纵等。