sql server中常用方法函数

时间:2022-05-27 16:02:55

SQL SERVER常用函数

1.DATEADD在向指定日期加上一段时间的基础上,返回新的 datetime 值。

(1)语法

DATEADD ( datepart , number, date )

(2)参数datepart 规定应向日期的哪一部分返回新值的参数。下表列出了 Microsoft  SQL Server识别的日期部分和缩写。

日期部分     缩写

Year         yy, yyyy

quarter      qq, q

Month       mm, m

dayofyear    dy, y

Day         dd, d

Week        wk, ww

Hour         hh

minute       mi, n

second       ss, s

millisecond    ms

参数number是用来增加 datepart 的值。如果指定一个不是整数的值,则将废弃此值的小数部分。例如,如果为 datepart 指定 day,为 number 指定 1.75,则 date 将增加 1。

参数date是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。有关指定日期的更多信息,请参见 datetime 和 smalldatetime。

如果您只指定年份的最后两位数字,则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所

在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世

纪。例如,如果 two digit year cutoff 为 2049(默认),则 49 被解释为 2049,2050 被解释为 1950。为避免模糊,请使用四位数的年份。

返回类型 返回 datetime,但如果 date 参数是 smalldatetime,返回 smalldatetime。

示例此示例打印出 pubs 数据库中标题的时间结构的列表。此时间结构表示当前发布日期加上 21 天。

USE pubs

GO

SELECT DATEADD(day, 21, pubdate) AS timeframe

FROM titles

GO

下面是结果集:

timeframe

---------------------------

Jul 3 1991 12:00AM

Jun 30 1991 12:00AM

Jul 21 1991 12:00AM

Jul 13 1991 12:00AM

Jun 30 1991 12:00AM

Jul 9 1991 12:00AM

Mar 14 1997  5:09PM

Jul 21 1991 12:00AM

Jul 3 1994 12:00AM

Mar 14 1997  5:09PM

Nov 11 1991 12:00AM

Jul 6 1991 12:00AM

Oct 26 1991 12:00AM

Jul 3 1991 12:00AM

Jul 3 1991 12:00AM

Nov 11 1991 12:00AM

Jul 3 1991 12:00AM

Jul 3 1991 12:00AM

(18 row(s) affected)

2.DATEDIFF返回跨两个指定日期的日期和时间边界数。

1语法

DATEDIFF ( datepart , startdate , enddate )

2参数datepart 规定了应在日期的哪一部分计算差额的参数。下表列出了 Microsoft SQL Server 识别的日期部分和缩写。

日期部分    缩写

year        yy, yyyy

quarter     qq, q

Month       mm, m

dayofyear   dy, y

Day         dd, d

Week        wk, ww

Hour        hh

minute      mi, n

second      ss, s

millisecond ms

参数:startdate

是计算的开始日期。startdate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。 因为 smalldatetime 只精确到分钟,所以当用 smalldatetime 值时,秒和毫秒总是 0。

如果您只指定年份的最后两位数字,则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所

在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit year cutoff 为 2049(默认),则 49 被解释为 2049,2050 被解释为 1950。为避免模糊,请使用四位数的年份。有关时间值指定的更多信息,请参见时间格式。有关日期指定的更多信息,请参见 datetime 和

smalldatetime。

参数:enddate 是计算的终止日期。enddate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。

返回类型integer

注释

startdate 是从 enddate 减去。如果 startdate 比 enddate 晚,返回负值。

当结果超出整数值范围,DATEDIFF 产生错误。对于毫秒,最大数是 24 天 20 小时 31 分钟零 23.647 秒。对于秒,最大数是 68 年。

计算跨分钟、秒和毫秒这些边界的方法,使得 DATEDIFF 给出的结果在全部数据类型中是一致的。结果是带正负号的整数值,其等于跨第一个和第二个日期间的 datepart 边界数。例如,在 1 月 4 日(星期日)和 1 月 11 日(星期日)之间的星期数是 1。

示例此示例确定在 pubs 数据库中标题发布日期和当前日期间的天数。

USE pubs

GO

SELECT DATEDIFF(day, pubdate, getdate()) AS no_of_days

FROM titles

GO

3.DATENAME返回代表指定日期的指定日期部分的字符串。

1语法

DATENAME ( datepart , date )

2参数datepart

是指定应返回的日期部分的参数。下表列出了 Microsoft? SQL Server? 识别的日期部分和缩写。

日期部分      缩写

year          yy, yyyy

quarter       qq, q

month         mm, m

dayofyear     dy, y

day           dd, d

week          wk, ww

weekday       dw

Hour          hh

minute        mi, n

second        ss, s

millisecond   ms

weekday (dw) 日期部分返回星期几(星期天、星期一等)。

是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。对 1753 年 1 月 1 日之后的日期用datetime 数据类型。更早的日期存储为字符数据。当输入 datetime 值时,始终将其放入引号中。因为 smalldatetime 只精确到分钟,所以当用 smalldatetime 值时,秒和毫秒总是 0。有关指定日期的更多信息,请参见 datetime 和 smalldatetime。有关时间值指定的更多信息,请参见时间格式。

如果只指定年份的最后两位数字,则小于或等于 two digit year cutoff 配置选项的值的最后两位数字的值所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit year cutoff 为 2050(默认),则 49 被解释为 2049,50 被解释为 1950。为避免模糊,请使用四位数字的年份。

返回类型nvarchar

注释SQL Server 自动在字符和 datetime 值间按需要进行转换,例如,当将字符值与 datetime 值进行比较时。

示例 此示例从 GETDATE 返回的日期中提取月份名。

SELECT DATENAME(month, getdate()) AS ’Month Name’

下面是结果集:

Month Name

------------------------------

February

4.DATEPART返回代表指定日期的指定日期部分的整数。

1语法

DATEPART ( datepart , date )

2参数datepart是指定应返回的日期部分的参数。下表列出了 Microsoft? SQL Server? 识别的日期部分和缩写。

日期部分     缩写

year         yy, yyyy

quarter      qq, q

month        mm, m

dayofyear    dy, y

day          dd, d

week         wk, ww

weekday      dw

Hour         hh

minute       mi, n

second       ss, s

millisecond    ms

week (wk, ww) 日期部分反映对 SET DATEFIRST 作的更改。任何一年的 1 月 1 日定义了 week 日期部分的开始数字,例如:DATEPART(wk, ’Jan 1, xxxx’) = 1,此处 xxxx 代表任一年。

weekday (dw) 日期部分返回对应于星期中的某天的数,例如:Sunday = 1、Saturday = 7。weekday 日期部分产生的数取决于 SET DATEFIRST 设定的值,此命令设定星期中的第一天。

参数:date是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。对 1753 年 1 月 1 日之后的日期用datetime 数据类型。更早的日期存储为字符数据。当输入 datetime 值时,始终将其放入引号中。因为smalldatetime 只精确到分钟,所以当用 smalldatetime 值时,秒和毫秒总是 0。

如果只指定年份的最后两位数字,则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit year cutoff 为 2049 (默认),则 49 被解释为 2049,2050 被解释为 1950。为避免模糊,请使用四位数的年份。

有关时间值指定的更多信息,请参见时间格式。有关日期指定的更多信息,请参见 datetime 和 smalldatetime。

返回类型int

注释DAY、MONTH、和 YEAR 函数分别是 DATEPART(dd, date)、DATEPART(mm, date)、和 DATEPART(yy, date) 的同义词。

示例GETDATE 函数返回当前日期;然而,比较时并不总是需要完整的日期信息(通常只是对日期的一部分进行比较)。此示例显示 GETDATE 及 DATEPART 的输出。

SELECT GETDATE() AS ’Current Date’

GO

下面是结果集:

Current Date

---------------------------

Feb 18 1998 11:46PM

SELECT DATEPART(month, GETDATE()) AS ’Month Number’

GO

下面是结果集:

Month Number

------------

2

此示例假设日期是 5 月 29 日。

SELECT DATEPART(month, GETDATE())

GO

下面是结果集:

-----------

5

(1 row(s) affected)

在此示例中,以数字表示日期。注意:SQL Server 将 0 解释为 01/01/1900。

SELECT DATEPART(m, 0), DATEPART(d, 0), DATEPART(yy, 0)

下面是结果集:

----- ------ ------

1     1      1900

5.DAY

返回代表指定日期的天的日期部分的整数。

语法

DAY ( date )

参数

date

类型为 datetime 或 smalldatetime 的表达式。

返回类型

int

注释

此函数等价于 DATEPART(dd, date)。

6.GETDATE

按 datetime 值的 Microsoft? SQL Server? 标准内部格式返回当前系统日期和时间。

语法

GETDATE ( )

返回类型

datetime

注释

日期函数可用在 SELECT 语句的选择列表或用在查询的 WHERE 子句中。

在设计报表时,GETDATE 函数可用于在每次生成报表时打印当前日期和时间。GETDATE 对于跟踪活动也很有

用,诸如记录事务在某一帐户上发生的时间。

示例

A. 用 GET DATE 返回当前日期和时间

下面的示例得出当前系统日期和时间:

SELECT GETDATE()

GO

下面是结果集:

-------------------------

July 29 1998   2:50    PM

(1 row(s) affected)

B. 在 CREATE TABLE 语句中使用 GETDATE

下面的示例创建 employees 表并用 GETDATE 给出员工雇佣时间的默认值。

USE pubs

GO

CREATE TABLE employees

(

emp_id char(11) NOT NULL,

emp_lname varchar(40) NOT NULL,

emp_fname varchar(20) NOT NULL,

emp_hire_date datetime DEFAULT GETDATE(),

emp_mgr varchar(30)

)

GO

7.GETUTCDATE

返回表示当前 UTC 时间(世界时间坐标或格林尼治标准时间)的 datetime 值。当前的 UTC 时间得自当前

的本地时间和运行 SQL Server 的计算机操作系统中的时区设置。

语法

GETUTCDATE()

返回类型

datetime

注释

GETUTCDATE 是非确定性函数。引用该列的视图和表达式无法进行索引。

GETUTCDATE 无法在用户定义的函数内调用。

8.MONTH

返回代表指定日期月份的整数。

语法

MONTH ( date )

参数

date

返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。仅对 1753 年 1 月 1 日后的日期使用

datetime 数据类型。

返回类型

int

注释

MONTH 等价于 DATEPART(mm, date)。

将 datetime 值包含在引号中。对于早期日期,可将其存储为字符数据。

Microsoft? SQL Server? 认可各种日期样式。有关日期和时间数据的更多信息,请参见 CAST 和

CONVERT。

示例

下面的示例从日期 03/12/1998 中返回月份数。

SELECT "Month Number" = MONTH(’03/12/1998’)

GO

下面是结果集:

Month Number

------------

3

下例用数字指定日期。注意:SQL Server 将 0 解释为 01/01/1900。

SELECT MONTH(0), DAY(0), YEAR(0)

下面是结果集。

----- ------ ------

1     1      1900

9.YEAR

返回表示指定日期中的年份的整数。

语法

YEAR ( date )

参数

date

datetime 或 smalldatetime 类型的表达式。

返回类型

int

注释

此函数等价于 DATEPART(yy, date)。

示例

下例从日期 03/12/1998 中返回年份数。

SELECT "Year Number" = YEAR(’03/12/1998’)

GO

下面是结果集:

Year Number

------------

1998

下例用数字指定日期。注意:Microsoft? SQL Server? 数据库将 0 解释为 1900 年 1 月 1 日。

SELECT MONTH(0), DAY(0), YEAR(0)

下面是结果集:

----- ------ ------

1     1      1900

数学运算函数

1.ABS

返回给定数字表达式的绝对值。

语法

ABS ( numeric_expression )

参数

numeric_expression

精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。

返回类型

返回与 numeric_expression 相同的类型。

示例

下例显示了 ABS 函数对三个不同数字的效果。

SELECT ABS(-1.0), ABS(0.0), ABS(1.0)

下面是结果集:

---- ---- ----

1.0  .0   1.0

ABS 函数可能产生溢出错误,例如:

SELECT ABS(convert(int, -2147483648))

下面是错误信息:

Server: Msg 8115, Level 16, State 2

Arithmetic overflow error converting expression to type int.

2.ACOS

返回以弧度表示的角度值,该角度值的余弦为给定的 float 表达式;本函数亦称反余弦。

语法

ACOS ( float_expression )

参数

float_expression

是 float 或 real 类型的表达式,其取值范围从 -1 到 1。对超过此范围的参数值,函数将返回 NULL 并且

报告域错误。

返回类型

float

示例

下例返回给定角的 ACOS 值。

SET NOCOUNT OFF

DECLARE @angle float

SET @angle = -1

SELECT ’The ACOS of the angle is: ’ + CONVERT(varchar, ACOS(@angle))

下面是结果集:

---------------------------------

The ACOS of the angle is: 3.14159

(1 row(s) affected)

下例将参数 @angle 设置为超出有效范围的值。

SET NOCOUNT OFF

DECLARE @angle float

SET @angle = 1.01

SELECT ’The ACOS of the angle is: ’ + CONVERT(varchar, ACOS(@angle))

下面是结果集:

--------------------------------------------------------

NULL

(1 row(s) affected)

A domain error occurred.

3.ASIN

返回以弧度表示的角度值,该角度值的正弦为给定的 float 表达式;亦称反正弦。

语法

ASIN ( float_expression )

参数

float_expression

是 float 类型的表达式,其取值范围从 -1 到 1。对超过此范围的参数值,函数将返回 NULL 并且报告域错

误。

返回类型

float

示例

下例用 float 表达式返回给定角的 ASIN 值。

-- First value will be -1.01, which fails.

DECLARE @angle float

SET @angle = -1.01

SELECT ’The ASIN of the angle is: ’ + CONVERT(varchar, ASIN(@angle))

GO

-- Next value is -1.00.

DECLARE @angle float

SET @angle = -1.00

SELECT ’The ASIN of the angle is: ’ + CONVERT(varchar, ASIN(@angle))

GO

-- Next value is 0.1472738.

DECLARE @angle float

SET @angle = 0.1472738

SELECT ’The ASIN of the angle is: ’ + CONVERT(varchar, ASIN(@angle))

GO

下面是结果集:

-------------------------

The ASIN of the angle is:

(1 row(s) affected)

Domain error occurred.

---------------------------------

The ASIN of the angle is: -1.5708

(1 row(s) affected)

----------------------------------

The ASIN of the angle is: 0.147811

4.ATAN

返回以弧度表示的角度值,该角度值的正切为给定的 float 表达式;亦称反正切。

语法

ATAN ( float_expression )

参数

float_expression

是 float 类型的表达式。

返回类型

float

示例

下例用 float 表达式返回给定角的 ATAN 值。

SELECT ’The ATAN of -45.01 is: ’ + CONVERT(varchar, ATAN(-45.01))

SELECT ’The ATAN of -181.01 is: ’ + CONVERT(varchar, ATAN(-181.01))

SELECT ’The ATAN of 0 is: ’ + CONVERT(varchar, ATAN(0))

SELECT ’The ATAN of 0.1472738 is: ’ + CONVERT(varchar, ATAN(0.1472738))

SELECT ’The ATAN of 197.1099392 is: ’ + CONVERT(varchar, ATAN(197.1099392))

GO

下面是结果集:

-------------------------------

The ATAN of -45.01 is: -1.54858

(1 row(s) affected)

--------------------------------

The ATAN of -181.01 is: -1.56527

(1 row(s) affected)

--------------------------------

The ATAN of 0 is: 0

(1 row(s) affected)

----------------------------------

The ATAN of 0.1472738 is: 0.146223

(1 row(s) affected)

-----------------------------------

The ATAN of 197.1099392 is: 1.56572

5.ATN2

返回以弧度表示的角度值,该角度值的正切介于两个给定的 float 表达式之间;亦称反正切。

语法

ATN2 ( float_expression , float_expression )

参数

float_expression

float 数据类型的表达式。

返回类型

float

示例

下例计算给定角的 ATN2。

DECLARE @angle1 float

DECLARE @angle2 float

SET @angle1 = 35.175643

SET @angle2 = 129.44

SELECT ’The ATN2 of the angle is: ’ + CONVERT(varchar,ATN2(@angle1,@angle2 ))

GO

下面是结果集:

The ATN2 of the angle is: 0.265345

6.CEILING

返回大于或等于所给数字表达式的最小整数。

语法

CEILING ( numeric_expression )

参数

numeric_expression

是精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。

返回类型

返回与 numeric_expression 相同的类型。

示例

下面的示例显示使用 CEILING 函数的正数、负数和零值。

SELECT CEILING($123.45), CEILING($-123.45), CEILING($0.0)

GO

下面是结果集:

--------- --------- -------------------------

124.00    -123.00    0.00

7.COS

一个数学函数,返回给定表达式中给定角度(以弧度为单位)的三角余弦值。

语法

COS ( float_expression )

参数

float_expression

是 float 类型的 expression。

返回类型

float

示例

下面的示例返回给定角度的 COS 值。

DECLARE @angle float

SET @angle = 14.78

SELECT ’The COS of the angle is: ’ + CONVERT(varchar,COS(@angle))

GO

下面是结果集:

The COS of the angle is: -0.599465

8.COT

一个数学函数,返回给定 float 表达式中指定角度(以弧度为单位)的三角余切值。

语法

COT ( float_expression )

参数

float_expression

是 float 类型的 expression。

返回类型

float

示例

下面的示例返回给定角度的 COT 值。

DECLARE @angle float

SET @angle = 124.1332

SELECT ’The COT of the angle is: ’ + CONVERT(varchar,COT(@angle))

GO

下面是结果集:

The COT of the angle is: -0.040312

9.DEGREES

当给出以弧度为单位的角度时,返回相应的以度数为单位的角度。

语法

DEGREES ( numeric_expression )

参数

numeric_expression

精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。

返回代码值

返回与 numeric_expression 相同的类型。

示例

下例以 PI/2 弧度的角度返回度数。

SELECT ’The number of degrees in PI/2 radians is: ’ +

CONVERT(varchar, DEGREES((PI()/2)))

GO

下面是结果集:

The number of degrees in PI/2 radians is 90

10.EXP

返回所给的 float 表达式的指数值。

语法

EXP ( float_expression )

参数

float_expression

是 float 类型的表达式。

返回类型

float

示例

本示例声明一个变量,同时返回所给变量 (378.615345498) 的指数值,并附有文字说明。

DECLARE @var float

SET @var = 378.615345498

SELECT ’The EXP of the variable is: ’ + CONVERT(varchar,EXP(@var))

GO

下面是结果集:

The EXP of the variable is: 2.69498e+164

11.FLOOR

返回小于或等于所给数字表达式的最大整数。

语法

FLOOR ( numeric_expression )

参数

numeric_expression

精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。

返回类型

返回与 numeric_expression 相同的类型。

示例

此示例说明正数、负数和货币值在 FLOOR 函数中的运用。

SELECT FLOOR(123.45), FLOOR(-123.45), FLOOR($123.45)

结果为与 numeric_expression 数据类型相同的计算值的整数部分。

---------      ---------     -----------

123            -124          123.0000

12.LOG

返回给定 float 表达式的自然对数。

语法

LOG ( float_expression )

参数

float_expression

是 float 数据类型的表达式。

返回类型

float

示例

下例计算给定 float 表达式的 LOG。

DECLARE @var float

SET @var = 5.175643

SELECT ’The LOG of the variable is: ’ + CONVERT(varchar,LOG(@var))

GO

下面是结果集:

The LOG of the variable is: 1.64396

13.LOG10

返回给定 float 表达式的以 10 为底的对数。

语法

LOG10 ( float_expression )

参数

float_expression

是 float 数据类型的表达式。

返回类型

float

示例

下例计算给定变量的 LOG10。

DECLARE @var float

SET @var = 145.175643

SELECT ’The LOG10 of the variable is: ’ + CONVERT(varchar,LOG10(@var))

GO

下面是结果集:

The LOG10 of the variable is: 2.16189

14.PI

返回 PI 的常量值。

语法

PI ( )

返回类型

float

示例

本示例返回 PI 值。

SELECT PI()

GO

下面是结果集:

------------------------

3.14159265358979

15.POWER

返回给定表达式乘指定次方的值。

语法

POWER ( numeric_expression , y )

参数

numeric_expression

是精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。

y

numeric_expression 的次方。y 可以是精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。

返回类型

与 numeric_expression 相同。

示例

A. 使用 POWER 显示结果 0.0

本示例显示返回结果 0.0 的浮点下溢。

SELECT POWER(2.0, -100.0)

GO

下面是结果集:

------------------------------------------

0.0

(1 row(s) affected)

B. 使用 POWER

本示例显示 21 到 24 的 POWER 结果。

DECLARE @value int, @counter int

SET @value = 2

SET @counter = 1

WHILE @counter < 5

BEGIN

SELECT POWER(@value, @counter)

SET NOCOUNT ON

SET @counter = @counter + 1

SET NOCOUNT OFF

END

GO

下面是结果集:

-----------

2

(1 row(s) affected)

-----------

4

(1 row(s) affected)

-----------

8

(1 row(s) affected)

-----------

16

16.RADIANS

对于在数字表达式中输入的度数值返回弧度值。

语法

RADIANS ( numeric_expression )

参数

numeric_expression

精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。

返回类型

返回与 numeric_expression 相同的类型。

示例

A.  使用 RADIANS 显示 0.0

下例返回结果 0.0,因为用于转换为弧度的数字表达式对于 RADIANS 函数太小。

SELECT RADIANS(1e-307)

