游标函数与变量
游标可以处理多行数据,在过程循环中一次访问一行。和基于集合的高效操作相比,这个功能对系统资源的消耗更大。可以用一个函数和两个全局变量来管理游标操作。
cursor_status()函数
这个函数返回一个整型值,表示传递给这个函数的游标类型变量的状态。有很多不同类型的游标会影响这个函数的操作。为简单起见,下表列出了这个函数的常见返回值。
返 回 值 | 说 明 |
1 | 游标包含一行或多行(动态游标包含0行或者多行) |
0 | 游标不包含行 |
-1 | 游标已关闭 |
-2 | 游标未分配 |
-3 | 游标不存在 |
@@cursor_rows全局变量
这个变量是一个整型值,表示在当前连接中打开的游标中的行数。根据游标类型,这个值也能不代表结果集中的实际行数。
@@fetch_status全局变量
这个变量是一个标记,用于表示当前游标指针的状态。这个变量主要用来判断某行是否存在,以及在执行了fetch next语句后,是否已执行到结果集的尾部。打开游标时,@@fetch_status变量值为-1。一旦把第一个值放在游标中,@@fetch_status变量值就变成0。当不再把更多的行放在游标中时,该变量的值将变回-1。
日期函数
这些函数可以操作datetime与smalldatetime类型的值。有些函数可用于解析日期值的日期与时间部分,有些函数可用于比较、操纵日期/时间值。日期数据类型的区别如下表所示。
数据类型 | 输出 |
time | 12:35:29. 1234567 |
date | 2007-05-08 |
smalldatetime | 2007-05-08 12:35:00 |
datetime | 2007-05-08 12:35:29.123 |
datetime2 | 2007-05-08 12:35:29. 1234567 |
datetimeoffset | 2007-05-08 12:35:29.1234567 +12:15 |
dateadd()函数
dateadd()函数用于在日期/时间值上加上日期单位间隔。比如,要得到2007年4月29日起90天后的日期,可以使用下列语句:
select dateadd(day, 90, "4-29-2007")
结果:2007-07-28 00:00:00.000
可以把下表的值作为时间间隔参数传递给dateadd()函数。
datepart | 缩写 |
year | yy, yyyy |
quarter | qq, q |
month | mm, m |
dayofyear | dy, y |
day | dd, d |
week | wk, ww |
weekday | dw, w |
hour | hh |
minute | mi, n |
second | ss, s |
millisecond | ms |
microsecond | mcs |
nanosecond | ns |
在下面列出的例子中,我们使用和上一个例子一样的日期,并且在这些例子中还包含了时间数据。每个操作的结果将显示在查询的下一行中。
18年后:
select dateadd(year, 18, "4-29-1988 10:30 am")
2006-04-29 10:30:00.000
18年前:
select dateadd(yy, -18, "4-29-1988 10:30 am")
1970-04-29 10:30:00.000
9000秒后:
select dateadd(second, 9000, "4-29-1988 10:30 am")
1988-04-29 13:00:00.000
9000000毫秒前:
select dateadd(ms, -9000000, "4-29-1988 10:30 am")
1988-04-29 08:00:00.000
可以将convert()函数和dateadd()函数组合在一起,来对1989年9月8日9个月前的日期值进行格式化。
select convert(varchar(20), dateadd(m, -9, "9-8-1989"), 101)
12/08/1988
这将返回一个可变长度的字符值,比前面例子结果中的默认日期更易容易理解。这是一个函数嵌套调用,dateadd()函数的返回值(一个datetime类型的值)被作为值参数传递给convert()函数。