游标函数与变量

游标可以处理多行数据,在过程循环中一次访问一行。和基于集合的高效操作相比,这个功能对系统资源的消耗更大。可以用一个函数和两个全局变量来管理游标操作。

cursor_status()函数

这个函数返回一个整型值,表示传递给这个函数的游标类型变量的状态。有很多不同类型的游标会影响这个函数的操作。为简单起见,下表列出了这个函数的常见返回值。

  

    

1

游标包含一行或多行(动态游标包含0行或者多行)

0

游标不包含行

-1

游标已关闭

-2

游标未分配

-3

游标不存在

 

@@cursor_rows全局变量

这个变量是一个整型值,表示在当前连接中打开的游标中的行数。根据游标类型,这个值也能不代表结果集中的实际行数。

@@fetch_status全局变量

这个变量是一个标记,用于表示当前游标指针的状态。这个变量主要用来判断某行是否存在,以及在执行了fetch next语句后,是否已执行到结果集的尾部。打开游标时,@@fetch_status变量值为-1。一旦把第一个值放在游标中,@@fetch_status变量值就变成0。当不再把更多的行放在游标中时,该变量的值将变回-1

日期函数

这些函数可以操作datetimesmalldatetime类型的值。有些函数可用于解析日期值的日期与时间部分,有些函数可用于比较、操纵日期/时间值。日期数据类型的区别如下表所示。

数据类型

输出

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()函数用于在日期/时间值上加上日期单位间隔。比如,要得到2007429日起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()函数组合在一起,来对1989989个月前的日期值进行格式化。

select convert(varchar(20), dateadd(m, -9, "9-8-1989"), 101) 

12/08/1988

这将返回一个可变长度的字符值,比前面例子结果中的默认日期更易容易理解。这是一个函数嵌套调用,dateadd()函数的返回值(一个datetime类型的值)被作为值参数传递给convert()函数。

datediff()函数

dateadd()datediff()函数可以看作一对表兄弟,有点像乘法与除法。在等式的两端有4