GO

下面是结果集:

-------------------

0.0

(1 row(s) affected)

B. 使用 RADIANS

下例使用 float 表达式并返回给定角度的弧度 (RADIANS)。

-- First value is -45.01.

DECLARE @angle float

SET @angle = -45.01

SELECT ’The RADIANS of the angle is: ’ +

CONVERT(varchar, RADIANS(@angle))

GO

-- Next value is -181.01.

DECLARE @angle float

SET @angle = -181.01

SELECT ’The RADIANS of the angle is: ’ +

CONVERT(varchar, RADIANS(@angle))

GO

-- Next value is 0.00.

DECLARE @angle float

SET @angle = 0.00

SELECT ’The RADIANS of the angle is: ’ +

CONVERT(varchar, RADIANS(@angle))

GO

-- Next value is 0.1472738.

DECLARE @angle float

SET @angle = 0.1472738

SELECT ’The RADIANS of the angle is: ’ +

CONVERT(varchar, RADIANS(@angle))

GO

-- Last value is 197.1099392.

DECLARE @angle float

SET @angle = 197.1099392

SELECT ’The RADIANS of the angle is: ’ +

CONVERT(varchar, RADIANS(@angle))

GO

下面是结果集:

---------------------------------------

The RADIANS of the angle is: -0.785573

(1 row(s) affected)

---------------------------------------

The RADIANS of the angle is: -3.15922

(1 row(s) affected)

---------------------------------------

The RADIANS of the angle is: 0

(1 row(s) affected)

---------------------------------------

The RADIANS of the angle is: 0.00257041

(1 row(s) affected)

---------------------------------------

The RADIANS of the angle is: 3.44022

(1 row(s) affected)

17.RAND

返回 0 到1 之间的随机float 值。

语法

RAND ( [ seed ] )

参数

seed

是给出种子值或起始值的整型表达式(tinyint、smallint 或 int)。

返回类型

float

注释

在单个查询中反复调用 RAND() 将产生相同的值。

示例

下例产生 4 个通过 RAND 函数产生的不同的随机值。

DECLARE @counter smallint

SET @counter = 1

WHILE @counter < 5

BEGIN

SELECT RAND(@counter) Random_Number

SET NOCOUNT ON

SET @counter = @counter + 1

SET NOCOUNT OFF

END

GO

下面是结果集:

Random_Number

-------------------

0.71359199321292355

(1 row(s) affected)

Random_Number

-------------------

0.7136106261841817

(1 row(s) affected)

Random_Number

-------------------

0.71362925915543995

(1 row(s) affected)

Random_Number

-------------------

0.7136478921266981

(1 row(s) affected)

18.ROUND

返回数字表达式并四舍五入为指定的长度或精度。

语法

ROUND ( numeric_expression , length [ , function ] )

参数

numeric_expression

精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。

length

是 numeric_expression 将要四舍五入的精度。length 必须是 tinyint、smallint 或int。当 length

为正数时,numeric_expression 四舍五入为 length 所指定的小数位数。当 length 为负数时,

numeric_expression 则按 length 所指定的在小数点的左边四舍五入。

function

是要执行的操作类型。function 必须是 tinyint、smallint 或 int。如果省略 function 或 function

的值为 0(默认),numeric_expression 将四舍五入。当指定 0 以外的值时,将截断

numeric_expression。

返回类型

返回与 numeric_expression 相同的类型。

注释

ROUND 始终返回一个值。如果 length 是负数且大于小数点前的数字个数,ROUND 将返回 0。

示例 结果

ROUND(748.58, -4) 0

当 length 是负数时,无论什么数据类型,ROUND 都将返回一个四舍五入的 numeric_expression。

示例 结果

ROUND(748.58, -1) 750.00

ROUND(748.58, -2) 700.00

ROUND(748.58, -3) 1000.00

示例

A. 使用 ROUND 和估计值

下例显示两个表达式,说明使用 ROUND 函数且最后一个数字始终是估计值。

SELECT ROUND(123.9994, 3), ROUND(123.9995, 3)

GO

下面是结果集:

----------- -----------

123.9990    124.0000

B. 使用 ROUND 和四舍五入的近似值

下例显示四舍五入和近似值。

语句 结果

SELECT ROUND(123.4545, 2)

123.4500

SELECT ROUND(123.45, -2)

100.00

C. 使用 ROUND 截断

下例使用两个 SELECT 语句说明四舍五入和截断之间的区别。第一个语句四舍五入结果。第二个语句截断结

果。

语句 结果

SELECT ROUND(150.75, 0)

151.00

SELECT ROUND(150.75, 0, 1)

150.00

19.SIGN

返回给定表达式的正 (+1)、零 (0) 或负 (-1) 号。

语法

SIGN ( numeric_expression )

参数

numeric_expression

精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。

返回类型

float

示例

下例返回从 -1 到 1 的 SIGN 数值。

DECLARE @value real

SET @value = -1

WHILE @value < 2

BEGIN

SELECT SIGN(@value)

SET NOCOUNT ON

SELECT @value = @value + 1

SET NOCOUNT OFF

END

SET NOCOUNT OFF

GO

下面是结果集:

(1 row(s) affected)

------------------------

-1.0

(1 row(s) affected)

------------------------

0.0

(1 row(s) affected)

------------------------

1.0

(1 row(s) affected)

20.SIN

以近似数字 (float) 表达式返回给定角度(以弧度为单位)的三角正弦值。

语法

SIN ( float_expression )

参数

float_expression

是 float 类型的表达式。

返回类型

float

示例

下例计算给定角度的 SIN 值。

DECLARE @angle float

SET @angle = 45.175643

SELECT ’The SIN of the angle is: ’ + CONVERT(varchar,SIN(@angle))

GO

下面是结果集:

The SIN of the angle is: 0.929607

(1 row(s) affected)

21.SQUARE

返回给定表达式的平方。

语法

SQUARE ( float_expression )

参数

float_expression

是 float 类型的表达式。

返回类型

float

示例

下例返回半径为 1 英寸、高为 5 英寸的圆柱容积。

DECLARE @h float, @r float

SET @h = 5

SET @r = 1

SELECT PI()* SQUARE(@r)* @h AS ’Cyl Vol’

下面是结果:

Cyl Vol

--------------------------

15.707963267948966

22.SQRT

返回给定表达式的平方根。

语法

SQRT ( float_expression )

参数

float_expression

是 float 类型的表达式。

返回类型

float

示例

下例返回 1.00 到 10.00 之间的数字的平方根。

DECLARE @myvalue float

SET @myvalue = 1.00

WHILE @myvalue < 10.00

BEGIN

SELECT SQRT(@myvalue)

SELECT @myvalue = @myvalue + 1

END

GO

下面是结果集:

------------------------

1.0

------------------------

1.4142135623731

------------------------

1.73205080756888

------------------------

2.0

------------------------

2.23606797749979

------------------------

2.44948974278318

------------------------

2.64575131106459

------------------------

2.82842712474619

------------------------

3.0

23.TAN

返回输入表达式的正切值。

语法

TAN ( float_expression )

参数

float_expression

float 或 real 类型的表达式,解释为弧度数。

返回类型

float

示例

下例返回 PI()/2 的正切值。

SELECT TAN(PI()/2)

下面是结果集:

----------------------

1.6331778728383844E+16

字符串函数

1.ASCII

返回字符表达式最左端字符的 ASCII 代码值。

语法

ASCII ( character_expression )

参数

character_expression

是类型为 char 或 varchar的表达式。

返回类型

int

示例

下例假定在 ASCII 字符集环境下运行,它将返回字符串"Du Monde entier"中每一个字符的 ASCII 值和

char 字符。

SET TEXTSIZE 0

SET NOCOUNT ON

-- Create the variables for the current character string position

-- and for the character string.

DECLARE @position int, @string char(15)

-- Initialize the variables.

SET @position = 1

SET @string = ’Du monde entier’

WHILE @position <= DATALENGTH(@string)

BEGIN

SELECT ASCII(SUBSTRING(@string, @position, 1)),

CHAR(ASCII(SUBSTRING(@string, @position, 1)))

SET @position = @position + 1

END

SET NOCOUNT OFF

GO

下面是结果集:

----------- -

68          D

----------- -

117         u

----------- -

32

----------- -

109         m

----------- -

111         o

----------- -

110         n

----------- -

100         d

----------- -

101         e

----------- -

32

----------- -

101         e

----------- -

110         n

----------- -

116         t

----------- -

105         i

----------- -

101         e

----------- -

114         r

2.CHAR

将 int ASCII 代码转换为字符的字符串函数。

语法

CHAR ( integer_expression )

参数

integer_expression

介于 0 和 255 之间的整数。如果整数表达式不在此范围内,将返回 NULL 值。

返回类型

char(1)

注释

CHAR 可用于将控制字符插入字符串中。下表显示了一些常用的控制字符。

控制字符 值

制表符 CHAR(9)

换行符 CHAR(10)

回车 CHAR(13)

示例

A. 使用 ASCII 和 CHAR 打印字符串的 ASCII 值

下面的示例将打印字符串"New Moon"中每个字符的 ASCII 值和字符。

SET TEXTSIZE 0

-- Create variables for the character string and for the current

-- position in the string.

DECLARE @position int, @string char(8)

-- Initialize the current position and the string variables.

SET @position = 1

SET @string = ’New Moon’

WHILE @position <= DATALENGTH(@string)

BEGIN

SELECT ASCII(SUBSTRING(@string, @position, 1)),

CHAR(ASCII(SUBSTRING(@string, @position, 1)))

SET @position = @position + 1

END

GO

下面是结果集:

----------- -

78          N

----------- -

101         e

----------- -

119         w

----------- -

32

----------- -

77          M

----------- -

111         o

----------- -

111         o

----------- -

110         n

----------- -

B. 使用 CHAR 插入控制字符

下例使用 CHAR(13) 在不同的行上打印名称、地址与城市信息,并以文本方式返回结果。

USE Northwind

SELECT FirstName + ’ ’ + LastName, + CHAR(13) + Address,

+ CHAR(13) + City, + Region

FROM Employees

WHERE EmployeeID = 1

下面是结果集:

Nancy Davolio

507 - 20th Ave. E.

Apt. 2A

Seattle            WA

3.CHARINDEX

返回字符串中指定表达式的起始位置。

语法

CHARINDEX ( expression1 , expression2 [ , start_location ] )

参数

expression1

一个表达式,其中包含要寻找的字符的次序。expression1 是一个短字符数据类型分类的表达式。

expression2

一个表达式,通常是一个用于搜索指定序列的列。expression2 属于字符串数据类型分类。

start_location

在 expression2 中搜索 expression1 时的起始字符位置。如果没有给定 start_location,而是一个负数

或零,则将从 expression2 的起始位置开始搜索。

返回类型

int

注释

如果 expression1 或 expression2 之一属于 Unicode 数据类型(nvarchar 或 nchar)而另一个不属

于,则将另一个转换为 Unicode 数据类型。

如果 expression1 或 expression2 之一为 NULL 值,则当数据库兼容级别为 70 或更大时,CHARINDEX

返回 NULL 值。当数据库兼容级别为 65 或更小时,CHARINDEX 仅在 expression1 和 expression2 都为

NULL 时返回 NULL 值。

如果在 expression2 内没有找到 expression1,则 CHARINDEX 返回 0。

示例

第一个代码示例返回序列"wonderful"在 titles 表的 notes 列中开始的位置。第二个示例使用可选的

start_location 参数从 notes 列的第五个字符开始寻找"wonderful"。第三个示例显示了当

expression2 内找不到 expression1 时的结果集。

USE pubs

GO

SELECT CHARINDEX(’wonderful’, notes)

FROM titles

WHERE title_id = ’TC3218’

GO

-- Use the optional start_location parameter to start searching

-- for wonderful starting with the fifth character in the notes

-- column.

USE pubs

GO

SELECT CHARINDEX(’wonderful’, notes, 5)

FROM titles

WHERE title_id = ’TC3218’

GO

下面是第一个查询和第二个查询的结果集:

-----------

46

(1 row(s) affected)

USE pubs

GO

SELECT CHARINDEX(’wondrous’, notes)

FROM titles

WHERE title_id=’TC3218’

GO

下面是结果集。

-----------

0

4.DIFFERENCE

以整数返回两个字符表达式的 SOUNDEX 值之差。

语法

DIFFERENCE ( character_expression , character_expression )

参数

character_expression

是类型 char 或 varchar 的表达式。

返回类型

int

注释

返回的整数是 SOUNDEX 值中相同字符的个数。返回的值从 0 到 4 不等,4 表示 SOUNDEX 值相同。

示例

在下例的第一部分,比较两个相差很小的字符串的 SOUNDEX 值,DIFFERENCE 返回的值是 4。在下例的第二

部分,比较两个相差很大的字符串的 SOUNDEX 值,DIFFERENCE 返回的值是 0。

USE pubs

GO

-- Returns a DIFFERENCE value of 4, the least possible difference.

SELECT SOUNDEX(’Green’),

SOUNDEX(’Greene’), DIFFERENCE(’Green’,’Greene’)

GO

-- Returns a DIFFERENCE value of 0, the highest possible difference.

SELECT SOUNDEX(’Blotchet-Halls’),

SOUNDEX(’Greene’), DIFFERENCE(’Blotchet-Halls’, ’Greene’)

GO

下面是结果集:

----- ----- -----------

G650  G650  4

(1 row(s) affected)

----- ----- -----------

B432  G650  0

5.LEFT

返回从字符串左边开始指定个数的字符。

语法

LEFT ( character_expression , integer_expression )

参数

character_expression

字符或二进制数据表达式。character_expression 可以是常量、变量或列。character_expression 必须

是可以隐式地转换为 varchar 的数据类型。否则,请使用 CAST 函数显式转换 character_expression。

integer_expression

是正整数。如果 integer_expression 为负,则返回空字符串。

返回类型

varchar

注释

兼容级别可能影响返回值。有关兼容级别的更多信息,请参见 sp_dbcmptlevel。

示例

A. 对列使用 LEFT 函数

下面的示例返回每个书名最左边的 5 个字符。

USE pubs

GO

SELECT LEFT(title, 5)

FROM titles

ORDER BY title_id

GO

下面是结果集:

-----

The B

Cooki

You C

Strai

Silic

The G

The P

But I

Secre

Net E

Compu

Is An

Life

Prolo

Emoti

Onion

Fifty

Sushi

(18 row(s) affected)

B. 对字符串使用 LEFT 函数

下面的示例使用 LEFT 函数返回字符串 abcdefg 最左边的 2 个字符。

SELECT LEFT(’abcdefg’,2)

GO

下面是结果集:

--

ab

6.LEN

返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格。

语法

LEN ( string_expression )

参数

string_expression

要计算的字符串表达式。

返回类型

int

示例

下面的示例选定字符个数和位于芬兰的公司的 CompanyName 数据。

USE Northwind

GO

SELECT LEN(CompanyName) AS ’Length’, CompanyName

FROM Customers

WHERE Country = ’Finland’

下面是结果集:

Length       CompanyName

-----------  ------------------------------

14           Wartian Herkku

11           Wilman Kala

7.LOWER

将大写字符数据转换为小写字符数据后返回字符表达式。

语法

LOWER ( character_expression )

参数

character_expression

是字符或二进制数据表达式。character_expression 可以是常量、变量或列。character_expression 必

须是可以隐性转换为 varchar 的数据类型。否则,使用 CAST 显式转换 character_expression。

返回类型

varchar

示例

下例在选择价格位于 $11 和 $20 间的书名时,使用 LOWER 函数、UPPER 函数并把 UPPER 函数嵌套在

LOWER 函数内。

USE pubs

GO

SELECT LOWER(SUBSTRING(title, 1, 20)) AS Lower,

UPPER(SUBSTRING(title, 1, 20)) AS Upper,

LOWER(UPPER(SUBSTRING(title, 1, 20))) As LowerUpper

FROM titles

WHERE price between 11.00 and 20.00

GO

下面是结果集:

Lower                   Upper                   LowerUpper

--------------------    --------------------    --------------------

the busy executive’s    THE BUSY EXECUTIVE’S    the busy executive’s

cooking with compute    COOKING WITH COMPUTE    cooking with compute

straight talk about     STRAIGHT TALK ABOUT     straight talk about

silicon valley gastr    SILICON VALLEY GASTR    silicon valley gastr

secrets of silicon v    SECRETS OF SILICON V    secrets of silicon v

prolonged data depri    PROLONGED DATA DEPRI    prolonged data depri

fifty years in bucki    FIFTY YEARS IN BUCKI    fifty years in bucki

sushi, anyone?          SUSHI, ANYONE?          sushi, anyone?

(8 row(s) affected)

8.LTRIM

删除起始空格后返回字符表达式。

语法

LTRIM ( character_expression )

参数

character_expression

是字符或二进制数据表达式。character_expression 可以是常量、变量或列。character_expression 必

须是可以隐性转换为 varchar 的数据类型。否则,使用 CAST 显式转换 character_expression。

返回类型

varchar

注释

兼容级别可能影响返回值。有关兼容级别的更多信息,请参见 sp_dbcmptlevel。

示例

下例使用 LTRIM 字符删除字符变量中的起始空格。

DECLARE @string_to_trim varchar(60)

SET @string_to_trim = ’     Five spaces are at the beginning of this

string.’

SELECT ’Here is the string without the leading spaces: ’ +

LTRIM(@string_to_trim)

GO

下面是结果集:

------------------------------------------------------------------------

Here is the string without the leading spaces: Five spaces are at the beginning of this

string.

9.NCHAR

根据 Unicode 标准所进行的定义,用给定整数代码返回 Unicode 字符。

语法

NCHAR ( integer_expression )

参数

integer_expression

介于 0 与 65535 之间的所有正整数。如果指定了超出此范围的值,将返回 NULL。

返回类型

nchar(1)

示例

A. 使用 NCHAR 和 UNICODE

下面的示例使用 UNICODE 和 NCHAR 函数打印字符串 K?enhavn 第二个字符的 UNICODE 值和 NCHAR

(Unicode 字符),并打印实际的第二个字符?。

DECLARE @nstring nchar(8)

SET @nstring = N’K?benhavn’

SELECT UNICODE(SUBSTRING(@nstring, 2, 1)),

NCHAR(UNICODE(SUBSTRING(@nstring, 2, 1)))

GO

下面是结果集:

----------- -

248         ?(1 row(s) affected)

B. 使用 SUBSTRING、UNICODE、CONVERT 和 NCHAR

下面的示例使用 SUBSTRING、UNICODE、CONVERT 和 NCHAR 函数打印字符串 K?enhavn 的字符数、

Unicode 字符以及每个字符的 UNICODE 值。

-- The @position variable holds the position of the character currently

-- being processed. The @nstring variable is the Unicode character

-- string to process.

DECLARE @position int, @nstring nchar(9)

-- Initialize the current position variable to the first character in

-- the string.

SET @position = 1

-- Initialize the character string variable to the string to process.

-- Notice that there is an N before the start of the string, which

-- indicates that the data following the N is Unicode data.

SET @nstring = N’K?benhavn’

-- Print the character number of the position of the string you’re at,

-- the actual Unicode character you’re processing, and the UNICODE value -- for this

particular character.

PRINT ’Character #’ + ’ ’ + ’Unicode Character’ + ’ ’ + ’UNICODE Value’

WHILE @position <= DATALENGTH(@nstring)

BEGIN

SELECT @position,

NCHAR(UNICODE(SUBSTRING(@nstring, @position, 1))),

CONVERT(NCHAR(17), SUBSTRING(@nstring, @position, 1)),

UNICODE(SUBSTRING(@nstring, @position, 1))

SELECT @position = @position + 1

END

GO

下面是结果集:

Character # Unicode Character UNICODE Value

----------- ----------------- -----------

1           K                 75

----------- ----------------- -----------

2           ?                 248

----------- ----------------- -----------

3           b                 98

----------- ----------------- -----------

4           e                 101

----------- ----------------- -----------

5           n                 110

----------- ----------------- -----------

6           h                 104

----------- ----------------- -----------

7           a                 97

----------- ----------------- -----------

8           v                 118

----------- ----------------- -----------

9           n                 110

----------- ----------------- -----------

10          (null)            (null)

----------- ----------------- -----------

11          (null)            (null)

----------- ----------------- -----------

12          (null)            (null)

----------- ----------------- -----------

13          (null)            (null)

----------- ----------------- -----------

14          (null)            (null)

----------- ----------------- -----------

15          (null)            (null)

----------- ----------------- -----------

16          (null)            (null)

----------- ----------------- -----------

17          (null)            (null)

----------- ----------------- -----------

18          (null)            (null)

10.PATINDEX

返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,

则返回零。

语法

PATINDEX ( ’%pattern%’ , expression )

参数

pattern

一个字符串。可以使用通配符,但 pattern 之前和之后必须有 % 字符(搜索第一个和最后一个字符时除

外)。pattern 是短字符数据类型类别的表达式。

expression

一个表达式,通常为要在其中搜索指定模式的列,expression 为字符串数据类型类别。

返回类型

int

注释

PATINDEX 对 text 数据类型很有用;除 IS NULL、IS NOT NULL 和 LIKE(这些是 WHERE 子句中对

text 类型有效的仅有的其它比较运算)外,PATINDEX 也可用于 WHERE 子句中。

如果 pattern 或 expression 为 NULL,则当数据库的兼容级别为 70 时 PATINDEX 返回 NULL;如果数据

