想●致

sql server中常用方法函数

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 被解释为 20492050 被解释为 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 被解释为 20492050 被解释为 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 被解释为 204950 被解释为 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 = 1Saturday = 7weekday 日期部分产生的数取决于 SET DATEFIRST 设定的值,此命令设定星期中的第一天。

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

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

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

 

返回类型int

注释DAYMONTH、和 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

 

是给出种子值或起始值的整型表达式(tinyintsmallint 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 必须是 tinyintsmallint int。当 length

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

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

 

function

 

是要执行的操作类型。function 必须是 tinyintsmallint 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 executives    THE BUSY EXECUTIVES    the busy executives

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 = NK?benhavn

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

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

GO

 

下面是结果集:

 

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

248         ?(1 row(s) affected)

 

B. 使用 SUBSTRINGUNICODECONVERT NCHAR

下面的示例使用 SUBSTRINGUNICODECONVERT 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 = NK?benhavn

-- Print the character number of the position of the string youre at,

-- the actual Unicode character youre 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 NULLIS 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_expression12 3)是支持的字符数据类型之一,则返回字符数据。如果

string_expression12 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. 使用 REPLICATESUBSTRING SPACE

下例使用 REPLICATESUBSTRING 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           

OLEARY, 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                                              

OLeary,  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

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

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

 

语法

SUBSTRING ( expression , start , length )

 

参数

expression

 

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

 

start

 

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

 

length

 

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

 

 

 

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

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

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

 

 

返回类型

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

型,则返回二进制数据。

 

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

 

给定的表达式 返回类型

text varchar

image varbinary

ntext nvarchar

 

 

注释

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

必须指定使用 textimagebinary 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. textntext 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. 使用 SUBSTRINGUNICODE CONVERT 函数

下面的示例使用 SUBSTRINGUNICODE 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                                              

OLEARY, 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 时返回的表达式。如果省略此参数并且比较运算取值不为 TRUECASE 将返回

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_compTHEN Popular Computing

         WHEN mod_cookTHEN Modern Cooking

         WHEN businessTHEN Business

         WHEN psychologyTHEN Psychology

         WHEN trad_cookTHEN 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 Executives 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 Executives

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) = BUTHEN Business

    WHEN SUBSTRING(ta.title_id, 1, 2) = MCTHEN Modern Cooking

    WHEN SUBSTRING(ta.title_id, 1, 2) = PCTHEN Popular Computing

    WHEN SUBSTRING(ta.title_id, 1, 2) = PSTHEN Psychology

    WHEN SUBSTRING(ta.title_id, 1, 2) = TCTHEN 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 OLeary           267-41-2394 BU1111   Business            

Michael OLeary           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_wagesalary

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

COALESCE 函数接受在 hourly_wagesalary 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 varcharvarbinarytextimagenvarchar 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

 

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

 

[ @FileID = ] file_id

 

文件的 IDfile_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 的数据类型为 charncharvarchar 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 的数据类型为 charncharvarchar 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

 

注释

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

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

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

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

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

 

在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITYSCOPE_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-100100 a 100.00 0

.01 0

-100.1234e-123 0

.231e90 0

$100.12345- $100.12345 $-1000.123 0

as100 1a00 0

1995-10-11/20/951995-10-1 12:00pmFeb 7 1995 11:00pm1995-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 类型的空值。

 

注释

如果两个表达式相等且结果表达式为 NULLNULLIF 等价于 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 语句返回的行数。

 

位于 INSERTUPDATE DELETE 语句之后时,该函数返回受数据修改语句影响的行数。

 

位于 IF 这类不返回行的语句之后时,该函数返回零 (0)

 

 

 

30.SCOPE_IDENTITY

返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过

程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的

作用域中。

 

语法

SCOPE_IDENTITY( )

 

返回类型

sql_variant

 

注释

SCOPE_IDENTITYIDENT_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 sessions 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 = employeeAND o.id = i.id

GO

 

 

 

35.@@TRANCOUNT

返回当前连接的活动事务数。

 

语法

@@TRANCOUNT

 

返回类型

integer

 

注释

BEGIN TRANSACTION 语句使 @@TRANCOUNT 递增 1ROLLBACK 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

 

一个表达式,包含当前数据库中某个对象的 IDid 的数据类型是 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 选项,以便 textntext 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 Executives 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 = CAOR state = INOR 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

OLeary      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             

OLeary                                  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 个字母的名字

DeanSean 等)。

[ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。 WHERE au_lname LIKE [C-P]arsen

将查找以arsen 结尾且以介于 C P 之间的任何单个字符开始的作者姓氏,例如,CarsenLarsen

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_expressionpattern

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]abcd f

LIKE [-acdf]-acd f

LIKE [ [ ][

LIKE ]]

LIKE abc[_]d%abc_d abc_de

LIKE abc[def]abcdabce 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

 

下例查找姓为 CarsonCarsenKarson 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 = businessOR 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

 

是任何返回 TRUEFALSE 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 = businessOR 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)

 

posted @ 2016-11-23 10:24  相心  阅读(1553)  评论(0编辑  收藏  举报