库兼容级别为 65 或更靠前,则仅当 pattern 和 expression 同时为 NULL 时,PATINDEX 返回 NULL。

示例

A. 在 PATINDEX 中使用模式

本示例查找模式"wonderful"在 titles 表中 notes 列的某一特定行中的开始位置。

USE pubs

GO

SELECT PATINDEX(’%wonderful%’, notes)

FROM titles

WHERE title_id = ’TC3218’

GO

下面是结果集:

-----------

46

(1 row(s) affected)

如果未通过 WHERE 子句限制要搜索的行,查询将返回表中的所有行,对在其中找到该模式的所有行报告非零

值,对在其中未找到该模式的所有行报告零值。

B. 在 PATINDEX 中使用通配符

本示例使用通配符查找模式"won_erful"在 titles 表中 notes 列的某一特定行中的开始位置,其中下划线

为代表任何字符的通配符。

USE pubs

GO

SELECT PATINDEX(’%won_erful%’, notes)

FROM titles

WHERE title_id = ’TC3218’

GO

下面是结果集:

------------

46

(1 row(s) affected)

如果没有限制要搜索的行,查询将返回表中的所有行,对在其中找到该模式的所有行报告非零值。

11.REPLACE

用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。

语法

REPLACE ( ’string_expression1’ , ’string_expression2’ , ’string_expression3’ )

参数

’string_expression1’

待搜索的字符串表达式。string_expression1 可以是字符数据或二进制数据。

’string_expression2’

待查找的字符串表达式。string_expression2 可以是字符数据或二进制数据。

’string_expression3’

替换用的字符串表达式。string_expression3 可以是字符数据或二进制数据。

返回类型

如果 string_expression(1、2 或 3)是支持的字符数据类型之一,则返回字符数据。如果

string_expression(1、2 或 3)是支持的 binary 数据类型之一,则返回二进制数据。

示例

下例用 xxx 替换 abcdefghi 中的字符串 cde。

SELECT REPLACE(’abcdefghicde’,’cde’,’xxx’)

GO

下面是结果集:

------------

abxxxfghixxx

(1 row(s) affected)

12.QUOTENAME

返回带有分隔符的 Unicode 字符串,分隔符的加入可使输入的字符串成为有效的 Microsoft? SQL

Server? 分隔标识符。

语法

QUOTENAME ( ’character_string’ [ , ’quote_character’ ] )

参数

’{character}[...n]’

Unicode 字符数据字符串。character_string 是 sysname 值。

’quote_character’

用作分隔符的单字符字符串。可以是单引号 (’)、左括号或右括号 ([]) 或者双引号 (")。如果未指定

quote_character,则使用括号。

返回类型

nvarchar(129)

示例

本示例采用字符串"abc[]def",并使用"["和"]"字符创建有效的 SQL Server 引用(分隔)标识符。

SELECT QUOTENAME(’abc[]def’)

下面是结果集:

[abc[]]def]

(1 row(s) affected)

注意,字符串"abc[]def"中的右括号有两个,用于表示转义符。

13.REPLICATE

以指定的次数重复字符表达式。

语法

REPLICATE ( character_expression , integer_expression )

参数

character_expression

由字符数据组成的字母数字表达式。character_expression 可以是常量或变量,也可以是字符列或二进制数

据列。

integer_expression

是正整数。如果 integer_expression 为负,则返回空字符串。

返回类型

varchar

character_expression 必须为可隐性转换为 varchar 的数据类型。否则,使用 CAST 函数显式转换

character_expression。

注释

兼容级别可能影响返回值。有关更多信息,请参见 sp_dbcmptlevel。

示例

A. 使用 REPLICATE

下例重复两遍每个作者的名字。

USE pubs

SELECT REPLICATE(au_fname, 2)

FROM authors

ORDER BY au_fname

下面是结果集:

----------------------

AbrahamAbraham

AkikoAkiko

AlbertAlbert

AnnAnn

AnneAnne

BurtBurt

CharleneCharlene

CherylCheryl

DeanDean

DirkDirk

HeatherHeather

InnesInnes

JohnsonJohnson

LiviaLivia

MarjorieMarjorie

MeanderMeander

MichaelMichael

MichelMichel

MorningstarMorningstar

ReginaldReginald

SherylSheryl

StearnsStearns

SylviaSylvia

(23 row(s) affected)

B. 使用 REPLICATE、SUBSTRING 和 SPACE

下例使用 REPLICATE、SUBSTRING 和 SPACE 生成 authors 表中的所有作者的电话和传真列表。

-- Replicate phone number twice because the fax number is identical to

-- the author telephone number.

USE pubs

GO

SELECT SUBSTRING((UPPER(au_lname) + ’,’ + SPACE(1) + au_fname), 1, 35)

AS Name, phone AS Phone, REPLICATE(phone,1) AS Fax

FROM authors

ORDER BY au_lname, au_fname

GO

下面是结果集:

Name                                Phone        Fax

----------------------------------- ------------ -----------------------

BENNET, Abraham                     415 658-9932 415 658-9932

BLOTCHET-HALLS, Reginald            503 745-6402 503 745-6402

CARSON, Cheryl                      415 548-7723 415 548-7723

DEFRANCE, Michel                    219 547-9982 219 547-9982

DEL CASTILLO, Innes                 615 996-8275 615 996-8275

DULL, Ann                           415 836-7128 415 836-7128

GREEN, Marjorie                     415 986-7020 415 986-7020

GREENE, Morningstar                 615 297-2723 615 297-2723

GRINGLESBY, Burt                    707 938-6445 707 938-6445

HUNTER, Sheryl                      415 836-7128 415 836-7128

KARSEN, Livia                       415 534-9219 415 534-9219

LOCKSLEY, Charlene                  415 585-4620 415 585-4620

MACFEATHER, Stearns                 415 354-7128 415 354-7128

MCBADDEN, Heather                   707 448-4982 707 448-4982

O’LEARY, Michael                    408 286-2428 408 286-2428

PANTELEY, Sylvia                    301 946-8853 301 946-8853

RINGER, Albert                      801 826-0752 801 826-0752

RINGER, Anne                        801 826-0752 801 826-0752

SMITH, Meander                      913 843-0462 913 843-0462

STRAIGHT, Dean                      415 834-2919 415 834-2919

STRINGER, Dirk                      415 843-2991 415 843-2991

WHITE, Johnson                      408 496-7223 408 496-7223

YOKOMOTO, Akiko                     415 935-4228 415 935-4228

(23 row(s) affected)

C. 使用 REPLICATE 和 DATALENGTH

本例中,当数值从数字数据类型转换为字符型或 Unicode 型时,从左填充数字,使其达到指定的长度。

USE Northwind

GO

DROP TABLE t1

GO

CREATE TABLE t1

(

c1 varchar(3),

c2 char(3)

)

GO

INSERT INTO t1 VALUES (’2’, ’2’)

INSERT INTO t1 VALUES (’37’, ’37’)

INSERT INTO t1 VALUES (’597’, ’597’)

GO

SELECT REPLICATE(’0’, 3 - DATALENGTH(c1)) + c1 AS [Varchar Column],

REPLICATE(’0’, 3 - DATALENGTH(c2)) + c2 AS [Char Column]

FROM t1

GO

14.REVERSE

返回字符表达式的反转。

语法

REVERSE ( character_expression )

参数

character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。

返回类型

varchar

注释

character_expression 必须为可隐性转换为 varchar 的数据类型。否则,使用 CAST 显式转换

character_expression。

示例

下例返回所有名字中的字符被反转的作者。

USE pubs

GO

SELECT REVERSE(au_fname)

FROM authors

ORDER BY au_fname

GO

下面是结果集:

--------------------

maharbA

okikA

treblA

nnA

ennA

truB

enelrahC

lyrehC

naeD

kriD

rehtaeH

sennI

nosnhoJ

aiviL

eirojraM

rednaeM

leahciM

lehciM

ratsgninroM

dlanigeR

lyrehS

snraetS

aivlyS

(23 row(s) affected)

15.RIGHT

返回字符串中从右边开始指定个数的 integer_expression 字符。

语法

RIGHT ( character_expression , integer_expression )

参数

character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。

integer_expression

是起始位置,用正整数表示。如果 integer_expression 是负数,则返回一个错误。

返回类型

varchar

character_expression 必须为可隐性转换为 varchar 的数据类型。否则,使用 CAST 显式转换

character_expression。

注释

兼容级别可能影响返回值。有关更多信息,请参见 sp_dbcmptlevel。

示例

下例返回每个作者名字中最右边的五个字符。

USE pubs

GO

SELECT RIGHT(au_fname, 5)

FROM authors

ORDER BY au_fname

GO

下面是结果集:

------------------

raham

Akiko

lbert

Ann

Anne

Burt

rlene

heryl

Dean

Dirk

ather

Innes

hnson

Livia

jorie

ander

chael

ichel

gstar

inald

heryl

earns

ylvia

(23 row(s) affected)

16.RTRIM

截断所有尾随空格后返回一个字符串。

语法

RTRIM ( character_expression )

参数

character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。

返回类型

varchar

注释

character_expression 必须为可隐性转换为 varchar 的数据类型。否则请使用 CAST 函数显式转换

character_expression。

说明  兼容级别可能影响返回值。有关更多信息,请参见 sp_dbcmptlevel。

示例

下例显示如何使用 RTRIM 删除字符变量中的尾随空格。

DECLARE @string_to_trim varchar(60)

SET @string_to_trim = ’Four spaces are after the period in this sentence.    ’

SELECT ’Here is the string without the leading spaces: ’ + CHAR(13) +

RTRIM(@string_to_trim)

GO

下面是结果集:

(1 row(s) affected)

------------------------------------------------------------------------

Here is the string without the leading spaces: Four spaces are after the period in this

sentence.

(1 row(s) affected)

17.SOUNDEX

返回由四个字符组成的代码 (SOUNDEX) 以评估两个字符串的相似性。

语法

SOUNDEX ( character_expression )

参数

character_expression

是字符数据的字母数字表达式。character_expression 可以是常数、变量或列。

返回类型

char

注释

SOUNDEX 将 alpha 字符串转换成由四个字符组成的代码,以查找相似的词或名称。代码的第一个字符是

character_expression 的第一个字符,代码的第二个字符到第四个字符是数字。将忽略

character_expression 中的元音,除非它们是字符串的第一个字母。可以嵌套字符串函数。

示例

下例显示 SOUNDEX 函数及相关的 DIFFERENCE 函数。在第一个示例中,返回所有辅音字母的标准 SOUNDEX

值。为 Smith 和 Smythe 返回的 SOUNDEX 结果相同,因为不包括所有元音、字母 y、连写字母和字母 h。

-- Using SOUNDEX

SELECT SOUNDEX (’Smith’), SOUNDEX (’Smythe’)

下面是结果集:

----- -----

S530  S530

(1 row(s) affected)

DIFFERENCE 函数比较 SOUNDEX 模式结果的差。第一个示例显示两个仅元音不同的字符串。返回的差是 4

(可能的最小差)。

-- Using DIFFERENCE

SELECT DIFFERENCE(’Smithers’, ’Smythers’)

GO

下面是结果集:

-----------

4

(1 row(s) affected)

在下例中,字符串的辅音不同,所以返回的差是 2(较高的差)。

SELECT DIFFERENCE(’Anothers’, ’Brothers’)

GO

下面是结果集:

-----------

2

18.SPACE

返回由重复的空格组成的字符串。

语法

SPACE ( integer_expression )

参数

integer_expression

是表示空格个数的正整数。如果 integer_expression 为负,则返回空字符串。

返回类型

char

注释

若要在 Unicode 数据中包括空格,请使用 REPLICATE 而非 SPACE。

示例

下例剪裁作者的姓氏并串联一个逗号、两个空格和作者的名字。

USE pubs

GO

SELECT RTRIM(au_lname) + ’,’ + SPACE(2) +  LTRIM(au_fname)

FROM authors

ORDER BY au_lname, au_fname

GO

下面是结果集:

Name

---------------------------------------------------------------

Bennet,  Abraham

Blotchet-Halls,  Reginald

Carson,  Cheryl

DeFrance,  Michel

del Castillo,  Innes

Dull,  Ann

Green,  Marjorie

Greene,  Morningstar

Gringlesby,  Burt

Hunter,  Sheryl

Karsen,  Livia

Locksley,  Charlene

MacFeather,  Stearns

McBadden,  Heather

O’Leary,  Michael

Panteley,  Sylvia

Ringer,  Albert

Ringer,  Anne

Smith,  Meander

Straight,  Dean

Stringer,  Dirk

White,  Olivier

Yokomoto,  Akiko

(23 row(s) affected)

19.STR

由数字数据转换来的字符数据。

语法

STR ( float_expression [ , length [ , decimal ] ] )

参数

float_expression

是带小数点的近似数字 (float) 数据类型的表达式。不要在 STR 函数中将函数或子查询用作

float_expression。

length

是总长度,包括小数点、符号、数字或空格。默认值为 10。

decimal

是小数点右边的位数。

返回类型

char

注释

如果为 STR 提供 length 和 decimal 参数值,则这些值应该是正数。在默认情况下或者小数参数为 0 时,

数字四舍五入为整数。指定长度应该大于或等于小数点前面的数字加上数字符号(若有)的长度。短的

float_expression 在指定长度内右对齐,长的 float_expression 则截断为指定的小数位数。例如,STR

(12,10) 输出的结果是 12,在结果集内右对齐。而 STR(1223, 2) 则将结果集截断为 **。可以嵌套字符串

函数。

说明  若要转换为 Unicode 数据,请在 CONVERT 或 CAST 转换函数内使用 STR。

示例

A. 使用 STR

下例将包含五个数字和一个小数点的表达式转换为有六个位置的字符串。数字的小数部分四舍五入为一个小数

位。

SELECT STR(123.45, 6, 1)

GO

下面是结果集:

------

123.5

(1 row(s) affected)

当表达式超出指定长度时,字符串为指定长度返回 **。

SELECT STR(123.45, 2, 2)

GO

下面是结果集:

--

**

(1 row(s) affected)

即使数字数据嵌套在 STR内,结果集也是带指定格式的字符数据。

SELECT STR (FLOOR (123.45), 8, 3)

GO

下面是结果集:

--------

123.000

(1 row(s) affected)

B. 使用 STR 和 CONVERT 函数

下例比较 STR 和 CONVERT 的结果。

SELECT STR(3.147) AS ’STR’,

STR(3.147, 5, 2) AS ’2 decimals’,

STR(3.147, 5, 3) AS ’3 decimals’

GO

下面是结果集:

STR        2 decimals 3 decimals

---------- ---------- ----------

3  3.15      3.147

(1 row(s) affected)

-- Use CONVERT.

SELECT CONVERT(char(1), 3.147) AS ’CHAR(1)’,

CONVERT(char(3), 3.147) AS ’CHAR(3)’,

CONVERT(char(5), 3.147) AS ’CHAR(5)’

GO

下面是结果集:

CHAR(1) CHAR(3) CHAR(5)

------- ------- -------

(null)  (null)  3.147

20.STUFF

删除指定长度的字符并在指定的起始点插入另一组字符。

语法

STUFF ( character_expression , start , length , character_expression )

参数

character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。

start

是一个整形值,指定删除和插入的开始位置。如果 start 或 length 是负数,则返回空字符串。如果

start 比第一个 character_expression 长,则返回空字符串。

length

是一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后

一个 character_expression 中的最后一个字符。

返回类型

如果 character_expression 是一个支持的字符数据类型,则返回字符数据。如果

character_expression 是一个支持的 binary 数据类型,则返回二进制数据。

注释

可以嵌套字符串函数。

示例

下例通过在第一个字符串 (abcdef) 中删除从第二个位置(字符 b)开始的三个字符,然后在删除的起始位置

插入第二个字符串,创建并返回一个字符串。

SELECT STUFF(’abcdef’, 2, 3, ’ijklmn’)

GO

下面是结果集:

---------

aijklmnef

21.STUFF

删除指定长度的字符并在指定的起始点插入另一组字符。

语法

STUFF ( character_expression , start , length , character_expression )

参数

character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。

start

是一个整形值,指定删除和插入的开始位置。如果 start 或 length 是负数,则返回空字符串。如果

start 比第一个 character_expression 长,则返回空字符串。

length

是一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后

一个 character_expression 中的最后一个字符。

返回类型

如果 character_expression 是一个支持的字符数据类型,则返回字符数据。如果

character_expression 是一个支持的 binary 数据类型,则返回二进制数据。

注释

可以嵌套字符串函数。

示例

下例通过在第一个字符串 (abcdef) 中删除从第二个位置(字符 b)开始的三个字符,然后在删除的起始位置

插入第二个字符串,创建并返回一个字符串。

SELECT STUFF(’abcdef’, 2, 3, ’ijklmn’)

GO

下面是结果集:

---------

aijklmnef

22.SUBSTRING

返回字符、binary、text 或 image 表达式的一部分。有关可与该函数一起使用的有效 Microsoft? SQL

Server? 数据类型的更多信息,请参见数据类型。

语法

SUBSTRING ( expression , start , length )

参数

expression

是字符串、二进制字符串、text、image、列或包含列的表达式。不要使用包含聚合函数的表达式。

start

是一个整数,指定子串的开始位置。

length

是一个整数,指定子串的长度(要返回的字符数或字节数)。

说明  由于在 text 数据上使用 SUBSTRING 时 start 和 length 指定字节数,因此 DBCS 数据(如日本

汉字)可能导致在结果的开始或结束位置拆分字符。此行为与 READTEXT 处理 DBCS 的方式一致。然而,由

于偶而会出现奇怪的结果,建议对 DBCS 字符使用 ntext 而非 text。

返回类型

如果 expression 是支持的字符数据类型,则返回字符数据。如果 expression 是支持的 binary 数据类

型,则返回二进制数据。

返回字符串的类型与给定表达式的类型相同(表中显示的除外)。

给定的表达式 返回类型

text varchar

image varbinary

ntext nvarchar

注释

在字符数中必须指定使用 ntext、char 或 varchar 数据类型的偏移量(start 和 length)。在字节数中

必须指定使用 text、image、binary 或 varbinary 数据类型的偏移量。

说明  兼容级别可能影响返回值。有关兼容级别的更多信息,请参见 sp_dbcmptlevel。

示例

A. 在字符串上使用 SUBSTRING

下例显示如何只返回字符串的一部分。该查询在一列中返回 authors 表中的姓氏,在另一列中返回

authors 表中的名字首字母。

USE pubs

SELECT au_lname, SUBSTRING(au_fname, 1, 1)

FROM authors

ORDER BY au_lname

下面是结果集:

au_lname

---------------------------------------- -

Bennet                                   A

Blotchet-Halls                           R

Carson                                   C

DeFrance                                 M

del Castillo                             I

...

Yokomoto                                 A

(23 row(s) affected)

下例显示如何显示字符串常量 abcdef 中的第二个、第三个和第四个字符。

SELECT x = SUBSTRING(’abcdef’, 2, 3)

下面是结果集:

x

----------

bcd

(1 row(s) affected)

B. 在 text、ntext 和 image 数据上使用 SUBSTRING

下例显示如何从 pubs 数据库的 publishers 表内的每个 text 和 image 数据列中返回前 200 个字符。

text 数据以 varchar 的形式返回,image 数据则以 varbinary 的形式返回。

USE pubs

SELECT pub_id, SUBSTRING(logo, 1, 10) AS logo,

SUBSTRING(pr_info, 1, 10) AS pr_info

FROM pub_info

WHERE pub_id = ’1756’

下面是结果集:

pub_id logo                   pr_info

------ ---------------------- ----------

1756   0x474946383961E3002500 This is sa

(1 row(s) affected)

下例显示 SUBSTRING 在 text 和 ntext 数据上的效果。首先,下例在 pubs 数据库内创建一个名为

npr_info 的新表。然后,在 npr_info 表中用 pub_info.pr_info 列的前 80 个字符创建 pr_info 列,

并添加ü作为首字符。最后,INNER JOIN 检索所有出版商标识号以及 text 和 ntext 出版商信息列的

SUBSTRING。

IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES

WHERE table_name = ’npub_info’)

DROP TABLE npub_info

GO

-- Create npub_info table in pubs database. Borrowed from instpubs.sql.

USE pubs

GO

CREATE TABLE npub_info

(

pub_id         char(4)           NOT NULL

REFERENCES publishers(pub_id)

CONSTRAINT UPKCL_npubinfo PRIMARY KEY CLUSTERED,

pr_info        ntext             NULL

)

GO

-- Fill the pr_info column in npub_info with international data.

RAISERROR(’Now at the inserts to pub_info...’,0,1)

GO

INSERT npub_info VALUES(’0736’, N’üThis is sample text data for New Moon Books, publisher

0736 in the pubs database’)

INSERT npub_info values(’0877’, N’üThis is sample text data for Binnet & Hardley,

publisher 0877 in the pubs databa’)

INSERT npub_info values(’1389’, N’üThis is sample text data for Algodata Infosystems,

publisher 1389 in the pubs da’)

INSERT npub_info values(’9952’, N’üThis is sample text data for Scootney Books, publisher

9952 in the pubs database’)

INSERT npub_info values(’1622’, N’üThis is sample text data for Five Lakes Publishing,

publisher 1622 in the pubs d’)

INSERT npub_info values(’1756’, N’üThis is sample text data for Ramona Publishers,

publisher 1756 in the pubs datab’)

INSERT npub_info values(’9901’, N’üThis is sample text data for GGG&G, publisher 9901 in

the pubs database. GGG&G i’)

INSERT npub_info values(’9999’, N’üThis is sample text data for Lucerne Publishing,

publisher 9999 in the pubs data’)

GO

-- Join between npub_info and pub_info on pub_id.

SELECT pr.pub_id, SUBSTRING(pr.pr_info, 1, 35) AS pr_info,

SUBSTRING(npr.pr_info, 1, 35) AS npr_info

FROM pub_info pr INNER JOIN npub_info npr

ON pr.pub_id = npr.pub_id

ORDER BY pr.pub_id ASC

22.UNICODE

按照 Unicode 标准的定义,返回输入表达式的第一个字符的整数值。

语法

UNICODE ( ’ncharacter_expression’ )

参数

’ncharacter_expression’

是 nchar 或 nvarchar 表达式。

返回类型

int

示例

A. 使用 UNICODE 和 NCHAR

下面的示例使用 UNICODE 和 NCHAR 函数打印 ?kergatan 24 字符串中第一个字符的 UNICODE 值,并打印

实际的第一个字符 ?。

DECLARE @nstring nchar(12)

SET @nstring = N’?kergatan 24’

SELECT UNICODE(@nstring), NCHAR(UNICODE(@nstring))

下面是结果集:

----------- -

197         ?

B. 使用 SUBSTRING、UNICODE 和 CONVERT 函数

下面的示例使用 SUBSTRING、UNICODE 和 CONVERT 函数输出字符串 ?kergatan 24 中每个字符的字符号、

Unicode 字符和 UNICODE 值。

-- The @position variable holds the position of the character currently

-- being processed. The @nstring variable is the Unicode character

-- string to process.

DECLARE @position int, @nstring nchar(12)

-- Initialize the current position variable to the first character in

-- the string.

SET @position = 1

-- Initialize the character string variable to the string to process.

-- Notice that there is an N before the start of the string, which

-- indicates that the data following the N is Unicode data.

SET @nstring = N’?kergatan 24’

-- Print the character number of the position of the string you are at,

-- the actual Unicode character you are processing, and the UNICODE

-- value for this particular character.

PRINT ’Character #’ + ’ ’ + ’Unicode Character’ + ’ ’ + ’UNICODE Value’

WHILE @position <= DATALENGTH(@nstring)

-- While these are still characters in the character string,

BEGIN

SELECT @position,

CONVERT(char(17), SUBSTRING(@nstring, @position, 1)),

UNICODE(SUBSTRING(@nstring, @position, 1))

SELECT @position = @position + 1

END

下面是结果集:

Character # Unicode Character UNICODE Value

----------- ----------------- -----------

1           ?                 197

----------- ----------------- -----------

2           k                 107

----------- ----------------- -----------

3           e                 101

----------- ----------------- -----------

4           r                 114

----------- ----------------- -----------

5           g                 103

----------- ----------------- -----------

6           a                 97

----------- ----------------- -----------

7           t                 116

----------- ----------------- -----------

8           a                 97

----------- ----------------- -----------

9           n                 110

----------- ----------------- -----------

10                            32

----------- ----------------- -----------

11          2                 50

----------- ----------------- -----------

12          4                 52

23.UPPER

返回将小写字符数据转换为大写的字符表达式。

语法

UPPER ( character_expression )

参数

character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。

返回类型

varchar

注释

character_expression 必须为可隐性转换为 varchar 的数据类型。否则请使用 CAST 函数显式转换

character_expression。

示例

本示例使用 UPPER 函数和 RTRIM 函数来返回整理过的大写的作者姓名。

USE pubs

GO

SELECT UPPER(RTRIM(au_lname)) + ’, ’ + au_fname AS Name

FROM authors

ORDER BY au_lname

GO

下面是结果集:

Name

--------------------------------------------------------------

BENNET, Abraham

BLOTCHET-HALLS, Reginald

CARSON, Cheryl

DEFRANCE, Michel

DEL CASTILLO, Innes

DULL, Ann

GREEN, Marjorie

GREENE, Morningstar

GRINGLESBY, Burt

HUNTER, Sheryl

KARSEN, Livia

LOCKSLEY, Charlene

MACFEATHER, Stearns

MCBADDEN, Heather

O’LEARY, Michael

PANTELEY, Sylvia

RINGER, Albert

RINGER, Anne

SMITH, Meander

STRAIGHT, Dean

STRINGER, Dirk

WHITE, Johnson

YOKOMOTO, Akiko

系统函数

1.APP_NAME

返回当前会话的应用程序名称(如果应用程序进行了设置)。

语法

APP_NAME ( )

返回类型

nvarchar(128)

示例

下例检查启动此进程的客户端应用程序是否为 SQL 查询分析器会话。

DECLARE @CurrentApp varchar(35)

SET @CurrentApp = APP_NAME()

IF @CurrentApp <> ’MS SQL Query Analyzer’

PRINT ’This process was not started by a SQL Query Analyzer query session.’

2.CASE

计算条件列表并返回多个可能结果表达式之一。

CASE 具有两种格式:

简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。

CASE 搜索函数计算一组布尔表达式以确定结果。

两种格式都支持可选的 ELSE 参数。

语法

简单 CASE 函数:

CASE input_expression

WHEN when_expression THEN result_expression

[ ...n ]

[

ELSE else_result_expression

END

CASE 搜索函数:

CASE

WHEN Boolean_expression THEN result_expression

[ ...n ]

[

ELSE else_result_expression

END

参数

input_expression

是使用简单 CASE 格式时所计算的表达式。Input_expression 是任何有效的 Microsoft? SQL Server? 表

达式。

WHEN when_expression

使用简单 CASE 格式时 input_expression 所比较的简单表达式。When_expression 是任意有效的 SQL

Server 表达式。Input_expression 和每个 when_expression 的数据类型必须相同,或者是隐性转换。

n

占位符,表明可以使用多个 WHEN when_expression THEN result_expression 子句或 WHEN

Boolean_expression THEN result_expression 子句。

THEN result_expression

当 input_expression = when_expression 取值为 TRUE,或者 Boolean_expression 取值为 TRUE 时返

回的表达式。result expression 是任意有效的 SQL Server 表达式。

ELSE else_result_expression

当比较运算取值不为 TRUE 时返回的表达式。如果省略此参数并且比较运算取值不为 TRUE,CASE 将返回

NULL 值。Else_result_expression 是任意有效的 SQL Server 表达式。Else_result_expression 和所

有 result_expression 的数据类型必须相同,或者必须是隐性转换。

WHEN Boolean_expression

使用 CASE 搜索格式时所计算的布尔表达式。Boolean_expression 是任意有效的布尔表达式。

结果类型

从 result_expressions 和可选 else_result_expression 的类型集合中返回最高的优先规则类型。有关

更多信息,请参见数据类型的优先顺序。

结果值

简单 CASE 函数:

计算 input_expression,然后按指定顺序对每个 WHEN 子句的 input_expression = when_expression

进行计算。

返回第一个取值为 TRUE 的 (input_expression = when_expression) 的 result_expression。

如果没有取值为 TRUE 的 input_expression = when_expression,则当指定 ELSE 子句时 SQL Server

将返回 else_result_expression;若没有指定 ELSE 子句,则返回 NULL 值。

CASE 搜索函数:

按指定顺序为每个 WHEN 子句的 Boolean_expression 求值。

返回第一个取值为 TRUE 的 Boolean_expression 的 result_expression。

如果没有取值为 TRUE 的 Boolean_expression,则当指定 ELSE 子句时 SQL Server 将返回

else_result_expression;若没有指定 ELSE 子句,则返回 NULL 值。

示例

A. 使用带有简单 CASE 函数的 SELECT 语句

在 SELECT 语句中,简单 CASE 函数仅检查是否相等,而不进行其它比较。下面的示例使用 CASE 函数更改

图书分类显示,以使其更易于理解。

USE pubs

GO

SELECT   Category =

CASE type

WHEN ’popular_comp’ THEN ’Popular Computing’

WHEN ’mod_cook’ THEN ’Modern Cooking’

WHEN ’business’ THEN ’Business’

WHEN ’psychology’ THEN ’Psychology’

WHEN ’trad_cook’ THEN ’Traditional Cooking’

ELSE ’Not yet categorized’

END,

CAST(title AS varchar(25)) AS ’Shortened Title’,

price AS Price

FROM titles

WHERE price IS NOT NULL

ORDER BY type, price

COMPUTE AVG(price) BY type

GO

下面是结果集:

Category            Shortened Title           Price

------------------- ------------------------- --------------------------

Business            You Can Combat Computer S 2.99

Business            Cooking with Computers: S 11.95

Business            The Busy Executive’s Data 19.99

Business            Straight Talk About Compu 19.99

avg

==========================

13.73

Category            Shortened Title           Price

------------------- ------------------------- --------------------------

Modern Cooking      The Gourmet Microwave     2.99

Modern Cooking      Silicon Valley Gastronomi 19.99

avg

==========================

11.49

Category            Shortened Title           Price

------------------- ------------------------- --------------------------

Popular Computing   Secrets of Silicon Valley 20.00

Popular Computing   But Is It User Friendly?  22.95

avg

==========================

21.48

Category            Shortened Title           Price

------------------- ------------------------- --------------------------

Psychology          Life Without Fear         7.00

Psychology          Emotional Security: A New 7.99

Psychology          Is Anger the Enemy?       10.95

Psychology          Prolonged Data Deprivatio 19.99

Psychology          Computer Phobic AND Non-P 21.59

avg

==========================

13.50

Category            Shortened Title           Price

------------------- ------------------------- --------------------------

Traditional Cooking Fifty Years in Buckingham 11.95

Traditional Cooking Sushi, Anyone?            14.99

Traditional Cooking Onions, Leeks, and Garlic 20.95

avg

==========================

15.96

(21 row(s) affected)

B. 使用带有简单 CASE 函数和 CASE 搜索函数的 SELECT 语句

在 SELECT 语句中,CASE 搜索函数允许根据比较值在结果集内对值进行替换。下面的示例根据图书的价格范

围将价格(money 列)显示为文本注释。

USE pubs

GO

SELECT    ’Price Category’ =

CASE

WHEN price IS NULL THEN ’Not yet priced’

WHEN price < 10 THEN ’Very Reasonable Title’

WHEN price >= 10 and price < 20 THEN ’Coffee Table Title’

ELSE ’Expensive book!’

END,

CAST(title AS varchar(20)) AS ’Shortened Title’

FROM titles

ORDER BY price

GO

下面是结果集:

Price Category        Shortened Title

--------------------- --------------------

Not yet priced        Net Etiquette

Not yet priced        The Psychology of Co

Very Reasonable Title The Gourmet Microwav

Very Reasonable Title You Can Combat Compu

Very Reasonable Title Life Without Fear

Very Reasonable Title Emotional Security:

Coffee Table Title    Is Anger the Enemy?

Coffee Table Title    Cooking with Compute

Coffee Table Title    Fifty Years in Bucki

Coffee Table Title    Sushi, Anyone?

Coffee Table Title    Prolonged Data Depri

Coffee Table Title    Silicon Valley Gastr

Coffee Table Title    Straight Talk About

Coffee Table Title    The Busy Executive’s

Expensive book!       Secrets of Silicon V

Expensive book!       Onions, Leeks, and G

Expensive book!       Computer Phobic And

Expensive book!       But Is It User Frien

(18 row(s) affected)

C. 使用带有 SUBSTRING 和 SELECT 的 CASE 函数

下面的示例使用 CASE 和 THEN 生成一个有关作者、图书标识号和每个作者所著图书类型的列表。

USE pubs

SELECT SUBSTRING((RTRIM(a.au_fname) + ’ ’+

RTRIM(a.au_lname) + ’ ’), 1, 25) AS Name, a.au_id, ta.title_id,

Type =

CASE

WHEN SUBSTRING(ta.title_id, 1, 2) = ’BU’ THEN ’Business’

WHEN SUBSTRING(ta.title_id, 1, 2) = ’MC’ THEN ’Modern Cooking’

WHEN SUBSTRING(ta.title_id, 1, 2) = ’PC’ THEN ’Popular Computing’

WHEN SUBSTRING(ta.title_id, 1, 2) = ’PS’ THEN ’Psychology’

WHEN SUBSTRING(ta.title_id, 1, 2) = ’TC’ THEN ’Traditional Cooking’

END

FROM titleauthor ta JOIN authors a ON ta.au_id = a.au_id

下面是结果集:

Name                      au_id       title_id Type

------------------------- ----------- -------- -------------------

Johnson White             172-32-1176 PS3333   Psychology

Marjorie Green            213-46-8915 BU1032   Business

Marjorie Green            213-46-8915 BU2075   Business

Cheryl Carson             238-95-7766 PC1035   Popular Computing

Michael O’Leary           267-41-2394 BU1111   Business

Michael O’Leary           267-41-2394 TC7777   Traditional Cooking

Dean Straight             274-80-9391 BU7832   Business

Abraham Bennet            409-56-7008 BU1032   Business

Ann Dull                  427-17-2319 PC8888   Popular Computing

Burt Gringlesby           472-27-2349 TC7777   Traditional Cooking

Charlene Locksley         486-29-1786 PC9999   Popular Computing

Charlene Locksley         486-29-1786 PS7777   Psychology

Reginald Blotchet-Halls   648-92-1872 TC4203   Traditional Cooking

Akiko Yokomoto            672-71-3249 TC7777   Traditional Cooking

Innes del Castillo        712-45-1867 MC2222   Modern Cooking

Michel DeFrance           722-51-5454 MC3021   Modern Cooking

Stearns MacFeather        724-80-9391 BU1111   Business

Stearns MacFeather        724-80-9391 PS1372   Psychology

Livia Karsen              756-30-7391 PS1372   Psychology

Sylvia Panteley           807-91-6654 TC3218   Traditional Cooking

Sheryl Hunter             846-92-7186 PC8888   Popular Computing

Anne Ringer               899-46-2035 MC3021   Modern Cooking

Anne Ringer               899-46-2035 PS2091   Psychology

Albert Ringer             998-72-3567 PS2091   Psychology

Albert Ringer             998-72-3567 PS2106   Psychology

(25 row(s) affected)

3.COALESCE

返回其参数中第一个非空表达式。

语法

COALESCE ( expression [ ,...n ] )

参数

expression

任何类型的表达式。

n

表示可以指定多个表达式的占位符。所有表达式必须是相同类型,或者可以隐性转换为相同的类型。

返回类型

将相同的值作为 expression 返回。

注释

如果所有自变量均为 NULL,则 COALESCE 返回 NULL 值。

COALESCE(expression1,...n) 与此 CASE 函数等价:

CASE

WHEN (expression1 IS NOT NULL) THEN expression1

...

WHEN (expressionN IS NOT NULL) THEN expressionN

ELSE NULL

示例

在下面的示例中,显示包含三列有关某个雇员每年工资收入信息的 wages 表:hourly_wage、salary 和

commission。但是,每个雇员只能接受一种付款方式。若要确定支付给所有雇员的工资总额,请使用

COALESCE 函数接受在 hourly_wage、salary 和 commission 中找到的非空值。

SET NOCOUNT ON

GO

USE master

IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_NAME = ’wages’)

DROP TABLE wages

GO

CREATE TABLE wages

(

emp_id      tinyint    identity,

hourly_wage   decimal   NULL,

salary      decimal    NULL,

commission   decimal   NULL,

num_sales   tinyint   NULL

)

GO

INSERT wages VALUES(10.00, NULL, NULL, NULL)

INSERT wages VALUES(20.00, NULL, NULL, NULL)

INSERT wages VALUES(30.00, NULL, NULL, NULL)

INSERT wages VALUES(40.00, NULL, NULL, NULL)

INSERT wages VALUES(NULL, 10000.00, NULL, NULL)

INSERT wages VALUES(NULL, 20000.00, NULL, NULL)

INSERT wages VALUES(NULL, 30000.00, NULL, NULL)

INSERT wages VALUES(NULL, 40000.00, NULL, NULL)

INSERT wages VALUES(NULL, NULL, 15000, 3)

INSERT wages VALUES(NULL, NULL, 25000, 2)

INSERT wages VALUES(NULL, NULL, 20000, 6)

INSERT wages VALUES(NULL, NULL, 14000, 4)

GO

SET NOCOUNT OFF

GO

SELECT CAST(COALESCE(hourly_wage * 40 * 52,

salary,

commission * num_sales) AS money) AS ’Total Salary’

FROM wages

GO

下面是结果集:

Total Salary

------------

20800.0000

41600.0000

62400.0000

83200.0000

10000.0000

20000.0000

30000.0000

40000.0000

45000.0000

50000.0000

120000.0000

56000.0000

(12 row(s) affected)

4.COLLATIONPROPERTY

返回给定排序规则的属性。

语法

COLLATIONPROPERTY( collation_name, property )

参数

collation_name

是排序规则的名称。collation_name 的数据类型为 nvarchar(128),且无默认值。

property

是排序规则的属性。property 的数据类型为 varchar(128),并且可以为下表中的任何值:

属性名称 描述

CodePage 排序规则的 nonUnicode 代码页。

LCID 排序规则的 Windows LCID。

为 SQL 排序规则返回 NULL。

ComparisonStyle 排序规则的 Windows 比较风格。

为二进制或 SQL 排序规则返回 NULL。

返回类型

sql_variant

示例

SELECT COLLATIONPROPERTY(’Traditional_Spanish_CS_AS_KS_WS’, ’CodePage’)

结果集

1252

5.CURRENT_TIMESTAMP

返回当前的日期和时间。此函数等价于 GETDATE()。

语法

CURRENT_TIMESTAMP

返回类型

datetime

示例

A. 使用 CURRENT_TIMESTAMP 返回当前的日期和时间

下面的示例返回 CURRENT_TIMESTAMP 的值和一个文本描述。

SELECT ’The current time is: ’+ CONVERT(char(30), CURRENT_TIMESTAMP)

下面是结果集:

---------------------------------------------------

The current time is: Feb 24 1998  3:45PM

(1 row(s) affected)

B. 将 CURRENT_TIMESTAMP 用作 DEFAULT 约束

下面的示例创建一个表,该表针对销售行的 sales_date 列将 CURRENT_TIMESTAMP 用作 DEFAULT 约束。

USE pubs

GO

CREATE TABLE sales2

(

sales_id int IDENTITY(10000, 1) NOT NULL,

cust_id  int NOT NULL,

sales_date datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,

sales_amt money NOT NULL,

delivery_date datetime NOT NULL DEFAULT DATEADD(dd, 10, GETDATE())

)

GO

INSERT sales2 (cust_id, sales_amt)

VALUES (20000, 550)

下面的查询从 sales2 表中选择所有信息。

USE pubs

GO

SELECT *

FROM sales2

GO

下面是结果集:

sales_id    cust_id    sales_date          sales_amt delivery_date

----------- ---------- ------------------- --------- -------------------

10000       20000      Mar 4 1998 10:06AM  550.00    Mar 14 1998 10:06AM

(1 row(s) affected)

6.CURRENT_USER

返回当前的用户。此函数等价于 USER_NAME()。

语法

CURRENT_USER

返回类型

sysname

示例

A. 使用 CURRENT_USER 返回当前的用户名

下面的示例将一个变量声明为 char,并将 CURRENT_USER 的当前值指派给它,然后返回该变量,返回时还带

有一个文本描述。

SELECT ’The current user is: ’+ convert(char(30), CURRENT_USER)

下面是结果集:

---------------------------------------------------

The current user is: dbo

(1 row(s) affected)

B. 将 CURRENT_USER 用作 DEFAULT 约束

下面的示例创建一个表,该表针对销售行的 order_person 列将 CURRENT_USER 用作 DEFAULT 约束。

USE pubs

IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_NAME = ’orders2’)

DROP TABLE orders2

GO

SET NOCOUNT ON

CREATE TABLE orders2

(

order_id int IDENTITY(1000, 1) NOT NULL,

cust_id  int NOT NULL,

order_date datetime NOT NULL DEFAULT GETDATE(),

order_amt money NOT NULL,

order_person char(30) NOT NULL DEFAULT CURRENT_USER

)

GO

INSERT orders2 (cust_id, order_amt)

VALUES (5105, 577.95)

GO

SET NOCOUNT OFF

下面的查询从 orders2 表中选择所有信息。

SELECT *

FROM orders2

下面是结果集:

order_id    cust_id     order_date             order_amt

order_person

----------- ----------- ------------------- ------------- --------------

1000        5105        Mar 4 1998 10:13AM      577.95

dbo

(1 row(s) affected)

7.DATALENGTH

返回任何表达式所占用的字节数。

语法

DATALENGTH ( expression )

参数

expression

任何类型的表达式。

返回类型

int

注释

DATALENGTH 对 varchar、varbinary、text、image、nvarchar 和 ntext 数据类型特别有用,因为这些

数据类型可以存储可变长度数据。

NULL 的 DATALENGTH 的结果是 NULL。

说明  兼容级别可能影响返回值。有关兼容级别的更多信息,请参见 sp_dbcmptlevel。

示例

此示例查找 publishers 表中 pub_name 列的长度。

USE pubs

GO

SELECT length = DATALENGTH(pub_name), pub_name

FROM publishers

ORDER BY pub_name

GO

下面是结果集:

length      pub_name

----------- ----------------------------------------

20          Algodata Infosystems

16          Binnet & Hardley

21          Five Lakes Publishing

5           GGG&G

18          Lucerne Publishing

14          New Moon Books

17          Ramona Publishers

14          Scootney Books

(8 row(s) affected)

8.@@ERROR

返回最后执行的 Transact-SQL 语句的错误代码。

语法

@@ERROR

返回类型

integer

注释

当 Microsoft? SQL Server? 完成 Transact-SQL 语句的执行时,如果语句执行成功,则 @@ERROR 设置

为 0。若出现一个错误,则返回一条错误信息。@@ERROR 返回此错误信息代码,直到另一条 Transact-SQL

语句被执行。您可以在 sysmessages 系统表中查看与 @@ERROR 错误代码相关的文本信息。

由于 @@ERROR 在每一条语句执行后被清除并且重置,应在语句验证后立即检查它,或将其保存到一个局部变

量中以备事后查看。

示例

A.用 @@ERROR 检测一个特定错误

下面的示例用 @@ERROR 在一个 UPDATE 语句中检测限制检查冲突(错误 #547)。

USE pubs

GO

UPDATE authors SET au_id = ’172 32 1176’

WHERE au_id = "172-32-1176"

IF @@ERROR = 547

print "A check constraint violation occurred"

B.用 @@ERROR 有条件地退出一个过程

在此示例中,IF...ELSE 语句在存储过程中的 INSERT 语句后检测 @@ERROR。@@ERROR 变量的值将决定传给

调用程序的返回值,以指示此过程的成功与失败。

USE pubs

GO

-- Create the procedure.

CREATE PROCEDURE add_author

@au_id varchar(11),@au_lname varchar(40),

@au_fname varchar(20),@phone char(12),

@address varchar(40) = NULL,@city varchar(20) = NULL,

@state char(2) = NULL,@zip char(5) = NULL,

@contract bit = NULL

AS

-- Execute the INSERT statement.

INSERT INTO authors

(au_id,  au_lname, au_fname, phone, address,

city, state, zip, contract) values

(@au_id,@au_lname,@au_fname,@phone,@address,

@city,@state,@zip,@contract)

-- Test the error value.

IF @@ERROR <> 0

BEGIN

-- Return 99 to the calling program to indicate failure.

PRINT "An error occurred loading the new author information"

RETURN(99)

END

ELSE

BEGIN

-- Return 0 to the calling program to indicate success.

PRINT "The new author information has been loaded"

RETURN(0)

END

GO

C.用 @@ERROR 检测几条语句的成功

下面的示例取决于 INSERT 和 DELETE 语句的成功操作。局部变量在两条语句后均被设置为 @@ERROR 的值,

并且用于此操作的共享错误处理例程中。

USE pubs

GO

DECLARE @del_error int, @ins_error int

-- Start a transaction.

BEGIN TRAN

-- Execute the DELETE statement.

DELETE authors

WHERE au_id = ’409-56-7088’

-- Set a variable to the error value for

-- the DELETE statement.

SELECT @del_error = @@ERROR

-- Execute the INSERT statement.

INSERT authors

VALUES(’409-56-7008’, ’Bennet’, ’Abraham’, ’415 658-9932’,

’6223 Bateman St.’, ’Berkeley’, ’CA’, ’94705’, 1)

-- Set a variable to the error value for

-- the INSERT statement.

SELECT @ins_error = @@ERROR

-- Test the error values.

IF @del_error = 0 AND @ins_error = 0

BEGIN

-- Success. Commit the transaction.

PRINT "The author information has been replaced"

COMMIT TRAN

END

ELSE

BEGIN

-- An error occurred. Indicate which operation(s) failed

-- and roll back the transaction.

IF @del_error <> 0

PRINT "An error occurred during execution of the DELETE

statement."

IF @ins_error <> 0

PRINT "An error occurred during execution of the INSERT

statement."

ROLLBACK TRAN

END

GO

D. 与 @@ROWCOUNT 一同使用 @@ERROR

下面的示例用 @@ERROR 和 @@ROWCOUNT 验证一条 UPDATE 语句的操作。为任何可能出现的错误而检验

@@ERROR 的值,而用 @@ROWCOUNT 保证更新已成功应用于表中的某行。

USE pubs

GO

CREATE PROCEDURE change_publisher

@title_id tid,

@new_pub_id char(4)

AS

-- Declare variables used in error checking.

DECLARE @error_var int, @rowcount_var int

-- Execute the UPDATE statement.

UPDATE titles SET pub_id = @new_pub_id

WHERE title_id = @title_id

-- Save the @@ERROR and @@ROWCOUNT values in local

-- variables before they are cleared.

SELECT @error_var = @@ERROR, @rowcount_var = @@ROWCOUNT

-- Check for errors. If an invalid @new_pub_id was specified

-- the UPDATE statement returns a foreign-key violation error #547.

IF @error_var <> 0

BEGIN

IF @error_var = 547

BEGIN

PRINT "ERROR: Invalid ID specified for new publisher"

RETURN(1)

END

ELSE

BEGIN

PRINT "ERROR: Unhandled error occurred"

RETURN(2)

END

END

-- Check the rowcount. @rowcount_var is set to 0

-- if an invalid @title_id was specified.

IF @rowcount_var = 0

BEGIN

PRINT "Warning: The title_id specified is not valid"

RETURN(1)

END

ELSE

BEGIN

PRINT "The book has been updated with the new publisher"

RETURN(0)

END

GO

9.fn_helpcollations

返回 Microsoft? SQL Server? 2000 支持的所有排序规则的列表。

语法

fn_helpcollations ()

返回表

fn_helpcollations 返回下列信息。

列名 数据类型 描述

Name sysname 标准排序规则名称

Description nvarchar(1000) 对排序规则的描述

10.fn_servershareddrives

返回由群集服务器使用的共享驱动器名称。

语法

fn_servershareddrives()

返回表

如果当前服务器实例不是群集服务器,则 fn_servershareddrives 返回空行集。

如果当前服务器是群集服务器,则 fn_servershareddrives 返回下列信息:

名称 数据类型 描述

DriveName nchar(1) 共享驱动器的名称

注释

fn_servershareddrives 返回该群集服务器使用的共享驱动器的列表。这些共享驱动器与 SQL Server 资源

属于同一群集组。此外,SQL Server 资源依赖于这些驱动器。

该函数在识别用户可用的驱动器时十分有用。

示例

以下是在群集服务器实例上的查询。

SELECT *

FROM ::fn_servershareddrives()

下面是结果集:

DriveName

--------

m

n

11.fn_virtualfilestats

返回对数据库文件(包括日志文件)的 I/O 统计。

语法

fn_virtualfilestats ( [@DatabaseID=] database_id

, [ @FileID = ] file_id )

参数

[@DatabaseID=] database_id

数据库的 ID,database_id 的数据类型为 int,没有默认设置。

[ @FileID = ] file_id

文件的 ID,file_id 的数据类型为 int,没有默认设置。

返回表

Column Name 数据类型 描述

DbId smallint 数据库 ID

FileId smallint 文件 ID

TimeStamp int 提取数据的时间

NumberReads bigint 在文件上发出的读取次数

NumberWrites bigint 在文件上写入的次数

BytesRead bigint 在文件上发出的读取字节数

BytesWritten bigint 在文件上写入的字节数

IoStallMS bigint 用户等待在文件上完成 I/O 活动的总计时间(以毫秒为单位)

注释

fn_virtualfilestats 是系统表值函数,提供统计信息,如在文件上操作的 I/O 活动的总数。该函数有助于

跟踪用户必须等待以读取或写入文件的时间长度。该函数还有助于识别出遇到大量 I/O 活动的文件。

示例

SELECT *

FROM :: fn_virtualfilestats(1, 1)

12.FORMATMESSAGE

从 sysmessages 现有的消息构造消息。FORMATMESSAGE 与 RAISERROR 语句的功能相似;但 RAISERROR 立

即输出消息而 FORMATMESSAGE 返回编辑后的信息供进一步处理。

语法

FORMATMESSAGE ( msg_number , param_value [ ,...n ] )

参数

msg_number

存储于 sysmessages 的消息的 ID。如果消息在 sysmessages 中不存在,则返回 NULL。

param_value

消息中使用的一个或多个参数值。值的顺序必须与占位符变量在消息中出现的次序相同。值的最大数目为

20。

返回类型

nvarchar

注释

与 RAISERROR 语句相像,FORMATMESSAGE 用所提供的参数值替换消息中的占位符变量来编辑消息。有关错误

信息中允许使用的占位符和编辑进程的更多信息,请参见 RAISERROR。

FORMATMESSAGE 查找用户当前语言的消息。如果消息没有本地化版本,则使用美国英语版本。

对于本地化的消息,所提供的参数值必须与美国英语版本中的参数占位符相对应。也就是说,本地化版本的参

数 1 必须对应于美国英语版本的参数 1,参数 2 必须对应于参数 2,依此类推。

示例

此示例使用假定的存储于 sysmessages 中的 50001 号消息"The number of rows in %s is %1d."(%s

的行数为 %1d。)。FORMATMESSAGE 用值 Table1 和 5 替换参数占位符。结果字符串"The number of

rows in Table1 is 5."存储于局部变量 @var1。

DECLARE @var1 VARCHAR(100)

SELECT @var1 = FORMATMESSAGE(50001, ’Table1’, 5)

13.GETANSINULL

返回会话的数据库的默认为空性。

语法

GETANSINULL ( [ ’database’ ] )

参数

’database’

是要返回为空性信息的数据库名。database 是 char 类型或 nchar 类型。若 database 是 char 类型,则

隐式转换为 nchar 类型。

返回类型

int

注释

当给定数据库为空性允许空值并且列或数据类型为空性没有显式定义,GETANSINULL 返回 1。这是 ANSI

NULL 的默认值。

若要激活 ANSI NULL 默认设置行为,必须设置下列条件之一:

sp_dboption ’database_name’, ’ANSI null default’, true

SET ANSI_NULL_DFLT_ON ON

SET ANSI_NULL_DFLT_OFF OFF

示例

下面的示例检查 pubs 数据库的默认为空性。

USE pubs

GO

SELECT GETANSINULL(’pubs’)

GO

下面是结果集:

------

1

(1 row(s) affected)

14.HOST_ID

返回工作站标识号。

语法

HOST_ID ( )

返回类型

char(8)

注释

当该参数对系统函数可选时,则系统采用当前数据库、主机、服务器用户或数据库用户。内置函数后面必须跟

圆括号。

系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用。

示例

下面的示例创建一个表,该表在 DEFAULT 定义中使用 HOST_ID() 来记录那些向记录订单的表中插入行的计

算机终端 ID。

CREATE TABLE Orders

(OrderID     INT       PRIMARY KEY,

CustomerID  NCHAR(5)  REFERENCES Customers(CustomerID),

TerminalID  CHAR(8)   NOT NULL DEFAULT HOST_ID(),

OrderDate   DATETIME  NOT NULL,

ShipDate    DATETIME  NULL,

ShipperID   INT       NULL REFERENCES Shippers(ShipperID))

GO

15.HOST_NAME

返回工作站名称。

语法

HOST_NAME ( )

返回类型

nchar

注释

当该参数对系统函数可选时,则系统采用当前数据库、主机、服务器用户或数据库用户。内置函数后面必须跟

圆括号。

系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用。

示例

下面的示例创建一个表,该表在 DEFAULT 定义中使用 HOST_NAME() 来记录那些向记录订单的表中插入行的

计算机工作站名称。

CREATE TABLE Orders

(OrderID     INT        PRIMARY KEY,

CustomerID  NCHAR(5)   REFERENCES Customers(CustomerID),

Workstation NCHAR(30)  NOT NULL DEFAULT HOST_NAME(),

OrderDate   DATETIME   NOT NULL,

ShipDate    DATETIME   NULL,

ShipperID   INT        NULL REFERENCES Shippers(ShipperID))

16.IDENT_CURRENT

返回为任何会话和任何作用域中的指定表最后生成的标识值。

语法

IDENT_CURRENT(’table_name’)

参数

table_name

是将要返回其标识值的表的名称。table_name 的数据类型为 varchar,没有默认值。

返回类型

sql_variant

注释

IDENT_CURRENT 类似于 Microsoft? SQL Server? 2000 标识函数 SCOPE_IDENTITY 和 @@IDENTITY。这

三个函数都返回最后生成的标识值。但是,它们在定义"最后"的作用域和会话上不同。

IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。

@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。

SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。

示例

下面的示例说明由 IDENT_CURRENT、@@IDENTITY 和 SCOPE_IDENTITY 返回的不同的标识值。

USE pubs

DROP TABLE t6

DROP TABLE t7

GO

CREATE TABLE t6(id int IDENTITY)

CREATE TABLE t7(id int IDENTITY(100,1))

GO

CREATE TRIGGER t6ins ON t6 FOR INSERT

AS

BEGIN

INSERT t7 DEFAULT VALUES

END

GO

--end of trigger definition

SELECT   * FROM t6

--id is empty.

SELECT   * FROM t7

--id is empty.

--Do the following in Session 1

INSERT t6 DEFAULT VALUES

SELECT @@IDENTITY

/*Returns the value 100, which was inserted by the trigger.*/

SELECT SCOPE_IDENTITY()

/* Returns the value 1, which was inserted by the

INSERT stmt 2 statements before this query.*/

SELECT IDENT_CURRENT(’t7’)

/* Returns value inserted into t7, i.e. in the trigger.*/

SELECT IDENT_CURRENT(’t6’)

/* Returns value inserted into t6, which was the INSERT statement 4 stmts before this

query.*/

-- Do the following in Session 2

SELECT @@IDENTITY

/* Returns NULL since there has been no INSERT action

so far in this session.*/

SELECT SCOPE_IDENTITY()

/* Returns NULL since there has been no INSERT action

so far in this scope in this session.*/

SELECT IDENT_CURRENT(’t7’)

/* Returns the last value inserted into t7.*/

17.IDENT_INCR

返回增量值(返回形式为 numeric(@@MAXPRECISION,0)),该值是在带有标识列的表或视图中创建标识列时

指定的。

语法

IDENT_INCR ( ’table_or_view’ )

参数

table_or_view

一个表达式,用来指定表或视图以检查有效的标识增量值。table_or_view 可以是带有引号的字符串常量,

也可以是变量、函数或列名。table_or_view 的数据类型为 char、nchar、varchar 或 nvarchar。

返回类型

数字

示例

下面的示例为 pubs 数据库中的 jobs 表返回 1,这是因为 jobs 表中包含带有增量值 1 的标识列。

USE pubs

SELECT TABLE_NAME, IDENT_INCR(TABLE_NAME) AS IDENT_INCR

FROM INFORMATION_SCHEMA.TABLES

WHERE IDENT_INCR(TABLE_NAME) IS NOT NULL

下面是结果集:

TABLE_NAME                                                  IDENT_INCR

------------------------------------------------------------ -----------

jobs                                                         1

(1 row(s) affected)

18.IDENT_SEED

返回种子值(返回形式为 numeric(@@MAXPRECISION,0)),该值是在带有标识列的表或视图中创建标识列时

指定的。

语法

IDENT_SEED ( ’table_or_view’ )

参数

table_or_view

一个表达式,指定表或视图以检查有效的标识种子值。table_or_view 可以是带有引号的字符串常量,也可

以是变量、函数或列名。table_or_view 的数据类型为 char、nchar、varchar 或 nvarchar。

返回类型

数字

示例

下面的示例为 pubs 数据库中的 jobs 表返回 1,这是因为 jobs 表中包含带有种子值 1 的标识列。

USE pubs

SELECT TABLE_NAME, IDENT_SEED(TABLE_NAME) AS IDENT_SEED

FROM INFORMATION_SCHEMA.TABLES

WHERE IDENT_SEED(TABLE_NAME) IS NOT NULL

下面是结果集:

TABLE_NAME                                                   IDENT_SEED

------------------------------------------------------------ -----------

jobs                                                         1

(1 row(s) affected)

19.@@IDENTITY

返回最后插入的标识值。

语法

@@IDENTITY

返回类型

numeric

注释

在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。

若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,

@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语

句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失

败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。

在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT

函数类似。

@@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,

SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回任何会话和任何作用域

中为特定表生成的标识值。有关更多信息,请参见 IDENT_CURRENT。

示例

下面的示例向带有标识列的表中插入一行,并用 @@IDENTITY 显示在新行中使用的标识值。

INSERT INTO jobs (job_desc,min_lvl,max_lvl)

VALUES (’Accountant’,12,125)

SELECT @@IDENTITY AS ’Identity’

20.IDENTITY(函数)

只用在带有 INTO table 子句的 SELECT 语句中,以将标识列插入到新表中。

尽管类似,但是 IDENTITY 函数不是与 CREATE TABLE 和 ALTER TABLE 一起使用的 IDENTITY 属性。

语法

IDENTITY ( data_type [ , seed , increment ] ) AS column_name

参数

data_type

标识列的数据类型。标识列的有效数据类型可以是任何整数数据类型分类的数据类型(bit 数据类型除外),

也可以是 decimal 数据类型。

seed

要指派给表中第一行的值。给每一个后续行指派下一个标识值,该值等于上一个 IDENTITY 值加上

increment 值。如果既没有指定 seed,也没有指定 increment,那么它们都默认为 1。

increment

用来添加到 seed 值以获得表中连续行的增量。

column_name

将插入到新表中的列的名称。

返回类型

返回与 data_type 相同的类型。

注释

因为该函数在表中创建一个列,所以必须用下列方式中的一种在选择列表中指定该列的名称:

--(1)

SELECT IDENTITY(int, 1,1) AS ID_Num

INTO NewTable

FROM OldTable

--(2)

SELECT ID_Num = IDENTITY(int, 1, 1)

INTO NewTable

FROM OldTable

示例

下面的示例将来自 pubs 数据库中 employee 表的所有行都插入到名为 employees 的新表。使用

IDENTITY 函数在 employees 表中从 100 而不是 1 开始编标识号。

USE pubs

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_NAME = ’employees’)

DROP TABLE employees

GO

EXEC sp_dboption ’pubs’, ’select into/bulkcopy’, ’true’

SELECT emp_id AS emp_num,

fname AS first,

minit AS middle,

lname AS last,

IDENTITY(smallint, 100, 1) AS job_num,

job_lvl AS job_level,

pub_id,

hire_date

INTO employees

FROM employee

GO

USE pubs

EXEC sp_dboption ’pubs’, ’select into/bulkcopy’, ’false’

21.ISDATE

确定输入表达式是否为有效的日期。

语法

ISDATE ( expression )

参数

expression

一个表达式,将要验证它是否为一个日期。expression 是任何返回 varchar 数据类型的表达式。

返回类型

int

注释

如果输入表达式是有效的日期,那么 ISDATE 返回 1;否则,返回 0。下表显示一组示例所得到的返回值。

列值 (varchar) ISDATE 返回值

NULL 0

Abc 0

100、-100、100 a 或 100.00 0

.01 0

-100.1234e-123 0

.231e90 0

$100.12345、- $100.12345 或 $-1000.123 0

as100 或 1a00 0

1995-10-1、1/20/95、1995-10-1 12:00pm、Feb 7 1995 11:00pm、1995-10-1 或者 1/23/95 1

13/43/3425 或 1995-10-1a 0

$1000、$100 或 $100 a 0

示例

A. 使用 ISDATE 检查变量

下面的示例检查 @datestring 局部变量是否为有效的日期。

DECLARE @datestring varchar(8)

SET @datestring = ’12/21/98’

SELECT ISDATE(@datestring)

下面是结果集:

-----------

1

B. 使用 ISDATE 检查列是否为有效的日期

下面的示例创建 test_dates 表,并且插入两个值。使用 ISDATE 以确定列中的值是否为日期。

USE tempdb

CREATE TABLE test_dates (Col_1 varchar(15), Col_2 datetime)

GO

INSERT INTO test_dates VALUES (’abc’, ’July 13, 1998’)

GO

SELECT ISDATE(Col_1) AS Col_1, ISDATE(Col_2) AS Col_2

FROM test_dates

下面是结果集:

Col_1                     Col_2

-----------------         --------------------

0                         1

22.ISNULL

使用指定的替换值替换 NULL。

语法

ISNULL ( check_expression , replacement_value )

参数

check_expression

将被检查是否为 NULL的表达式。check_expression 可以是任何类型的。

replacement_value

在 check_expression 为 NULL时将返回的表达式。replacement_value 必须与 check_expresssion 具有

相同的类型。

返回类型

返回与 check_expression 相同的类型。

注释

如果 check_expression 不为 NULL,那么返回该表达式的值;否则返回 replacement_value。

示例

A. 将 ISNULL 与 AVG 一起使用

下面的示例查找所有书的平均价格,用值 $10.00 替换 titles 表的 price 列中的所有 NULL 条目。

USE pubs

GO

SELECT AVG(ISNULL(price, $10.00))

FROM titles

GO

下面是结果集:

--------------------------

14.24

(1 row(s) affected)

B. 使用 ISNULL

下面的示例为 titles 表中的所有书选择书名、类型及价格。如果一个书名的价格是 NULL,那么在结果集中

显示的价格为 0.00。

USE pubs

GO

SELECT SUBSTRING(title, 1, 15) AS Title, type AS Type,

ISNULL(price, 0.00) AS Price

FROM titles

GO

下面是结果集:

Title           Type         Price

--------------- ------------ --------------------------

The Busy Execut business     19.99

Cooking with Co business     11.95

You Can Combat  business     2.99

Straight Talk A business     19.99

Silicon Valley  mod_cook     19.99

The Gourmet Mic mod_cook     2.99

The Psychology  UNDECIDED    0.00

But Is It User  popular_comp 22.95

Secrets of Sili popular_comp 20.00

Net Etiquette   popular_comp 0.00

Computer Phobic psychology   21.59

Is Anger the En psychology   10.95

Life Without Fe psychology   7.00

Prolonged Data  psychology   19.99

Emotional Secur psychology   7.99

Onions, Leeks,  trad_cook    20.95

Fifty Years in  trad_cook    11.95

Sushi, Anyone?  trad_cook    14.99

(18 row(s) affected)

23.ISNUMERIC

确定表达式是否为一个有效的数字类型。

语法

ISNUMERIC ( expression )

参数

expression

要计算的表达式。

返回类型

int

注释

当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返

回 0。返回值为 1 确保可以将 expression 转换为上述数字类型中的一种。

示例

A. 使用 ISNUMERIC

下面的示例返回 1,这是因为 zip 列包含有效的数值。

USE pubs

SELECT ISNUMERIC(zip)

FROM authors

GO

B. 使用 ISNUMERIC 和 SUBSTRING

下面的示例对于 titles 表中的所有书名都返回 0,这是因为没有一个书名是有效的数值。

USE pubs

GO

-- Because the title column is all character data, expect a result of 0

-- for the ISNUMERIC function.

SELECT SUBSTRING(title, 1, 15) type, price, ISNUMERIC(title)

FROM titles

GO

下面是结果集:

type            price

--------------- -------------------------- -----------

The Busy Execut 19.99                      0

Cooking with Co 11.95                      0

You Can Combat  2.99                       0

Straight Talk A 19.99                      0

Silicon Valley  19.99                      0

The Gourmet Mic 2.99                       0

The Psychology  (null)                     0

But Is It User  22.95                      0

Secrets of Sili 20.00                      0

Net Etiquette   (null)                     0

Computer Phobic 21.59                      0

Is Anger the En 10.95                      0

Life Without Fe 7.00                       0

Prolonged Data  19.99                      0

Emotional Secur 7.99                       0

Onions, Leeks,  20.95                      0

Fifty Years in  11.95                      0

Sushi, Anyone?  14.99                      0

(18 row(s) affected)

24.NEWID

创建 uniqueidentifier 类型的唯一值。

语法

NEWID ( )

返回类型

uniqueidentifier

示例

A.对变量使用 NEWID 函数

下面的示例使用 NEWID 对声明为 uniqueidentifier 数据类型的变量赋值。在测试该值前,将先打印

uniqueidentifier 数据类型变量的值。

-- Creating a local variable with DECLARE/SET syntax.

DECLARE @myid uniqueidentifier

SET @myid = NEWID()

PRINT ’Value of @myid is: ’+ CONVERT(varchar(255), @myid)

下面是结果集:

Value of @myid is: 6F9619FF-8B86-D011-B42D-00C04FC964FF

说明  对于每台计算机,由 NEWID 返回的值不同。所显示的数字仅起解释说明的作用。

B.在 CREATE TABLE 语句中使用 NEWID

下面的示例创建具有 uniqueidentifier 数据类型的 cust 表,并使用 NEWID 将默认值填充到表中。为

NEWID() 赋默认值时,每个新行和现有行均具有 cust_id 列的唯一值。

-- Creating a table using NEWID for uniqueidentifier data type.

CREATE TABLE cust

(

cust_id uniqueidentifier NOT NULL

DEFAULT newid(),

company varchar(30) NOT NULL,

contact_name varchar(60) NOT NULL,

address varchar(30) NOT NULL,

city varchar(30) NOT NULL,

state_province varchar(10) NULL,

postal_code varchar(10) NOT NULL,

country varchar(20) NOT NULL,

telephone varchar(15) NOT NULL,

fax varchar(15) NULL

)

GO

-- Inserting data into cust table.

INSERT cust

(cust_id, company, contact_name, address, city, state_province,

postal_code, country, telephone, fax)

VALUES

(newid(), ’Wartian Herkku’, ’Pirkko Koskitalo’, ’Torikatu 38’, ’Oulu’, NULL,

’90110’, ’Finland’, ’981-443655’, ’981-443655’)

INSERT cust

(cust_id, company, contact_name, address, city, state_province,

postal_code, country, telephone, fax)

VALUES

(newid(), ’Wellington Importadora’, ’Paula Parente’, ’Rua do Mercado,

12’, ’Resende’, ’SP’,

’08737-363’, ’Brazil’, ’(14) 555-8122’, ’’)

INSERT cust

(cust_id, company, contact_name, address, city, state_province,

postal_code, country, telephone, fax)

VALUES

(newid(), ’Cactus Comidas para Ilevar’, ’Patricio Simpson’, ’Cerrito 333’, ’Buenos

Aires’, NULL,

’1010’, ’Argentina’, ’(1) 135-5555’, ’(1) 135-4892’)

INSERT cust

(cust_id, company, contact_name, address, city, state_province,

postal_code, country, telephone, fax)

VALUES

(newid(), ’Ernst Handel’, ’Roland Mendel’, ’Kirchgasse 6’, ’Graz’, NULL,

’8010’, ’Austria’, ’7675-3425’, ’7675-3426’)

INSERT cust

(cust_id, company, contact_name, address, city, state_province,

postal_code, country, telephone, fax)

VALUES

(newid(), ’Maison Dewey’, ’Catherine Dewey’, ’Rue Joseph-Bens 532’, ’Bruxelles’, NULL,

’B-1180’, ’Belgium’, ’(02) 201 24 67’, ’(02) 201 24 68’)

GO

C. 使用 uniqueidentifier 和变量赋值

下面的示例声明局部变量 @myid 为 uniqueidentifier 数据类型。然后使用 SET 语句为该变量赋值。

DECLARE @myid uniqueidentifier

SET @myid = ’A972C577-DFB0-064E-1189-0154C99310DAAC12’

GO

25.NULLIF

如果两个指定的表达式相等,则返回空值。

语法

NULLIF ( expression , expression )

参数

expression

常量、列名、函数、子查询或算术运算符、按位运算符以及字符串运算符的任意组合。

返回类型

返回类型与第一个 expression 相同。

如果两个表达式不相等,NULLIF 返回第一个 expression 的值。如果相等,NULLIF 返回第一个

expression 类型的空值。

注释

如果两个表达式相等且结果表达式为 NULL,NULLIF 等价于 CASE 的搜索函数。

示例

下面的示例创建 budgets 表,表中显示部门 (dept) 及其当年的预算 (current_year) 以及去年预算

(previous_year)。对于当年预算,那些同去年相比预算没有改变的部门使用 NULL,那些预算还没有确定的

部门使用 0。要只计算那些接收预算的部门的预算平均值,并引用上一年度的预算值(当 current_year 为

0 时,使用 previous_year 值),请组合使用 NULLIF 和 COALESCE 函数。

USE pubs

IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_NAME = ’budgets’)

DROP TABLE budgets

GO

SET NOCOUNT ON

CREATE TABLE budgets

(

dept            tinyint   IDENTITY,

current_year      decimal   NULL,

previous_year   decimal   NULL

)

INSERT budgets VALUES(100000, 150000)

INSERT budgets VALUES(NULL, 300000)

INSERT budgets VALUES(0, 100000)

INSERT budgets VALUES(NULL, 150000)

INSERT budgets VALUES(300000, 250000)

GO

SET NOCOUNT OFF

SELECT AVG(NULLIF(COALESCE(current_year,

previous_year), 0.00)) AS ’Average Budget’

FROM budgets

GO

下面是结果集:

Average Budget

----------------------------------------

212500.000000

(1 row(s) affected)

26.PARSENAME

返回对象名的指定部分。可以检索的对象部分有对象名、所有者名称、数据库名称和服务器名称。

说明  PARSENAME 函数不表明所指定名称的对象是否存在,而只是返回给定对象名的指定部分。

语法

PARSENAME ( ’object_name’ , object_piece )

参数

’object_name’

要检索其指定部分的对象名。object_name 是 sysname 值。本参数是可选的合法对象名。如果该对象名的所

有部分均符合要求,则该名称由以下四部分组成:服务器名称、数据库名称、所有者名称和对象名。

object_piece

要返回的对象部分。object_piece 是 int 值,可以为下列值。

Value 描述

1 对象名

2 所有者名称

3 数据库名称

4 服务器名称

返回类型

nchar

注释

如果符合下列条件之一,则 PARSENAME 返回 NULL 值:

object_name 或 object_piece 为 NULL 值。

发生语法错误。

所请求的对象部分长度为 0,并且是无效的 Microsoft? SQL Server? 标识符。零长度的对象名将导致整个

合法名称无效。

示例

本示例使用 PARSENAME 返回有关 pubs 数据库中 authors 表的信息。

USE pubs

SELECT PARSENAME(’pubs..authors’, 1) AS ’Object Name’

SELECT PARSENAME(’pubs..authors’, 2) AS ’Owner Name’

SELECT PARSENAME(’pubs..authors’, 3) AS ’Database Name’

SELECT PARSENAME(’pubs..authors’, 4) AS ’Server Name’

下面是结果集:

Object Name

------------------------------

authors

(1 row(s) affected)

Owner Name

------------------------------

(null)

(1 row(s) affected)

Database Name

------------------------------

pubs

(1 row(s) affected)

Server Name

------------------------------

(null)

(1 row(s) affected)

27.PERMISSIONS

返回一个包含位图的值,表明当前用户的语句、对象或列权限。

语法

PERMISSIONS ( [ objectid [ , ’column’ ] ] )

参数

objectid

对象的 ID。如果未指定 objectid,则位图值包含当前用户的语法权限;否则,位图包含当前用户在该对象

ID 上的对象权限。指定的对象必须在当前数据库中。将 OBJECT_ID 函数用于对象名以确定 objectid 值。

column

返回其权限信息的列的可选名。该列必须是 objectid 所指定表中的有效列名。

返回类型

int

注释

可使用 PERMISSIONS 确定当前用户是否有执行某个语句所需的权限,或者是否有将某个对象上的权限授予另

一用户所需的权限。

所返回的权限信息是 32 位位图。

低 16 位反映对当前用户的安全帐户所授予的权限,以及应用于当前用户所在的 Microsoft? Windows NT?

组或 Microsoft SQL Server? 角色的权限。例如,当没有指定 objectid 时,将返回值 66(十六进制值

0x42),表示当前用户有执行 CREATE TABLE(十进制值 2)和 BACKUP DATABASE(十进制值 64)语句的权

限。

高 16 位反映当前用户可以授予其他用户的权限。除左移 16 位(与 65536 相乘)之外,高 16 位的解释方

式与下表中所介绍的低 16 位的解释方式完全相同。例如,位 0x8(十进制值 8)说明当指定 objectid 时

的 INSERT 权限。而 0x80000(十进制值 524288)说明 GRANT INSERT 权限的能力,这是因为 524288 =

8 x 65536。由于角色中的成员资格,该用户可能没有执行语句的权限,但仍然能够将该权限授予他人。

下表显示语句权限所使用的位(未指定 objectid)。

位(十进制) 位(十六进制) 语句权限

1 0x1 CREATE DATABASE(仅限于 master 数据库)

2 0x2 CREATE TABLE

4 0x4 CREATE PROCEDURE

8 0x8 CREATE VIEW

16 0x10 CREATE RULE

32 0x20 CREATE DEFAULT

64 0x40 BACKUP DATABASE

128 0x80 BACKUP LOG

256 0x100 保留

下表显示当仅指定 objectid 时,返回的对象权限所使用的位。

位(十进制) 位(十六进制) 语句权限

1 0x1 SELECT ALL

2 0x2 UPDATE ALL

4 0x4 REFERENCES ALL

8 0x8 INSERT

16 0x10 DELETE

32 0x20 EXECUTE(仅限于过程)

4096 0x1000 SELECT ANY(至少一列)

8192 0x2000 UPDATE ANY

16384 0x4000 REFERENCES ANY

下表显示当同时指定 objectid 和 column 时,返回的列级对象权限所使用的位。

位(十进制) 位(十六进制) 语句权限

1 0x1 SELECT

2 0x2 UPDATE

4 0x4 REFERENCES

如果指定的参数为 NULL 值或无效(例如,objectid 或 column 不存在),则返回 NULL 值。没有定义不

适用的权限所使用的位值(例如,表的 EXECUTE 权限、位 0x20)。

使用按位 AND (&) 运算符确定 PERMISSIONS 函数返回的位图中的每个位集。

还可使用 sp_helprotect 系统存储过程返回某位用户在当前数据库中的对象权限列表。

示例

A. 对语句权限使用 PERMISSIONS 函数

本示例确定当前用户是否能够执行 CREATE TABLE 语句。

IF PERMISSIONS()&2=2

CREATE TABLE test_table (col1 INT)

ELSE

PRINT ’ERROR: The current user cannot create a table.’

B. 对对象权限使用 PERMISSIONS 函数

本示例确定当前用户是否能够在 authors 表中插入数据行。

IF PERMISSIONS(OBJECT_ID(’authors’))&8=8

PRINT ’The current user can insert data into authors.’

ELSE

PRINT ’ERROR: The current user cannot insert data into authors.’

C. 对可授予的权限使用 PERMISSIONS 函数

本示例确定当前用户是否能够将 authors 表中的 INSERT 权限授予另一用户。

IF PERMISSIONS(OBJECT_ID(’authors’))&0x80000=0x80000

PRINT ’INSERT on authors is grantable.’

ELSE

PRINT ’You may not GRANT INSERT permissions on authors.’

28.@@ROWCOUNT

返回受上一语句影响的行数。

语法

@@ROWCOUNT

返回类型

integer

注释

任何不返回行的语句将这一变量设置为 0 ,如 IF 语句。

示例

下面的示例执行 UPDATE 语句并用 @@ROWCOUNT 来检测是否有发生更改的行。

UPDATE authors SET au_lname = ’Jones’

WHERE au_id = ’999-888-7777’

IF @@ROWCOUNT = 0

print ’Warning: No rows were updated’

29.ROWCOUNT_BIG

返回受执行的最后一个语句影响的行数。该函数的功能与 @@ROWCOUNT 一样,除非 ROWCOUNT_BIG 的返回类

型是 bigint。

语法

ROWCOUNT_BIG ( )

返回类型

bigint

注释

位于 SELECT 语句之后时,该函数返回由 SELECT 语句返回的行数。

位于 INSERT、UPDATE 或 DELETE 语句之后时,该函数返回受数据修改语句影响的行数。

位于 IF 这类不返回行的语句之后时,该函数返回零 (0)。

30.SCOPE_IDENTITY

返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过

程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的

作用域中。

语法

SCOPE_IDENTITY( )

返回类型

sql_variant

注释

SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 在功能上相似,因为它们都返回插入到 IDENTITY 列中

的值。

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中

的特定表所生成的值。有关更多信息,请参见 IDENT_CURRENT。

SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,

SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。

例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并

在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的

插入。

假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后

返回不同的值。

@@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。

SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个 INSERT。如果

在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。

有关说明,请参见示例。

示例

下列示例将创建两个表 TZ 和 TY,并在 TZ 上创建一个 INSERT 触发器。当将某行插入表 TZ 中时,触发

器 (Ztrig) 将激发并在 TY 中插入一行。

USE tempdb

GO

CREATE TABLE TZ (

Z_id  int IDENTITY(1,1)PRIMARY KEY,

Z_name varchar(20) NOT NULL)

INSERT TZ

VALUES (’Lisa’)

INSERT TZ

VALUES (’Mike’)

INSERT TZ

VALUES (’Carla’)

SELECT * FROM TZ

--Result set: This is how table TZ looks

Z_id   Z_name

-------------

1      Lisa

2      Mike

3      Carla

CREATE TABLE TY (

Y_id  int IDENTITY(100,5)PRIMARY KEY,

Y_name varchar(20) NULL)

INSERT TY (Y_name)

VALUES (’boathouse’)

INSERT TY (Y_name)

VALUES (’rocks’)

INSERT TY (Y_name)

VALUES (’elevator’)

SELECT * FROM TY

--Result set: This is how TY looks:

Y_id  Y_name

---------------

100   boathouse

105   rocks

110   elevator

/*Create the trigger that inserts a row in table TY

when a row is inserted in table TZ*/

CREATE TRIGGER Ztrig

ON TZ

FOR INSERT AS

BEGIN

INSERT TY VALUES (’’)

END

/*FIRE the trigger and find out what identity values you get

with the @@IDENTITY and SCOPE_IDENTITY functions*/

INSERT TZ VALUES (’Rosalie’)

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]

GO

SELECT   @@IDENTITY AS [@@IDENTITY]

GO

--Here is the result set.

SCOPE_IDENTITY

4

/*SCOPE_IDENTITY returned the last identity value in the same scope, which was the insert

on table TZ*/

@@IDENTITY

115

/*@@IDENTITY returned the last identity value inserted to TY by the trigger, which fired

due to an earlier insert on TZ*/

31.SERVERPROPERTY

返回有关服务器实例的属性信息。

语法

SERVERPROPERTY ( propertyname )

参数

propertyname

是包含要返回的服务器属性信息的表达式。Propertyname 可以是下列值中的一个。

属性名称 返回的值

Collation 服务器的默认排序规则名称。

如果输入无效或发生错误,则返回 NULL。

基本数据类型:nvarchar

Edition 安装在服务器上的 Microsoft? SQL Server? 实例版本。

返回:

’Desktop Engine’

’Developer Edition’

’Enterprise Edition’

’Enterprise Evaluation Edition’

’Personal Edition’

’Standard Edition’

基本数据类型:nvarchar(128)

Engine Edition 安装在服务器上的 SQL Server 实例引擎版本。

1 = 个人或 Desktop Engine

2 = 标准

3 = 企业(适用于企业版、企业评估版和开发版)

基本数据类型:int

InstanceName 用户连接到的实例的名称。

如果实例名称是默认实例,或者输入无效或发生错误,则返回 NULL。

基本数据类型:nvarchar

IsClustered 在故障转移群集中配置服务器实例。

1 = 聚集。

0 = 非聚集。

NULL = 输入无效或发生错误。

基本数据类型:int

IsFullTextInstalled 在 SQL Server 的当前实例中安装全文组件。

1 = 已安装全文组件。

0 = 未安装全文组件。

NULL = 输入无效或发生错误。

基本数据类型:int

IsIntegratedSecurityOnly 服务器为集成安全模式。

1 = 集成安全模式。

0 = 非集成安全模式。

NULL = 输入无效或发生错误。

基本数据类型:int

IsSingleUser 服务器为单用户模式。

1 = 单用户。

0 = 非单用户

NULL = 无效输入或错误。

基本数据类型:int

IsSyncWithBackup 数据库为发布数据库或分发数据库,并且在还原时不用中断事务复制。

1 = 真。

0 = 假。

基本数据类型:int

LicenseType SQL Server实例模式。

PER_SEAT = 单机模式

PER_PROCESSOR = 单处理器模式

DISABLED = 禁用许可。

基本数据类型:nvarchar(128)

MachineName 服务器实例在其上运行的 Windows NT 计算机名称。

对于聚集实例,即在 Microsoft Cluster Server 的虚拟服务器上运行的 SQL Server 实例,返回虚拟服务

器的名称。

如果输入无效或发生错误,则返回 NULL。

基本数据类型:nvarchar

NumLicenses 如果是单机模式,则为该 SQL Server 实例的注册客户端许可数。

如果是单处理器模式,则为该 SQL Server 实例的许可处理器数。

如果不是上述模式,则返回 NULL 值。

基本数据类型:int

ProcessID SQL Server 服务的进程 ID。(ProcessID 在标识属于该实例的 sqlservr.exe 方面很有

用。)

如果输入无效或发生错误,则返回 NULL。

基本数据类型:int

ProductVersion SQL Server 实例的版本,格式为"major.minor.build"。

基本数据类型:varchar(128)

ProductLevel SQL Server 实例的版本级别。

返回:

’RTM’ = 发售版。

’SPn’ = 服务包版

’Bn’, = beta 测试版

基本数据类型:nvarchar(128)。

ServerName Windows NT 服务器和与指定的 SQL Server 实例关联的实例信息。

如果输入无效或发生错误,则返回 NULL。

基本数据类型:nvarchar

返回类型

sql_variant

注释

SERVERPROPERTY 函数的 ServerName 属性与 @@SERVERNAME 返回相似的信息。ServerName 属性提供

Windows NT 服务器和实例名称,两者共同构成唯一的服务器实例。@@SERVERNAME 提供当前配置的本地服务

器名称。

如果安装时未更改默认服务器名称,则 ServerName 属性和 @@SERVERNAME 返回相同的信息。通过执行

sp_addserver 和 sp_dropserver 可以配置本地服务器名称。

如果在安装时已将本地服务器名称从默认服务器名称更改成其它名称,则 @@SERVERNAME 返回更改后的新名

称。

示例

该示例在 SELECT 语句中使用 SERVERPROPERTY 函数返回有关当前服务器的信息。如果 Windows NT 服务器

安装了多个 SQL Server 实例,而且客户端需要打开另一个到当前连接所使用的同一实例的连接时,此方案很

有用。

SELECT   CONVERT(char(20), SERVERPROPERTY(’servername’))

32.SESSIONPROPERTY

返回会话的 SET 选项设置。

语法

SESSIONPROPERTY ( option )

参数

option

是该会话的当前选项设置。option 可以是下列值中的一个。

选项 描述

ANSI_NULLS 指定是否对空值上的等号 (=) 和不等号 (<>)应用遵从 SQL-92 标准行为。

1 = ON

0 = OFF

ANSI_PADDING 控制列存储小于定义的列大小的值的方式,以及列存储在字符串和 binary 数据中有尾随空格

的值的方式。

1 = ON

0 = OFF

ANSI_WARNINGS 指定是否对某些情况(包括被零除和算术溢出)生成错误信息或警告应用 SQL-92 标准行

为。

1 = ON

0 = OFF

ARITHABORT 确定在执行查询过程中发生溢出或被零除的错误时是否终止查询。

1 = ON

0 = OFF

CONCAT_NULL_YIELDS_

NULL 控制是将串联结果视为空值还是空字符串值。

1 = ON

0 = OFF

NUMERIC_ROUNDABORT 指定当表达式中的四舍五入导致精度降低时是否生成错误信息和警告。

1 = ON

0 = OFF

QUOTED_IDENTIFIER 指定是否遵从 SQL-92 关于使用引号分隔标识符和文字字符串的规则。

1 = ON

0 = OFF

<任何其它字符串> NULL = 无效的输入

返回类型

sql_variant

注释

通过组合服务器级别、数据库级别和用户指定的选项对 SET 选项进行配置。

示例

下例返回 CONCAT_NULL_YIELDS_NULL 选项的设置。

SELECT   SESSIONPROPERTY (’CONCAT_NULL_YIELDS_NULL’)

33.SESSION_USER

是一个 niladic 函数,允许在未指定默认值时将系统为当前会话的用户名提供的值插入到表中。还允许在查

询、错误信息等中使用用户名。

语法

SESSION_USER

返回类型

nchar

注释

SESSION_USER 可在 CREATE TABLE 或 ALTER TABLE 语句中与 DEFAULT 约束一起使用,或者用作任何标准

函数。

示例

A. 使用 SESSION_USER 返回会话的当前用户名

下例声明一个 char 类型的变量,并将 SESSION_USER 赋为当前值,然后输出该变量并带有文本描述。

DECLARE @session_usr char(30)

SET @session_usr = SESSION_USER

SELECT ’This session’’s current user is: ’+ @session_usr

GO

下面是结果集:

--------------------------------------------------------------

This session’s current user is: dbo

(1 row(s) affected)

B. 将 SESSION_USER 与 DEFAULT 约束一起使用

下例将 SESSION_USER niladic 函数用作 DEFAULT 约束为交货人创建表。

USE pubs

GO

CREATE TABLE deliveries2

(

order_id int IDENTITY(5000, 1) NOT NULL,

cust_id  int NOT NULL,

order_date datetime NOT NULL DEFAULT GETDATE(),

delivery_date datetime NOT NULL DEFAULT DATEADD(dd, 10, GETDATE()),

delivery_person char(30) NOT NULL DEFAULT SESSION_USER

)

GO

INSERT deliveries2 (cust_id)

VALUES (7510)

INSERT deliveries2 (cust_id)

VALUES (7231)

INSERT deliveries2 (cust_id)

VALUES (7028)

INSERT deliveries2 (cust_id)

VALUES (7392)

INSERT deliveries2 (cust_id)

VALUES (7452)

GO

以下查询选择 deliveries2 表中的全部信息。

SELECT order_id AS ’Ord#’, cust_id AS ’Cust#’, order_date,

delivery_date, delivery_person AS ’Delivery’

FROM deliveries2

ORDER BY order_id

GO

下面是结果集:

Ord#  Cust#  order_date          delivery_date        Delivery

----  ------ ------------------  -------------------- ----------------

5000  7510   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo

5001  7231   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo

5002  7028   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo

5003  7392   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo

5004  7452   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo

(5 row(s) affected)

34.STATS_DATE

返回最后一次更新指定索引统计的日期。

语法

STATS_DATE ( table_id , index_id )

参数

table_id

是所用表的 ID。

index_id

是所用索引的 ID。

返回类型

datetime

注释

系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用。

示例

下例返回最后一次更新指定对象统计的日期。

USE master

GO

SELECT ’Index Name’ = i.name,

’Statistics Date’ = STATS_DATE(i.id, i.indid)

FROM sysobjects o, sysindexes i

WHERE o.name = ’employee’ AND o.id = i.id

GO

35.@@TRANCOUNT

返回当前连接的活动事务数。

语法

@@TRANCOUNT

返回类型

integer

注释

BEGIN TRANSACTION 语句使 @@TRANCOUNT 递增 1。ROLLBACK TRANSACTION 将 @@TRANCOUNT 递减为 0,

但 ROLLBACK TRANSACTION savepoint_name 语句并不影响 @@TRANCOUNT 值。COMMIT TRANSACTION 或

COMMIT WORK 将 @@TRANCOUNT 递减 1。

示例

下面的示例用 @@TRANCOUNT 测试应该提交的打开事务。

BEGIN TRANSACTION

UPDATE authors SET au_lname = upper(au_lname)

WHERE au_lname = ’White’

IF @@ROWCOUNT = 2

COMMIT TRAN

IF @@TRANCOUNT > 0

BEGIN

PRINT ’A transaction needs to be rolled back’

ROLLBACK TRAN

END

36.USER_NAME

返回给定标识号的用户数据库用户名。

语法

USER_NAME ( [ id ] )

参数

id

用来返回用户名的标识号。id 的数据类型为 int。

返回类型

nvarchar(256)

注释

当省略 id 时,则假定为当前用户。必须加上圆括号。

示例

A. 使用 USER_NAME

本示例返回用户编号为 13 的用户名。

SELECT USER_NAME(13)

GO

B. 使用不带 ID 的 USER_NAME

本示例在不指定 ID 的情况下查找当前用户的名称。

SELECT user_name()

GO

下面是结果集(对于是 sysadmin 固定服务器角色成员的用户):

------------------------------

dbo

(1 row(s) affected)

C. 在 WHERE 子句中使用 USER_NAME

本示例在 sysusers 中找到一行,该行的名称等于将系统函数 USER_NAME 应用于用户标识号 1 的结果。

SELECT name

FROM sysusers

WHERE name = USER_NAME(1)

GO

下面是结果集:

name

------------------------------

dbo

(1 row(s) affected)

一个很有用的函数

SQL_SERVER函数OBJECTPROPERTY(很详细很有用^_^)

返回当前数据库中对象的有关信息。

语法

OBJECTPROPERTY ( id , property )

参数

id

一个表达式,包含当前数据库中某个对象的 ID。id 的数据类型是 int。

Property

一个表达式,包含针对由 id 指定的对象将要返回的信息。Property 可以是下面这些值中的一个。

说明  除非加以注释,否则,如果 property 是无效的属性名,则返回 NULL。

属性名称             对象类型           描述和返回的值

CnstIsClustKey       约束               带有聚集索引的主键。

1 = True

0 = False

CnstIsColumn         约束               COLUMN 约束。

1 = True

0 = False

CnstIsDeleteCascade  约束               带有 ON DELETE CASCADE 选项的外键约束。

CnstIsDisabled       约束               禁用的约束。

1 = True

0 = False

CnstIsNonclustKey    约束               带有非聚集索引的主键。

1 = True

0 = False

CnstIsNotTrusted     约束               启用约束时未检查现有行,所以可能不是所有行都受约束的控

制。

1 = True

0 = False

CnstIsNotRepl        约束               使用 NOT FOR REPLICATION 关键字定义约束。

CnstIsUpdateCascade  约束               带有 ON UPDATE CASCADE 选项的外键约束。

ExecIsAfterTrigger   触发器             AFTER 触发器。

ExecIsAnsiNullsOn    过程、触发器、视图 创建时的 ANSI_NULLS 设置。

1 = True

0 = False

ExecIsDeleteTrigger  触发器             DELETE 触发器。

1 = True

0 = False

ExecIsFirstDeleteTrigger 触发器         对表执行 DELETE 时触发的第一个触发器。

ExecIsFirstInsertTrigger 触发器         对表执行 INSERT 时触发的第一个触发器。

ExecIsFirstUpdateTrigger 触发器         对表执行 UPDATE 时触发的第一个触发器。

ExecIsInsertTrigger 触发器              INSERT 触发器。

1 = True

0 = False

ExecIsInsteadOfTrigger  触发器          INSTEAD OF 触发器。

ExecIsLastDeleteTrigger 触发器          对表执行 DELETE 时触发的最后一个触发器。

ExecIsLastInsertTrigger 触发器          对表执行 INSERT 时触发的最后一个触发器。

ExecIsLastUpdateTrigger 触发器          对表执行 UPDATE 时触发的最后一个触发器。

ExecIsQuotedIdentOn  过程、触发器、视图 创建时的 QUOTED_IDENTIFIER 设置。

1 = True

0 = False

ExecIsStartup       过程                启动过程。

1 = True

0 = False

ExecIsTriggerDisabled 触发器            禁用的触发器。

1 = True

0 = False

ExecIsUpdateTrigger 触发器              UPDATE 触发器。

1 = True

0 = False

HasAfterTrigger  表,视图 表或视图具有  AFTER 触发器。

1 = True

0 = False

HasInsertTrigger 表,视图 表或视图具有  INSERT 触发器。

1 = True

0 = False

HasInsteadOfTrigger 表、视图 表或视图具有 INSTEAD OF 触发器。

1 = True

0 = False

HasUpdateTrigger 表、视图 表或视图具有 UPDATE 触发器。

1 = True

0 = False

IsAnsiNullsOn 函数、过程、表、触发器、视图 指定表的 ANSI NULLS 选项设置为 ON,表示所有与空值的

比较都取值为 UNKNOWN。只要表存在,该设置就应用于表定义中的所有表达式,包括计算列和约束。

1 = ON

0 = OFF

IsCheckCnst 任何 CHECK 约束。

1 = True

0 = False

IsConstraint 任何 约束。

1 = True

0 = False

IsDefault 任何 绑定的默认值。

1 = True

0 = False

IsDefaultCnst 任何 DEFAULT 约束。

1 = True

0 = False

IsDeterministic 函数、视图 函数的确定性属性。只适用于标量值及表值函数。

1 = 可确定的

0 = 不可确定的

NULL = 不是标量值或表值函数,或者是无效的对象 ID。

IsExecuted 任何 指定执行该对象的方式(视图、过程或触发器)。

1 = True

0 = False

IsExtendedProc      任何        扩展过程。

1 = True

0 = False

IsForeignKey        任何        FOREIGN KEY 约束。

1 = True

0 = False

IsIndexed        表、视图       带有索引的表或视图。

IsIndexable      表、视图       可以创建索引的表或视图。

IsInlineFunction   函数         内嵌函数。

1 = 内嵌函数

0 = 非内嵌函数

NULL = 不是函数,或者是无效的对象 ID。

IsMSShipped      任何         在安装 Microsoft? SQL Server? 2000 的过程中创建的对象。

1 = True

0 = False

IsPrimaryKey     任何          PRIMARY KEY 约束。

1 = True

0 = False

IsProcedure      任何          过程。

1 = True

0 = False

IsQuotedIdentOn  函数、过程、表、触发器、视图 指定表的被引用标识符设置为 ON,表示在表定义所涉及

的所有表达式中,双引号标记分隔标识符。

1 = ON

0 = OFF

IsReplProc       任何          复制过程。

1 = True

0 = False

IsRule           任何          绑定的规则。

1 = True

0 = False

IsScalarFunction 函数         标量值函数。

1 = 标量值

0 = 表值

NULL = 不是函数,或者是无效的对象 ID。

IsSchemaBound    函数,视图   使用 SCHEMABINDING 创建的架构绑定函数或视图。

1 = 架构绑定

0 = 非架构绑定

NULL = 不是函数或视图,或者是无效的对象 ID。

IsSystemTable     表          系统表。

1 = True

0 = False

IsTable           表          表。

1 = True

0 = False

IsTableFunction  函数         表值函数。

1 = 表值

0 = 标量值

NULL = 不是函数,或者是无效的对象 ID。

IsTrigger        任何         触发器。

1 = True

0 = False

IsUniqueCnst     任何         UNIQUE 约束。

1 = True

0 = False

IsUserTable      表          用户定义的表。

1 = True

0 = False

IsView          视图           视图。

1 = True

0 = False

OwnerId          任何          对象的所有者。

Nonnull = 对象所有者的数据库用户 ID。

NULL = 无效的输入。

TableDeleteTrigger 表         表有 DELETE 触发器。

>1 = 给定类型的第一个触发器的 ID。

TableDeleteTriggerCount 表 表具有指定数目的 DELETE 触发器。

>1 = 给定类型的第一个触发器的 ID。

NULL = 无效的输入。

TableFullTextBackgroundUpdateIndexOn 表 表已启用全文后台更新索引。

1 = True

0 = False

TableFulltextCatalogId 表 表的全文索引数据所驻留的全文目录的 ID。

Nonzero = 全文目录 ID,它与标识全文索引表中行的唯一索引相关。

0 = 表不是全文索引的。

TableFullTextChangeTrackingOn 表 表已启用全文更改跟踪。

1 = True

0 = False

TableFulltextKeyColumn 表 与某个单列唯一索引相关联的列 ID,这个单列唯一索引参与全文索引定义。

0 = 表不是全文索引的。

TableFullTextPopulateStatus 表 0 = 不填充

1 = 完全填充

2 = 增量填充

TableHasActiveFulltextIndex 表 表具有一个活动的全文索引。

1 = True

0 = False

TableHasCheckCnst 表 表具有 CHECK 约束。

1 = True

0 = False

TableHasClustIndex 表 表具有聚集索引。

1 = True

0 = False

TableHasDefaultCnst 表 表具有 DEFAULT 约束。

1 = True

0 = False

TableHasDeleteTrigger 表 表具有 DELETE 触发器。

1 = True

0 = False

TableHasForeignKey 表 表具有 FOREIGN KEY 约束。

1 = True

0 = False

TableHasForeignRef 表 表由 FOREIGN KEY 约束引用。

1 = True

0 = False

TableHasIdentity 表 表具有标识列。

1 = True

0 = False

TableHasIndex 表 表具有一个任何类型的索引。

1 = True

0 = False

TableHasInsertTrigger 表 对象具有 Insert 触发器。

1 = True

0 = False

NULL = 无效的输入。

TableHasNonclustIndex 表 表具有非聚集索引。

1 = True

0 = False

TableHasPrimaryKey 表 表具有主键。

1 = True

0 = False

TableHasRowGuidCol 表 对于 uniqueidentifier 列,表具有 ROWGUIDCOL。

1 = True

0 = False

TableHasTextImage 表 表具有 text 列。

1 = True

0 = False

TableHasTimestamp 表 表具有 timestamp 列。

1 = True

0 = False

TableHasUniqueCnst 表 表具有 UNIQUE 约束。

1 = True

0 = False

TableHasUpdateTrigger 表 对象具有 Update 触发器。

1 = True

0 = False

TableInsertTrigger 表 表具有 INSERT 触发器。

>1 = 给定类型的第一个触发器的 ID。

TableInsertTriggerCount 表 表具有指定数目的 INSERT 触发器。

>1 = 给定类型的第一个触发器的 ID。

TableIsFake 表 表不是真实的。根据需要 SQL Server 对其进行内部具体化。

1 = True

0 = False

TableIsPinned 表 驻留表以将其保留在数据高速缓存中。

1 = True

0 = False

TableTextInRowLimit 表 text in row 所允许的最大字节数,如果没有设置 text in row 选项则为 0。

TableUpdateTrigger 表 表具有 UPDATE 触发器。

>1 = 给定类型的第一个触发器的 ID。

TableUpdateTriggerCount 表 表具有指定数目的 UPDATE 触发器。

>1 = 给定类型的第一个触发器的 ID。

返回类型

int

注释

OBJECTPROPERTY(view_id,’IsIndexable’) 可能会耗费大量的计算机资源,这是因为对 IsIndexable 属性

的评估需要分析视图定义、进行规范化以及部分优化。

当至少添加了表的一列以用于索引时,OBJECTPROPERTY(table_id, ’TableHasActiveFulltextIndex’) 将

返回"1"(True)。只要添加了用于索引的第一列后,全文索引即可用于填充。

当除去索引中的最后一列时,索引变成非活动。

如果某些索引键需求条件得不到满足,那么实际创建索引仍然可能会失败。详细信息请参见 CREATE INDEX。

示例

A. 查明 authors 是否为一个表

下面的示例测试 authors 是否为一个表。

IF OBJECTPROPERTY ( object_id(’authors’),’ISTABLE’) = 1

print ’Authors is a table’

ELSE IF OBJECTPROPERTY ( object_id(’authors’),’ISTABLE’) = 0

print ’Authors is not a table’

ELSE IF OBJECTPROPERTY ( object_id(’authors’),’ISTABLE’) IS NULL

print ’ERROR: Authors is not an object’

B. 确定是否在表上启用了 text in row

下面的示例测试是否在 authors 表上启用了 text in row 选项,以便 text、ntext 或 image 数据可以

存储在它的数据行内。

USE pubs

SELECT OBJECTPROPERTY(OBJECT_ID(’authors’),’TableTextInRowLimit’)

结果集显示在表上没有启用 text in row。

-----

0

C. 确定用户定义的标量值函数是否具有确定性

下面的示例测试用户定义的标量值函数 fn_CubicVolume 是否具有确定性,该函数返回小数。

CREATE FUNCTION fn_CubicVolume

-- Input dimensions in centimeters.

(@CubeLength decimal(4,1), @CubeWidth decimal(4,1),

@CubeHeight decimal(4,1) )

RETURNS decimal(12,3) -- Cubic Centimeters.

WITH SCHEMABINDING

AS

BEGIN

RETURN ( @CubeLength * @CubeWidth * @CubeHeight )

END

--Is it a deterministic function?

SELECT OBJECTPROPERTY(OBJECT_ID(’fn_CubicVolume’), ’IsDeterministic’)

结果集显示 fn_CubicVolume 是确定性函数。

-----

1

不是函数

逻辑运算

1.ALL

用标量值与单列集中的值进行比较。

语法

scalar_expression { = | <> | != | > | >= | !>| < | <= | !< } ALL ( subquery )

参数

scalar_expression

是任何有效的 Microsoft? SQL Server? 表达式。

{ = | <> | != | > | >= | !> | < | <= | !< }

是比较运算符。

subquery

是返回单列结果集的子查询。返回列的数据类型必须与 scalar_expression 的数据类型相同。

是受限的 SELECT 语句(不允许使用 ORDER BY 子句、COMPUTE 子句和 INTO 关键字)。

返回类型

Boolean

结果值

如果所有给定的比较对(scalar_expression, x)均为 TRUE,其中 x 是单列集中的值,则返回 TRUE;否

则返回 FALSE。

2.AND

连结两个布尔型表达式并当两个表达式都为 TRUE 时返回 TRUE。当语句中有多个逻辑运算符时,AND 运算符

将首先计算。可以通过使用括号更改计算次序。

语法

boolean_expression AND boolean_expression

参数

boolean_expression

任何有效的 Microsoft? SQL Server? 表达式都将返回下列布尔值:TRUE FALSE 或 UNKNOWN。

结果类型

Boolean

结果值

当两个表达式均为 TRUE 时返回 TRUE。

注释

下表概括了使用 AND 运算符比较 TRUE 和 FALSE 时的结果。

TRUE FALSE UNKNOWN

TRUE TRUE FALSE UNKNOWN

FALSE FALSE FALSE FALSE

UNKNOWN UNKNOWN FALSE UNKNOWN

3.SOME | ANY

用标量值与单列集中的值进行比较。

语法

scalar_expression { = | < > | != | > | > = | ! > | < | < = | ! < }

{ SOME | ANY } ( subquery )

参数

scalar_expression

是任何有效的 Microsoft? SQL Server? 表达式。

{ = | <> | != | > | >= | !> | < | <= | !< }

是任何有效的比较运算符。

SOME | ANY

指定应进行比较。

subquery

是包含某列结果集的子查询。所返回列的数据类型必须是与 scalar_expression 相同的数据类型。

结果类型

Boolean

结果值

对于 ANY 对 (scalar_expression, x)(其中 x 是单列集中的值),当指定的比较是 TRUE时,SOME 或

ANY 返回 TRUE。否则返回 FALSE。

4.BETWEEN

指定测试范围。

语法

test_expression [ NOT ] BETWEEN begin_expression AND end_expression

参数

test_expression

是用来在由 begin_expression 和 end_expression 定义的范围内进行测试的表达式。test_expression

必须与 begin_expression 和 end_expression 具有相同的数据类型。

NOT

指定谓词的结果被取反。

begin_expression

是任何有效的 Microsoft? SQL Server? 表达式。begin_expression 必须与 test_expression 和

end_expression 具有相同的数据类型。

end_expression

是任何有效的 SQL Server 表达式。end_expression 必须与 test_expression 和 begin_expression 一

样具有相同的数据类型。

AND

作为一个占位符,表示 test_expression 应该处于由 begin_expression 和 end_expression 指定的范围

内。

结果类型

Boolean

结果值

如果 test_expression 的值大于或等于 begin_expression 的值并且小于或等于 end_expression 的值,

则 BETWEEN 返回 TRUE。

如果 test_expression 的值小于 begin_expression 的值或者大于 end_expression 的值,则 NOT

BETWEEN 返回 TRUE。

注释

若要指定排除范围,请使用大于 (>) 和小于 (<) 运算符。如果任何 BETWEEN 或 NOT BETWEEN 谓词的输入

为 NULL,则结果是 UNKNOWN。

示例

A. 使用 BETWEEN

本例返回书的题头标识符,这些书的年度至今单位销售额是从 4,095 到 12,000。

USE pubs

GO

SELECT title_id, ytd_sales

FROM titles

WHERE ytd_sales BETWEEN 4095 AND 12000

GO

下面是结果集:

title_id ytd_sales

-------- -----------

BU1032   4095

BU7832   4095

PC1035   8780

PC8888   4095

TC7777   4095

(5 row(s) affected)

B. 使用 > 和 < 代替 BETWEEN

本例使用大于 (>) 和小于 (<) 运算符,由于这些运算符是非包含的,所以返回不同的结果。

USE pubs

GO

SELECT title_id, ytd_sales

FROM titles

WHERE ytd_sales > 4095 AND ytd_sales < 12000

GO

下面是结果集:

title_id ytd_sales

-------- -----------

PC1035   8780

(1 row(s) affected)

C. 使用 NOT BETWEEN

本例找出一个指定范围(从 4,095 到 12,000)外的所有行。

USE pubs

GO

SELECT title_id, ytd_sales

FROM titles

WHERE ytd_sales NOT BETWEEN 4095 AND 12000

GO

下面是结果集:

title_id ytd_sales

-------- -----------

BU1111   3876

BU2075   18722

MC2222   2032

MC3021   22246

PS1372   375

PS2091   2045

PS2106   111

PS3333   4072

PS7777   3336

TC3218   375

TC4203   15096

(11 row(s) affected)

5.EXISTS

指定一个子查询,检测行的存在。

语法

EXISTS subquery

参数

subquery

是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。有关更多信息,请参见 SELECT 中

有关子查询的讨论。

结果类型

Boolean

结果值

如果子查询包含行,则返回 TRUE。

示例

A. 在子查询中使用 NULL 仍然返回结果集

这个例子在子查询中指定 NULL,并返回结果集,通过使用 EXISTS 仍取值为 TRUE。

USE Northwind

GO

SELECT CategoryName

FROM Categories

WHERE EXISTS (SELECT NULL)

ORDER BY CategoryName ASC

GO

B. 比较使用 EXISTS 和 IN 的查询

这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相

同的信息。

USE pubs

GO

SELECT DISTINCT pub_name

FROM publishers

WHERE EXISTS

(SELECT *

FROM titles

WHERE pub_id = publishers.pub_id

AND type = ’business’)

GO

-- Or, using the IN clause:

USE pubs

GO

SELECT distinct pub_name

FROM publishers

WHERE pub_id IN

(SELECT pub_id

FROM titles

WHERE type = ’business’)

GO

下面是任一查询的结果集:

pub_name

----------------------------------------

Algodata Infosystems

New Moon Books

(2 row(s) affected)

C.比较使用 EXISTS 和 = ANY 的查询

本示例显示查找与出版商住在同一城市中的作者的两种查询方法:第一种方法使用 = ANY,第二种方法使用

EXISTS。注意这两种方法返回相同的信息。

USE pubs

GO

SELECT au_lname, au_fname

FROM authors

WHERE exists

(SELECT *

FROM publishers

WHERE authors.city = publishers.city)

GO

-- Or, using = ANY

USE pubs

GO

SELECT au_lname, au_fname

FROM authors

WHERE city = ANY

(SELECT city

FROM publishers)

GO

下面是任一查询的结果集:

au_lname                                 au_fname

---------------------------------------- --------------------

Carson                                   Cheryl

Bennet                                   Abraham

(2 row(s) affected)

D.比较使用 EXISTS 和 IN 的查询

本示例所示查询查找由位于以字母 B 开头的城市中的任一出版商出版的书名:

USE pubs

GO

SELECT title

FROM titles

WHERE EXISTS

(SELECT *

FROM publishers

WHERE pub_id = titles.pub_id

AND city LIKE ’B%’)

GO

-- Or, using IN:

USE pubs

GO

SELECT title

FROM titles

WHERE pub_id IN

(SELECT pub_id

FROM publishers

WHERE city LIKE ’B%’)

GO

下面是任一查询的结果集:

title

------------------------------------------------------------------------

The Busy Executive’s Database Guide

Cooking with Computers: Surreptitious Balance Sheets

You Can Combat Computer Stress!

Straight Talk About Computers

But Is It User Friendly?

Secrets of Silicon Valley

Net Etiquette

Is Anger the Enemy?

Life Without Fear

Prolonged Data Deprivation: Four Case Studies

Emotional Security: A New Algorithm

(11 row(s) affected)

E. 使用 NOT EXISTS

NOT EXISTS 的作用与 EXISTS 正相反。如果子查询没有返回行,则满足 NOT EXISTS 中的 WHERE 子句。本

示例查找不出版商业书籍的出版商的名称:

USE pubs

GO

SELECT pub_name

FROM publishers

WHERE NOT EXISTS

(SELECT *

FROM titles

WHERE pub_id = publishers.pub_id

AND type = ’business’)

ORDER BY pub_name

GO

下面是结果集:

pub_name

----------------------------------------

Binnet & Hardley

Five Lakes Publishing

GGG&G

Lucerne Publishing

Ramona Publishers

Scootney Books

(6 row(s) affected)

6.IN

确定给定的值是否与子查询或列表中的值相匹配。

语法

test_expression [ NOT ] IN

(

subquery

| expression [ ,...n ]

)

参数

test_expression

是任何有效的 Microsoft? SQL Server? 表达式。

subquery

是包含某列结果集的子查询。该列必须与 test_expression 有相同的数据类型。

expression [,...n]

一个表达式列表,用来测试是否匹配。所有的表达式必须和 test_expression 具有相同的类型。

结果类型

布尔型

结果值

如果 test_expression 与 subquery 返回的任何值相等,或与逗号分隔的列表中的任何 expression 相

等,那么结果值就为 TRUE。否则,结果值为 FALSE。

使用 NOT IN 对返回值取反。

示例

A. 对比 OR 和 IN

下面的示例选择名称和州的列表,列表中列出所有居住在加利福尼亚、印地安纳或马里兰州的作者。

USE pubs

SELECT au_lname, state

FROM authors

WHERE state = ’CA’ OR state = ’IN’ OR state = ’MD’

但是,也可以使用 IN 获得相同的结果:

USE pubs

SELECT au_lname, state

FROM authors

WHERE state IN (’CA’, ’IN’, ’MD’)

以下是上面任一查询的结果集:

au_lname   state

--------   -----

White      CA

Green      CA

Carson      CA

O’Leary      CA

Straight      CA

Bennet      CA

Dull      CA

Gringlesby      CA

Locksley      CA

Yokomoto      CA

DeFrance      IN

Stringer      CA

MacFeather      CA

Karsen      CA

Panteley            MD

Hunter            CA

McBadden            CA

(17 row(s) affected)

B. 将 IN 与子查询一起使用

下面的示例在 titleauthor 表中查找从任一种书得到的版税少于 50% 的所有作者的 au_ids,然后从

authors 表中选择 au_ids 与 titleauthor 查询结果匹配的所有作者的姓名。结果显示有一些作者属于得

到的版税少于 50% 的一类。

USE pubs

SELECT au_lname, au_fname

FROM authors

WHERE au_id IN

(SELECT au_id

FROM titleauthor

WHERE royaltyper < 50)

下面是结果集:

au_lname                                 au_fname

---------------------------------------- --------------------

Green                                    Marjorie

O’Leary                                  Michael

Gringlesby                               Burt

Yokomoto                                 Akiko

MacFeather                               Stearns

Ringer                                   Anne

(6 row(s) affected)

C. 将 NOT IN 与子查询一起使用

NOT IN 将找到那些与值列表中的项目不匹配的作者。下面的示例查找至少有一种书取得不少于 50% 的版税的

作者姓名:

USE pubs

SELECT au_lname, au_fname

FROM authors

WHERE au_id NOT IN

(SELECT au_id

FROM titleauthor

WHERE royaltyper < 50)

下面是结果集:

au_lname                                 au_fname

---------------------------------------- --------------------

White                                    Johnson

Carson                                   Cheryl

Straight                                 Dean

Smith                                    Meander

Bennet                                   Abraham

Dull                                     Ann

Locksley                                 Charlene

Greene                                   Morningstar

Blotchet-Halls                           Reginald

del Castillo                             Innes

DeFrance                                 Michel

Stringer                                 Dirk

Karsen                                   Livia

Panteley                                 Sylvia

Hunter                                   Sheryl

McBadden                                 Heather

Ringer                                   Albert

(17 row(s) affected)

7.LIKE

确定给定的字符串是否与指定的模式匹配。模式可以包含常规字符和通配符字符。模式匹配过程中,常规字符

必须与字符串中指定的字符完全匹配。然而,可使用字符串的任意片段匹配通配符。与使用 = 和 != 字符串

比较运算符相比,使用通配符可使 LIKE 运算符更加灵活。如果任何参数都不属于字符串数据类型,

Microsoft? SQL Server? 会将其转换成字符串数据类型(如果可能)。

语法

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

参数

match_expression

任何字符串数据类型的有效 SQL Server 表达式。

pattern

match_expression 中的搜索模式,可以包含下列有效 SQL Server 通配符。

通配符 描述 示例

% 包含零个或更多字符的任意字符串。 WHERE title LIKE ’%computer%’ 将查找处于书名任意位置的包含

单词 computer 的所有书名。

_(下划线) 任何单个字符。 WHERE au_fname LIKE ’_ean’ 将查找以 ean 结尾的所有 4 个字母的名字

(Dean、Sean 等)。

[ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。 WHERE au_lname LIKE ’[C-P]arsen’

将查找以arsen 结尾且以介于 C 与 P 之间的任何单个字符开始的作者姓氏,例如,Carsen、Larsen、

Karsen 等。

[^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。 WHERE au_lname LIKE ’de[^l]%’

将查找以 de 开始且其后的字母不为 l 的所有作者的姓氏。

escape_character

字符串数据类型分类中的所有数据类型的任何有效 SQL Server 表达式。escape_character 没有默认值,

且必须仅包含一个字符。

结果类型

Boolean

结果值

如果 match_expression 匹配指定模式,LIKE 将返回 TRUE。

注释

当使用 LIKE 进行字符串比较时,模式字符串中的所有字符都有意义,包括起始或尾随空格。如果查询中的比

较要返回包含"abc "(abc 后有一个空格)的所有行,则将不会返回包含"abc"(abc 后没有空格)的列所在

行。但是可以忽略模式所要匹配的表达式中的尾随空格。如果查询中的比较要返回包含"abc"(abc 后没有空

格)的所有行,则将返回以"abc"开始且具有零个或多个尾随空格的所有行。

由于数据存储方式的原因,使用包含 char 和 varchar 数据模式的字符串比较可能无法通过 LIKE 比较。了

解每种数据类型的存储方式以及导致 LIKE 比较失败的原因十分重要。下面的示例将局部 char 变量传递给存

储过程,然后使用模式匹配查找某个作者的所有著作。在此过程中,作者的姓将作为变量传递。

CREATE PROCEDURE find_books @AU_LNAME char(20)

AS

SELECT @AU_LNAME = RTRIM(@AU_LNAME) + ’%’

SELECT t.title_id, t.title

FROM authors a, titleauthor ta, titles t

WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id

AND a.au_lname LIKE @AU_LNAME

当名字中包含的字符数小于 20 时,char 变量 (@AU_LNAME) 将包含尾随空格,这导致 find_books 过程中

没有行返回。由于 au_lname 列为 varchar 类型,所以没有尾随空格。因为尾随空格是有意义的,所以此过

程失败。

但下面的示例是成功的,因为尾随空格没有被添加到 varchar 变量中:

USE pubs

GO

CREATE PROCEDURE find_books2 @au_lname varchar(20)

AS

SELECT t.title_id, t.title

FROM authors a, titleauthor ta, titles t

WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id

AND a.au_lname LIKE @au_lname + ’%’

EXEC find_books2 ’ring’

下面是结果集:

title_id title

-------- ---------------------------------------------------------------

MC3021   The Gourmet Microwave

PS2091   Is Anger the Enemy?

PS2091   Is Anger the Enemy?

PS2106   Life Without Fear

(4 row(s) affected)

使用 LIKE 的模式匹配

当搜索 datetime 值时,推荐使用 LIKE,因为 datetime 项可能包含各种日期部分。例如,如果将值

19981231 9:20 插入到名为 arrival_time 的列中,则子句 WHERE arrival_time = 9:20 将无法找到

9:20 字符串的精确匹配,因为 SQL Server 将其转换为 1900 年 1 月 1 日上午 9:20。然而,子句

WHERE arrival_time LIKE ’%9:20%’ 将找到匹配。

LIKE 支持 ASCII 模式匹配和 Unicode 模式匹配。当所有参数,包括 match_expression、pattern 和

escape_character(如果有)都是 ASCII 字符数据类型时,将执行 ASCII 模式匹配。如果其中任何参数属

于 Unicode 数据类型,则所有参数将被转换为 Unicode 并执行 Unicode 模式匹配。当对 Unicode 数据

(nchar 或 nvarchar 数据类型)使用 LIKE 时,尾随空格是有意义的。但是对于非 Unicode 数据,尾随

空格没有意义。Unicode LIKE 与 SQL-92 标准兼容。ASCII LIKE 与 SQL Server 的早期版本兼容。

下面的一系列示例显示 ASCII LIKE 模式匹配与 Unicode LIKE 模式匹配所返回的行之间的差异:

-- ASCII pattern matching with char column

CREATE TABLE t (col1 char(30))

INSERT INTO t VALUES (’Robert King’)

SELECT *

FROM t

WHERE col1 LIKE ’% King’   -- returns 1 row

-- Unicode pattern matching with nchar column

CREATE TABLE t (col1 nchar(30))

INSERT INTO t VALUES (’Robert King’)

SELECT *

FROM t

WHERE col1 LIKE ’% King’   -- no rows returned

-- Unicode pattern matching with nchar column and RTRIM

CREATE TABLE t (col1 nchar (30))

INSERT INTO t VALUES (’Robert King’)

SELECT *

FROM t

WHERE RTRIM(col1) LIKE ’% King’   -- returns 1 row

说明  如果使用 LIKE 进行字符串比较,模式字符串中的所有字符都有意义,包括起始空格或尾随空格。

使用 % 通配符

如果指定 LIKE ’5%’,SQL Server 将搜索后面带有零个或多个任意字符的数字 5。

例如,此查询将显示数据库中所有的系统表,因为它们都以字母 sys 开始:

SELECT TABLE_NAME

FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_NAME LIKE ’sys%’

说明  请注意:系统表可以随版本不同而更改。推荐使用信息架构视图或适用的存储过程处理 SQL Server

系统表。

若要查阅非系统表的所有对象,请使用 NOT LIKE ’sys%’。如果共有 32 个对象且 LIKE 找到 13 个与模式

匹配的名称,则 NOT LIKE 将找到 19 个与 LIKE 模式不匹配的对象。

使用 LIKE ’[^s][^y][^s]%’ 模式不一定每次找到的名称都相同。可能仅得到 14 个名称(而不是 19

个),除了系统表名称外,所有以 s 开始或第二个字母为 y 或第三个字母为 s 的名称也都将从结果中消

除。这是因为用反向通配符匹配字符串是分步骤进行计算的,一次一个通配符。如果在计算过程中任一环节匹

配失败,那么就会将其消除。

将通配符作为文字使用

可以将通配符模式匹配字符串用作文字字符串,方法是将通配符放在括号中。下表显示了使用 LIKE 关键字

和 [ ] 通配符的示例。

符号 含义

LIKE ’5[%]’ 5%

LIKE ’[_]n’ _n

LIKE ’[a-cdf]’ a、b、c、d 或 f

LIKE ’[-acdf]’ -、a、c、d 或 f

LIKE ’[ [ ]’ [

LIKE ’]’ ]

LIKE ’abc[_]d%’ abc_d 和 abc_de

LIKE ’abc[def]’ abcd、abce 和 abcf

使用 ESCAPE 子句的模式匹配

可搜索包含一个或多个特殊通配符的字符串。例如,customers 数据库中的 discounts 表可能存储含百分

号 (%) 的折扣值。若要搜索作为字符而不是通配符的百分号,必须提供 ESCAPE 关键字和转义符。例如,一

个样本数据库包含名为 comment 的列,该列含文本 30%。若要搜索在 comment 列中的任何位置包含字符串

30% 的任何行,请指定由 WHERE comment LIKE ’%30!%%’ ESCAPE ’!’ 组成的 WHERE 子句。如果不指定

ESCAPE 和转义符,SQL Server 将返回所有含字符串 30 的行。

下例说明如何在 pubs 数据库 titles 表的 notes 列中搜索字符串"50% off when 100 or more copies

are purchased":

USE pubs

GO

SELECT notes

FROM titles

WHERE notes LIKE ’50%% off when 100 or more copies are purchased’

ESCAPE ’%’

GO

示例

A. 使用带 % 通配符的 LIKE

下例查找 authors 表中所有区号为 415 的电话号码。

USE pubs

GO

SELECT phone

FROM authors

WHERE phone LIKE ’415%’

ORDER by au_lname

GO

下面是结果集:

phone

------------

415 658-9932

415 548-7723

415 836-7128

415 986-7020

415 836-7128

415 534-9219

415 585-4620

415 354-7128

415 834-2919

415 843-2991

415 935-4228

(11 row(s) affected)

B. 使用带 % 通配符的 NOT LIKE

下例查找 authors 表中所有区号不是 415 的电话号码。

USE pubs

GO

SELECT phone

FROM authors

WHERE phone NOT LIKE ’415%’

ORDER BY au_lname

GO

下面是结果集:

phone

------------

503 745-6402

219 547-9982

615 996-8275

615 297-2723

707 938-6445

707 448-4982

408 286-2428

301 946-8853

801 826-0752

801 826-0752

913 843-0462

408 496-7223

(12 row(s) affected)

C. 使用 ESCAPE 子句

下例使用 ESCAPE 子句和转义符查找 mytbl2 表的 c1 列中的精确字符串 10-15%。

USE pubs

GO

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_NAME = ’mytbl2’)

DROP TABLE mytbl2

GO

USE pubs

GO

CREATE TABLE mytbl2

(

c1 sysname

)

GO

INSERT mytbl2 VALUES (’Discount is 10-15% off’)

INSERT mytbl2 VALUES (’Discount is .10-.15 off’)

GO

SELECT c1

FROM mytbl2

WHERE c1 LIKE ’%10-15!% off%’ ESCAPE ’!’

GO

D. 使用 [ ] 通配符

下例查找名字为 Cheryl 或 Sheryl 的作者。

USE pubs

GO

SELECT au_lname, au_fname, phone

FROM authors

WHERE au_fname LIKE ’[CS]heryl’

ORDER BY au_lname ASC, au_fname ASC

GO

下例查找姓为 Carson、Carsen、Karson 或 Karsen 的作者所在的行。

USE pubs

GO

SELECT au_lname, au_fname, phone

FROM authors

WHERE au_lname LIKE ’[CK]ars[eo]n’

ORDER BY au_lname ASC, au_fname ASC

GO

8.NOT

对布尔型输入取反。

语法

[ NOT ] boolean_expression

参数

boolean_expression

是任何有效的 Microsoft? SQL Server? 布尔表达式。

结果类型

Boolean

结果值

NOT 反转任何布尔表达式的值。

注释

可用 NOT 对一个表达式求反。

下面的表显示使用 NOT 运算符比较 TRUE 和 FALSE 值的结果。

NOT

TRUE FALSE

FALSE TRUE

UNKNOWN UNKNOWN

示例

下面的示例查找所有预付款不超过 $5,500 的商业和心理学丛书。

USE pubs

GO

SELECT title_id, type, advance

FROM titles

WHERE (type = ’business’ OR type = ’psychology’)

AND NOT advance > $5500

ORDER BY title_id ASC

GO

下面是结果集:

title_id type         advance

-------- ------------ ---------------------

BU1032   business     5000.0000

BU1111   business     5000.0000

BU7832   business     5000.0000

PS2091   psychology   2275.0000

PS3333   psychology   2000.0000

PS7777   psychology   4000.0000

(6 row(s) affected)

9.OR

将两个条件结合起来。当在一个语句中使用多个逻辑运算符时,在 AND 运算符之后求 OR 运算符的值。但

是,通过使用括号可以更改求值的顺序。

语法

boolean_expression OR boolean_expression

参数

boolean_expression

是任何返回 TRUE、FALSE 或 UNKNOWN 的有效 Microsoft? SQL Server? 表达式。

结果类型

Boolean

结果值

当两个条件中的任何一个为 TRUE 时,OR 返回 TRUE。

注释

下表显示 OR 运算符的结果。

TRUE FALSE UNKNOWN

TRUE TRUE TRUE TRUE

FALSE TRUE FALSE UNKNOWN

UNKNOWN TRUE UNKNOWN UNKNOWN

示例

下面的示例检索某些书名,这些书具有大于 $5,500 的预付款,并且这些书籍是商业书籍或心理学书籍。如果

没有括号,那么 WHERE 子句就会检索预付款超过 $5,500 的所有商业书籍或者心理学书籍。

USE pubs

GO

SELECT SUBSTRING(title, 1, 30) AS Title, type

FROM titles

WHERE (type = ’business’ OR type = ’psychology’) AND

advance > $5500

ORDER BY title

GO

下面是结果集:

Title                          type

------------------------------ ------------

Computer Phobic AND Non-Phobic psychology

Life Without Fear              psychology

You Can Combat Computer Stress business

(3 row(s) affected)