SQL SERVER 函数

决定还是先帖简单的,时间日期函数

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

语法
DATEADD ( datepart , number, date )

参数
datepart

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

日期部分     缩写
Year         yy, yyyy
quarter      qq, q
Month        mm, m
dayofyear    dy, y
Day          dd, d
Week         wk, ww
Hour         hh
minute       mi, n
second       ss, s
millisecond  ms


number

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

date

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

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

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

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

USE pubs
GO
SELECT DATEADD(day, 21, pubdate) AS timeframe
FROM titles
GO

下面是结果集:

timeframe                  
---------------------------
Jul 3 1991 12:00AM         
Jun 30 1991 12:00AM        
Jul 21 1991 12:00AM        
Jul 13 1991 12:00AM        
Jun 30 1991 12:00AM        
Jul 9 1991 12:00AM         
Mar 14 1997  5:09PM        
Jul 21 1991 12:00AM        
Jul 3 1994 12:00AM         
Mar 14 1997  5:09PM        
Nov 11 1991 12:00AM        
Jul 6 1991 12:00AM         
Oct 26 1991 12:00AM        
Jul 3 1991 12:00AM         
Jul 3 1991 12:00AM         
Nov 11 1991 12:00AM        
Jul 3 1991 12:00AM         
Jul 3 1991 12:00AM         

(18 row(s) affected)

 

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

语法
DATEDIFF ( datepart , startdate , enddate )

参数
datepart

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

日期部分    缩写
year        yy, yyyy
quarter     qq, q
Month       mm, m
dayofyear   dy, y
Day         dd, d
Week        wk, ww
Hour        hh
minute      mi, n
second      ss, s
millisecond ms


startdate

是计算的开始日期。startdate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。

因为 smalldatetime 只精确到分钟,所以当用 smalldatetime 值时,秒和毫秒总是 0。

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

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

enddate

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

返回类型
integer

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

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

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

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

USE pubs
GO
SELECT DATEDIFF(day, pubdate, getdate()) AS no_of_days
FROM titles
GO

 

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

语法
DATENAME ( datepart , date )

参数
datepart

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

日期部分      缩写
year          yy, yyyy
quarter       qq, q
month         mm, m
dayofyear     dy, y
day           dd, d
week          wk, ww
weekday       dw
Hour          hh
minute        mi, n
second        ss, s
millisecond   ms


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

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

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

返回类型
nvarchar

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

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

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

下面是结果集:

Month Name                    
------------------------------
February    

 

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

语法
DATEPART ( datepart , date )

参数
datepart

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

日期部分     缩写
year         yy, yyyy
quarter      qq, q
month        mm, m
dayofyear    dy, y
day          dd, d
week         wk, ww
weekday      dw
Hour         hh
minute       mi, n
second       ss, s
millisecond  ms


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

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

date

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

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

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

返回类型
int

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

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

SELECT GETDATE() AS ’Current Date’
GO

下面是结果集:

Current Date               
---------------------------
Feb 18 1998 11:46PM        

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

下面是结果集:

Month Number
------------
2           

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

SELECT DATEPART(month, GETDATE())
GO

下面是结果集:

-----------
5          

(1 row(s) affected)

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

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

下面是结果集:

----- ------ ------
1     1      1900

 

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

语法
DAY ( date )

参数
date

类型为 datetime 或 smalldatetime 的表达式。

返回类型
int

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

 

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

语法
GETDATE ( )

返回类型
datetime

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

在设计报表时,GETDATE 函数可用于在每次生成报表时打印当前日期和时间。GETDATE 对于跟踪活动也很有
用,诸如记录事务在某一帐户上发生的时间。

示例
A. 用 GET DATE 返回当前日期和时间
下面的示例得出当前系统日期和时间:

SELECT GETDATE()
GO

下面是结果集:

-------------------------
July 29 1998   2:50    PM

(1 row(s) affected)

B. 在 CREATE TABLE 语句中使用 GETDATE
下面的示例创建 employees 表并用 GETDATE 给出员工雇佣时间的默认值。

USE pubs
GO
CREATE TABLE employees
(
 emp_id char(11) NOT NULL,
 emp_lname varchar(40) NOT NULL,
 emp_fname varchar(20) NOT NULL,
 emp_hire_date datetime DEFAULT GETDATE(),
 emp_mgr varchar(30)
)
GO

 

7.GETUTCDATE
返回表示当前 UTC 时间(世界时间坐标或格林尼治标准时间)的 datetime 值。当前的 UTC 时间得自当前
的本地时间和运行 SQL Server 的计算机操作系统中的时区设置。

语法
GETUTCDATE()

返回类型
datetime

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

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

 

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

语法
MONTH ( date )

参数
date

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

返回类型
int

注释
MONTH 等价于 DATEPART(mm, date)。

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

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

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

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

下面是结果集:

Month Number
------------
3           

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

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

下面是结果集。

----- ------ ------
1     1      1900

 

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

语法
YEAR ( date )

参数
date

datetime 或 smalldatetime 类型的表达式。

返回类型
int

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

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

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

下面是结果集:

Year Number
------------
1998           

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

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

下面是结果集:

----- ------ ------
1     1      1900


 

数学运算函数


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

语法
ABS ( numeric_expression )

参数
numeric_expression

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

返回类型
返回与 numeric_expression 相同的类型。

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

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

下面是结果集:

---- ---- ----
1.0  .0   1.0

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

SELECT ABS(convert(int, -2147483648))

下面是错误信息:

Server: Msg 8115, Level 16, State 2
Arithmetic overflow error converting expression to type int.

 

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

语法
ACOS ( float_expression )

参数
float_expression

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

返回类型
float

示例
下例返回给定角的 ACOS 值。

SET NOCOUNT OFF
DECLARE @angle float
SET @angle = -1
SELECT ’The ACOS of the angle is: ’ + CONVERT(varchar, ACOS(@angle))

下面是结果集:

---------------------------------
The ACOS of the angle is: 3.14159                       

(1 row(s) affected)

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

SET NOCOUNT OFF
DECLARE @angle float
SET @angle = 1.01
SELECT ’The ACOS of the angle is: ’ + CONVERT(varchar, ACOS(@angle))

下面是结果集:

--------------------------------------------------------
NULL                       

(1 row(s) affected)

A domain error occurred.

 

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

语法
ASIN ( float_expression )

参数
float_expression

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

返回类型
float

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

-- First value will be -1.01, which fails.
DECLARE @angle float
SET @angle = -1.01
SELECT ’The ASIN of the angle is: ’ + CONVERT(varchar, ASIN(@angle))
GO

-- Next value is -1.00.
DECLARE @angle float
SET @angle = -1.00
SELECT ’The ASIN of the angle is: ’ + CONVERT(varchar, ASIN(@angle))
GO

-- Next value is 0.1472738.
DECLARE @angle float
SET @angle = 0.1472738
SELECT ’The ASIN of the angle is: ’ + CONVERT(varchar, ASIN(@angle))
GO

下面是结果集:

-------------------------
The ASIN of the angle is:                               

(1 row(s) affected)

Domain error occurred.

                                                        
---------------------------------
The ASIN of the angle is: -1.5708                       

(1 row(s) affected)

                                                        
----------------------------------
The ASIN of the angle is: 0.147811

 

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

语法
ATAN ( float_expression )

参数
float_expression

是 float 类型的表达式。

返回类型
float

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

SELECT ’The ATAN of -45.01 is: ’ + CONVERT(varchar, ATAN(-45.01))
SELECT ’The ATAN of -181.01 is: ’ + CONVERT(varchar, ATAN(-181.01))
SELECT ’The ATAN of 0 is: ’ + CONVERT(varchar, ATAN(0))
SELECT ’The ATAN of 0.1472738 is: ’ + CONVERT(varchar, ATAN(0.1472738))
SELECT ’The ATAN of 197.1099392 is: ’ + CONVERT(varchar, ATAN(197.1099392))
GO

下面是结果集:

                                                        
-------------------------------
The ATAN of -45.01 is: -1.54858                      

(1 row(s) affected)

--------------------------------
The ATAN of -181.01 is: -1.56527                      

(1 row(s) affected)

--------------------------------
The ATAN of 0 is: 0                             

(1 row(s) affected)

----------------------------------
The ATAN of 0.1472738 is: 0.146223                      

(1 row(s) affected)

                                                        
-----------------------------------
The ATAN of 197.1099392 is: 1.56572

 

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

语法
ATN2 ( float_expression , float_expression )

参数
float_expression

float 数据类型的表达式。

返回类型
float

示例
下例计算给定角的 ATN2。

DECLARE @angle1 float
DECLARE @angle2 float
SET @angle1 = 35.175643
SET @angle2 = 129.44
SELECT ’The ATN2 of the angle is: ’ + CONVERT(varchar,ATN2(@angle1,@angle2 ))
GO

下面是结果集:

The ATN2 of the angle is: 0.265345

 

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

语法
CEILING ( numeric_expression )

参数
numeric_expression

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

返回类型
返回与 numeric_expression 相同的类型。

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

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

下面是结果集:

--------- --------- -------------------------
124.00    -123.00    0.00

 


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

语法
COS ( float_expression )

参数
float_expression

是 float 类型的 expression。

返回类型
float

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

DECLARE @angle float
SET @angle = 14.78
SELECT ’The COS of the angle is: ’ + CONVERT(varchar,COS(@angle))
GO

下面是结果集:

The COS of the angle is: -0.599465

 


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

语法
COT ( float_expression )

参数
float_expression

是 float 类型的 expression。

返回类型
float

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

DECLARE @angle float
SET @angle = 124.1332
SELECT ’The COT of the angle is: ’ + CONVERT(varchar,COT(@angle))
GO

下面是结果集:

The COT of the angle is: -0.040312             

 


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

语法
DEGREES ( numeric_expression )

参数
numeric_expression

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

返回代码值
返回与 numeric_expression 相同的类型。

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

SELECT ’The number of degrees in PI/2 radians is: ’ +
CONVERT(varchar, DEGREES((PI()/2)))
GO

下面是结果集:

The number of degrees in PI/2 radians is 90      

 

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

语法
EXP ( float_expression )

参数
float_expression

是 float 类型的表达式。

返回类型
float

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

DECLARE @var float
SET @var = 378.615345498
SELECT ’The EXP of the variable is: ’ + CONVERT(varchar,EXP(@var))
GO

下面是结果集:

The EXP of the variable is: 2.69498e+164  

 

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

语法
FLOOR ( numeric_expression )

参数
numeric_expression

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

返回类型
返回与 numeric_expression 相同的类型。

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

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

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

---------      ---------     -----------
123            -124          123.0000  

 

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

语法
LOG ( float_expression )

参数
float_expression

是 float 数据类型的表达式。

返回类型
float

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

DECLARE @var float
SET @var = 5.175643
SELECT ’The LOG of the variable is: ’ + CONVERT(varchar,LOG(@var))
GO

下面是结果集:

The LOG of the variable is: 1.64396                       

 


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

语法
LOG10 ( float_expression )

参数
float_expression

是 float 数据类型的表达式。

返回类型
float

示例
下例计算给定变量的 LOG10。

DECLARE @var float
SET @var = 145.175643
SELECT ’The LOG10 of the variable is: ’ + CONVERT(varchar,LOG10(@var))
GO

下面是结果集:

The LOG10 of the variable is: 2.16189   

 

14.PI
返回 PI 的常量值。

语法
PI ( )

返回类型
float

示例
本示例返回 PI 值。

SELECT PI()
GO

下面是结果集:

------------------------
3.14159265358979

 

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

语法
POWER ( numeric_expression , y )

参数
numeric_expression

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

y

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

返回类型
与 numeric_expression 相同。

示例
A. 使用 POWER 显示结果 0.0
本示例显示返回结果 0.0 的浮点下溢。

SELECT POWER(2.0, -100.0)
GO

下面是结果集:

------------------------------------------
0.0

(1 row(s) affected)

B. 使用 POWER
本示例显示 21 到 24 的 POWER 结果。

DECLARE @value int, @counter int
SET @value = 2
SET @counter = 1

WHILE @counter < 5
   BEGIN
      SELECT POWER(@value, @counter)
      SET NOCOUNT ON
      SET @counter = @counter + 1
      SET NOCOUNT OFF
   END
GO

下面是结果集:

-----------
2          

(1 row(s) affected)

-----------
4          

(1 row(s) affected)

-----------
8          

(1 row(s) affected)

-----------
16         

 

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

语法
RADIANS ( numeric_expression )

参数
numeric_expression

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

返回类型
返回与 numeric_expression 相同的类型。

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

SELECT RADIANS(1e-307)
GO

下面是结果集:

-------------------
0.0                     
(1 row(s) affected)

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

-- First value is -45.01.
DECLARE @angle float
SET @angle = -45.01
SELECT ’The RADIANS of the angle is: ’ +
   CONVERT(varchar, RADIANS(@angle))
GO
-- Next value is -181.01.
DECLARE @angle float
SET @angle = -181.01
SELECT ’The RADIANS of the angle is: ’ +
   CONVERT(varchar, RADIANS(@angle))
GO
-- Next value is 0.00.
DECLARE @angle float
SET @angle = 0.00
SELECT ’The RADIANS of the angle is: ’ +
   CONVERT(varchar, RADIANS(@angle))
GO
-- Next value is 0.1472738.
DECLARE @angle float
SET @angle = 0.1472738
SELECT ’The RADIANS of the angle is: ’ +
    CONVERT(varchar, RADIANS(@angle))
GO
-- Last value is 197.1099392.
DECLARE @angle float
SET @angle = 197.1099392
SELECT ’The RADIANS of the angle is: ’ +
   CONVERT(varchar, RADIANS(@angle))
GO

下面是结果集:

---------------------------------------
The RADIANS of the angle is: -0.785573                     
(1 row(s) affected)
---------------------------------------
The RADIANS of the angle is: -3.15922                      
(1 row(s) affected)
---------------------------------------
The RADIANS of the angle is: 0                             
(1 row(s) affected)
---------------------------------------
The RADIANS of the angle is: 0.00257041                    
 (1 row(s) affected)
---------------------------------------
The RADIANS of the angle is: 3.44022                       
(1 row(s) affected)

 

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

语法
RAND ( [ seed ] )

参数
seed

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

返回类型
float

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

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

DECLARE @counter smallint
SET @counter = 1
WHILE @counter < 5
   BEGIN
      SELECT RAND(@counter) Random_Number
      SET NOCOUNT ON
      SET @counter = @counter + 1
      SET NOCOUNT OFF
   END
GO

下面是结果集:

Random_Number                                        
-------------------
0.71359199321292355

(1 row(s) affected)

Random_Number                                        
-------------------
0.7136106261841817

(1 row(s) affected)

Random_Number                                        
-------------------
0.71362925915543995

(1 row(s) affected)

Random_Number                                        
-------------------
0.7136478921266981

(1 row(s) affected)

 

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

语法
ROUND ( numeric_expression , length [ , function ] )

参数
numeric_expression

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

length

是 numeric_expression 将要四舍五入的精度。length 必须是 tinyint、smallint 或int。当 length
为正数时,numeric_expression 四舍五入为 length 所指定的小数位数。当 length 为负数时,
numeric_expression 则按 length 所指定的在小数点的左边四舍五入。

function

是要执行的操作类型。function 必须是 tinyint、smallint 或 int。如果省略 function 或 function
的值为 0(默认),numeric_expression 将四舍五入。当指定 0 以外的值时,将截断
numeric_expression。

返回类型
返回与 numeric_expression 相同的类型。

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

示例 结果
ROUND(748.58, -4) 0


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

示例 结果
ROUND(748.58, -1) 750.00
ROUND(748.58, -2) 700.00
ROUND(748.58, -3) 1000.00


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

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

下面是结果集:

----------- -----------
123.9990    124.0000   

B. 使用 ROUND 和四舍五入的近似值
下例显示四舍五入和近似值。

语句 结果
SELECT ROUND(123.4545, 2)
 123.4500
 
SELECT ROUND(123.45, -2)
 100.00
 


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

语句 结果
SELECT ROUND(150.75, 0)
 151.00
 
SELECT ROUND(150.75, 0, 1)
 150.00
 


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

语法
SIGN ( numeric_expression )

参数
numeric_expression

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

返回类型
float

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

DECLARE @value real
SET @value = -1
WHILE @value < 2
   BEGIN
      SELECT SIGN(@value)
      SET NOCOUNT ON
      SELECT @value = @value + 1
      SET NOCOUNT OFF
   END
SET NOCOUNT OFF
GO

下面是结果集:

(1 row(s) affected)

                        
------------------------
-1.0                    

(1 row(s) affected)

                        
------------------------
0.0                     

(1 row(s) affected)

                        
------------------------
1.0                     

(1 row(s) affected)

 

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

语法
SIN ( float_expression )

参数
float_expression

是 float 类型的表达式。

返回类型
float

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

DECLARE @angle float
SET @angle = 45.175643
SELECT ’The SIN of the angle is: ’ + CONVERT(varchar,SIN(@angle))
GO

下面是结果集:

The SIN of the angle is: 0.929607                      

(1 row(s) affected)

 

21.SQUARE
返回给定表达式的平方。

语法
SQUARE ( float_expression )

参数
float_expression

是 float 类型的表达式。

返回类型
float

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

DECLARE @h float, @r float
SET @h = 5
SET @r = 1
SELECT PI()* SQUARE(@r)* @h AS ’Cyl Vol’

下面是结果:

Cyl Vol
--------------------------
15.707963267948966

 

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

语法
SQRT ( float_expression )

参数
float_expression

是 float 类型的表达式。

返回类型
float

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

DECLARE @myvalue float
SET @myvalue = 1.00
WHILE @myvalue < 10.00
   BEGIN
      SELECT SQRT(@myvalue)
      SELECT @myvalue = @myvalue + 1
   END
GO

下面是结果集:

------------------------
1.0                     
------------------------
1.4142135623731         
------------------------
1.73205080756888        
------------------------
2.0                     
------------------------
2.23606797749979        
------------------------
2.44948974278318        
------------------------
2.64575131106459        
------------------------
2.82842712474619        
------------------------
3.0

 

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

语法
TAN ( float_expression )

参数
float_expression

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

返回类型
float

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

SELECT TAN(PI()/2)

下面是结果集:

----------------------
1.6331778728383844E+16

 


 

字符串函数


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

语法
ASCII ( character_expression )

参数
character_expression

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

返回类型
int

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

SET TEXTSIZE 0
SET NOCOUNT ON
-- Create the variables for the current character string position
-- and for the character string.
DECLARE @position int, @string char(15)
-- Initialize the variables.
SET @position = 1
SET @string = ’Du monde entier’
WHILE @position <= DATALENGTH(@string)
   BEGIN
   SELECT ASCII(SUBSTRING(@string, @position, 1)),
      CHAR(ASCII(SUBSTRING(@string, @position, 1)))
    SET @position = @position + 1
   END
SET NOCOUNT OFF
GO

下面是结果集:

----------- -
68          D
             
----------- -
117         u
             
----------- -
32           
             
----------- -
109         m
             
----------- -
111         o
             
----------- -
110         n
             
----------- -
100         d
             
----------- -
101         e
             
----------- -
32           
             
----------- -
101         e
             
----------- -
110         n
             
----------- -
116         t
             
----------- -
105         i
             
----------- -
101         e
             
----------- -
114         r

 

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

语法
CHAR ( integer_expression )

参数
integer_expression

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

返回类型
char(1)

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

控制字符 值
制表符 CHAR(9)
换行符 CHAR(10)
回车 CHAR(13)


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

SET TEXTSIZE 0
-- Create variables for the character string and for the current
-- position in the string.
DECLARE @position int, @string char(8)
-- Initialize the current position and the string variables.
SET @position = 1
SET @string = ’New Moon’
WHILE @position <= DATALENGTH(@string)
   BEGIN
   SELECT ASCII(SUBSTRING(@string, @position, 1)),
      CHAR(ASCII(SUBSTRING(@string, @position, 1)))
   SET @position = @position + 1
   END
GO

下面是结果集:

----------- -
78          N
             
----------- -
101         e
             
----------- -
119         w
             
----------- -
32           
             
----------- -
77          M
             
----------- -
111         o
             
----------- -
111         o
             
----------- -
110         n
             
----------- -

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

USE Northwind
SELECT FirstName + ’ ’ + LastName, + CHAR(13) + Address,
   + CHAR(13) + City, + Region
FROM Employees
WHERE EmployeeID = 1

下面是结果集:

Nancy Davolio
507 - 20th Ave. E.
Apt. 2A
Seattle            WA

 

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

语法
CHARINDEX ( expression1 , expression2 [ , start_location ] )

参数
expression1

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

expression2

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

start_location

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

返回类型
int

注释
如果 expression1 或 expression2 之一属于 Unicode 数据类型(nvarchar 或 nchar)而另一个不属
于,则将另一个转换为 Unicode 数据类型。

如果 expression1 或 expression2 之一为 NULL 值,则当数据库兼容级别为 70 或更大时,CHARINDEX
返回 NULL 值。当数据库兼容级别为 65 或更小时,CHARINDEX 仅在 expression1 和 expression2 都为
NULL 时返回 NULL 值。

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

示例
第一个代码示例返回序列"wonderful"在 titles 表的 notes 列中开始的位置。第二个示例使用可选的
start_location 参数从 notes 列的第五个字符开始寻找"wonderful"。第三个示例显示了当
expression2 内找不到 expression1 时的结果集。

USE pubs
GO
SELECT CHARINDEX(’wonderful’, notes)
FROM titles
WHERE title_id = ’TC3218’
GO

-- Use the optional start_location parameter to start searching
-- for wonderful starting with the fifth character in the notes
-- column.
USE pubs
GO
SELECT CHARINDEX(’wonderful’, notes, 5)
FROM titles
WHERE title_id = ’TC3218’
GO

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

-----------
46         

(1 row(s) affected)

USE pubs
GO
SELECT CHARINDEX(’wondrous’, notes)
FROM titles
WHERE title_id=’TC3218’
GO

下面是结果集。
-----------
0         

 

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

语法
DIFFERENCE ( character_expression , character_expression )

参数
character_expression

是类型 char 或 varchar 的表达式。

返回类型
int

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

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

USE pubs
GO
-- Returns a DIFFERENCE value of 4, the least possible difference.
SELECT SOUNDEX(’Green’),
  SOUNDEX(’Greene’), DIFFERENCE(’Green’,’Greene’)
GO
-- Returns a DIFFERENCE value of 0, the highest possible difference.
SELECT SOUNDEX(’Blotchet-Halls’),
  SOUNDEX(’Greene’), DIFFERENCE(’Blotchet-Halls’, ’Greene’)
GO

下面是结果集:

----- ----- -----------
G650  G650  4          

(1 row(s) affected)
                       
----- ----- -----------
B432  G650  0 

 

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

语法
LEFT ( character_expression , integer_expression )

参数
character_expression

字符或二进制数据表达式。character_expression 可以是常量、变量或列。character_expression 必须
是可以隐式地转换为 varchar 的数据类型。否则,请使用 CAST 函数显式转换 character_expression。

integer_expression

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

返回类型
varchar

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

示例
A. 对列使用 LEFT 函数
下面的示例返回每个书名最左边的 5 个字符。

USE pubs
GO
SELECT LEFT(title, 5)
FROM titles
ORDER BY title_id
GO

下面是结果集:

-----
The B
Cooki
You C
Strai
Silic
The G
The P
But I
Secre
Net E
Compu
Is An
Life 
Prolo
Emoti
Onion
Fifty
Sushi

(18 row(s) affected)

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

SELECT LEFT(’abcdefg’,2)
GO

下面是结果集:

--
ab

 

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

语法
LEN ( string_expression )

参数
string_expression

要计算的字符串表达式。

返回类型
int

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

USE Northwind
GO
SELECT LEN(CompanyName) AS ’Length’, CompanyName
FROM Customers
WHERE Country = ’Finland’

下面是结果集:

Length       CompanyName
-----------  ------------------------------
14           Wartian Herkku
11           Wilman Kala

 

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

语法
LOWER ( character_expression )

参数
character_expression

是字符或二进制数据表达式。character_expression 可以是常量、变量或列。character_expression 必
须是可以隐性转换为 varchar 的数据类型。否则,使用 CAST 显式转换 character_expression。

返回类型
varchar

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

USE pubs
GO
SELECT LOWER(SUBSTRING(title, 1, 20)) AS Lower,
   UPPER(SUBSTRING(title, 1, 20)) AS Upper,
   LOWER(UPPER(SUBSTRING(title, 1, 20))) As LowerUpper
FROM titles
WHERE price between 11.00 and 20.00
GO

下面是结果集:

Lower                   Upper                   LowerUpper          
--------------------    --------------------    --------------------
the busy executive’s    THE BUSY EXECUTIVE’S    the busy executive’s
cooking with compute    COOKING WITH COMPUTE    cooking with compute
straight talk about     STRAIGHT TALK ABOUT     straight talk about 
silicon valley gastr    SILICON VALLEY GASTR    silicon valley gastr
secrets of silicon v    SECRETS OF SILICON V    secrets of silicon v
prolonged data depri    PROLONGED DATA DEPRI    prolonged data depri
fifty years in bucki    FIFTY YEARS IN BUCKI    fifty years in bucki
sushi, anyone?          SUSHI, ANYONE?          sushi, anyone?      

(8 row(s) affected)

 

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

语法
LTRIM ( character_expression )

参数
character_expression

是字符或二进制数据表达式。character_expression 可以是常量、变量或列。character_expression 必
须是可以隐性转换为 varchar 的数据类型。否则,使用 CAST 显式转换 character_expression。

返回类型
varchar

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

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

DECLARE @string_to_trim varchar(60)
SET @string_to_trim = ’     Five spaces are at the beginning of this
   string.’
SELECT ’Here is the string without the leading spaces: ’ +
   LTRIM(@string_to_trim)
GO

下面是结果集:

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

 

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

语法
NCHAR ( integer_expression )

参数
integer_expression

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

返回类型
nchar(1)

示例
A. 使用 NCHAR 和 UNICODE
下面的示例使用 UNICODE 和 NCHAR 函数打印字符串 K?enhavn 第二个字符的 UNICODE 值和 NCHAR
(Unicode 字符),并打印实际的第二个字符?。

DECLARE @nstring nchar(8)
SET @nstring = N’K?benhavn’
SELECT UNICODE(SUBSTRING(@nstring, 2, 1)),
   NCHAR(UNICODE(SUBSTRING(@nstring, 2, 1)))
GO

下面是结果集:

----------- -
248         ?(1 row(s) affected)

B. 使用 SUBSTRING、UNICODE、CONVERT 和 NCHAR
下面的示例使用 SUBSTRING、UNICODE、CONVERT 和 NCHAR 函数打印字符串 K?enhavn 的字符数、
Unicode 字符以及每个字符的 UNICODE 值。

-- The @position variable holds the position of the character currently
-- being processed. The @nstring variable is the Unicode character
-- string to process.
DECLARE @position int, @nstring nchar(9)
-- Initialize the current position variable to the first character in
-- the string.
SET @position = 1
-- Initialize the character string variable to the string to process.
-- Notice that there is an N before the start of the string, which
-- indicates that the data following the N is Unicode data.
SET @nstring = N’K?benhavn’
-- Print the character number of the position of the string you’re at,
-- the actual Unicode character you’re processing, and the UNICODE value -- for this
particular character.
PRINT ’Character #’ + ’ ’ + ’Unicode Character’ + ’ ’ + ’UNICODE Value’
WHILE @position <= DATALENGTH(@nstring)
   BEGIN
   SELECT @position,
      NCHAR(UNICODE(SUBSTRING(@nstring, @position, 1))),
      CONVERT(NCHAR(17), SUBSTRING(@nstring, @position, 1)),
      UNICODE(SUBSTRING(@nstring, @position, 1))
   SELECT @position = @position + 1
   END
GO

下面是结果集:

Character # Unicode Character UNICODE Value
                                         
----------- ----------------- -----------
1           K                 75         
                                         
----------- ----------------- -----------
2           ?                 248        
                                         
----------- ----------------- -----------
3           b                 98         
                                         
----------- ----------------- -----------
4           e                 101        
                                         
----------- ----------------- -----------
5           n                 110        
                                         
----------- ----------------- -----------
6           h                 104        
                                         
----------- ----------------- -----------
7           a                 97         
                                         
----------- ----------------- -----------
8           v                 118        
                                         
----------- ----------------- -----------
9           n                 110        
                                         
----------- ----------------- -----------
10          (null)            (null)     
                                         
----------- ----------------- -----------
11          (null)            (null)     
                                         
----------- ----------------- -----------
12          (null)            (null)     
                                         
----------- ----------------- -----------
13          (null)            (null)     
                                         
----------- ----------------- -----------
14          (null)            (null)     
                                         
----------- ----------------- -----------
15          (null)            (null)     
                                         
----------- ----------------- -----------
16          (null)            (null)     
                                         
----------- ----------------- -----------
17          (null)            (null)     
                                         
----------- ----------------- -----------
18          (null)            (null)

 


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

语法
PATINDEX ( ’%pattern%’ , expression )

参数
pattern

一个字符串。可以使用通配符,但 pattern 之前和之后必须有 % 字符(搜索第一个和最后一个字符时除
外)。pattern 是短字符数据类型类别的表达式。

expression

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

返回类型
int

注释
PATINDEX 对 text 数据类型很有用;除 IS NULL、IS NOT NULL 和 LIKE(这些是 WHERE 子句中对
text 类型有效的仅有的其它比较运算)外,PATINDEX 也可用于 WHERE 子句中。

如果 pattern 或 expression 为 NULL,则当数据库的兼容级别为 70 时 PATINDEX 返回 NULL;如果数据
库兼容级别为 65 或更靠前,则仅当 pattern 和 expression 同时为 NULL 时,PATINDEX 返回 NULL。

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

USE pubs
GO
SELECT PATINDEX(’%wonderful%’, notes)
FROM titles
WHERE title_id = ’TC3218’
GO

下面是结果集:

-----------
46         

(1 row(s) affected)

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

B. 在 PATINDEX 中使用通配符
本示例使用通配符查找模式"won_erful"在 titles 表中 notes 列的某一特定行中的开始位置,其中下划线
为代表任何字符的通配符。

USE pubs
GO
SELECT PATINDEX(’%won_erful%’, notes)
FROM titles
WHERE title_id = ’TC3218’
GO

下面是结果集:

------------
46

(1 row(s) affected)

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

 

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

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

参数
’string_expression1’

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

’string_expression2’

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

’string_expression3’

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

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

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

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

下面是结果集:

------------
abxxxfghixxx
(1 row(s) affected)

 

12.QUOTENAME
返回带有分隔符的 Unicode 字符串,分隔符的加入可使输入的字符串成为有效的 Microsoft? SQL
Server? 分隔标识符。

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

参数
’{character}[...n]’

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

’quote_character’

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

返回类型
nvarchar(129)

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

SELECT QUOTENAME(’abc[]def’)

下面是结果集:

[abc[]]def]

(1 row(s) affected)

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

 

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

语法
REPLICATE ( character_expression , integer_expression )

参数
character_expression

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

integer_expression

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

返回类型
varchar

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

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

示例
A. 使用 REPLICATE
下例重复两遍每个作者的名字。

USE pubs
SELECT REPLICATE(au_fname, 2)
FROM authors
ORDER BY au_fname

下面是结果集:

----------------------
AbrahamAbraham                          
AkikoAkiko                              
AlbertAlbert                            
AnnAnn                                  
AnneAnne                                
BurtBurt                                
CharleneCharlene                        
CherylCheryl                            
DeanDean                                
DirkDirk                                
HeatherHeather                          
InnesInnes                              
JohnsonJohnson                          
LiviaLivia                              
MarjorieMarjorie                        
MeanderMeander                          
MichaelMichael                          
MichelMichel                            
MorningstarMorningstar                  
ReginaldReginald                        
SherylSheryl                            
StearnsStearns                          
SylviaSylvia                            
(23 row(s) affected)

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

-- Replicate phone number twice because the fax number is identical to
-- the author telephone number.
USE pubs
GO
SELECT SUBSTRING((UPPER(au_lname) + ’,’ + SPACE(1) + au_fname), 1, 35)
   AS Name, phone AS Phone, REPLICATE(phone,1) AS Fax
FROM authors
ORDER BY au_lname, au_fname
GO

下面是结果集:

Name                                Phone        Fax                   
----------------------------------- ------------ -----------------------
BENNET, Abraham                     415 658-9932 415 658-9932          
BLOTCHET-HALLS, Reginald            503 745-6402 503 745-6402          
CARSON, Cheryl                      415 548-7723 415 548-7723          
DEFRANCE, Michel                    219 547-9982 219 547-9982          
DEL CASTILLO, Innes                 615 996-8275 615 996-8275          
DULL, Ann                           415 836-7128 415 836-7128          
GREEN, Marjorie                     415 986-7020 415 986-7020          
GREENE, Morningstar                 615 297-2723 615 297-2723          
GRINGLESBY, Burt                    707 938-6445 707 938-6445          
HUNTER, Sheryl                      415 836-7128 415 836-7128          
KARSEN, Livia                       415 534-9219 415 534-9219          
LOCKSLEY, Charlene                  415 585-4620 415 585-4620          
MACFEATHER, Stearns                 415 354-7128 415 354-7128          
MCBADDEN, Heather                   707 448-4982 707 448-4982          
O’LEARY, Michael                    408 286-2428 408 286-2428          
PANTELEY, Sylvia                    301 946-8853 301 946-8853          
RINGER, Albert                      801 826-0752 801 826-0752          
RINGER, Anne                        801 826-0752 801 826-0752          
SMITH, Meander                      913 843-0462 913 843-0462          
STRAIGHT, Dean                      415 834-2919 415 834-2919          
STRINGER, Dirk                      415 843-2991 415 843-2991          
WHITE, Johnson                      408 496-7223 408 496-7223          
YOKOMOTO, Akiko                     415 935-4228 415 935-4228          
(23 row(s) affected)

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

USE Northwind
GO
DROP TABLE t1
GO
CREATE TABLE t1
(
 c1 varchar(3),
 c2 char(3)
)
GO
INSERT INTO t1 VALUES (’2’, ’2’)
INSERT INTO t1 VALUES (’37’, ’37’)
INSERT INTO t1 VALUES (’597’, ’597’)
GO
SELECT REPLICATE(’0’, 3 - DATALENGTH(c1)) + c1 AS [Varchar Column],
       REPLICATE(’0’, 3 - DATALENGTH(c2)) + c2 AS [Char Column]
FROM t1
GO

 

14.REVERSE
返回字符表达式的反转。

语法
REVERSE ( character_expression )

参数
character_expression

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

返回类型
varchar

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

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

USE pubs
GO
SELECT REVERSE(au_fname)
FROM authors
ORDER BY au_fname
GO

下面是结果集:

--------------------
maharbA             
okikA               
treblA              
nnA                 
ennA                
truB                
enelrahC            
lyrehC              
naeD                
kriD                
rehtaeH             
sennI               
nosnhoJ             
aiviL               
eirojraM            
rednaeM             
leahciM             
lehciM              
ratsgninroM         
dlanigeR            
lyrehS              
snraetS             
aivlyS              
(23 row(s) affected)

 

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

语法
RIGHT ( character_expression , integer_expression )

参数
character_expression

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

integer_expression

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

返回类型
varchar

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

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

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

USE pubs
GO
SELECT RIGHT(au_fname, 5)
FROM authors
ORDER BY au_fname
GO

下面是结果集:

------------------
raham
Akiko
lbert
Ann  
Anne 
Burt 
rlene
heryl
Dean 
Dirk 
ather
Innes
hnson
Livia
jorie
ander
chael
ichel
gstar
inald
heryl
earns
ylvia
(23 row(s) affected)

 

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

语法
RTRIM ( character_expression )

参数
character_expression

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

返回类型
varchar

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

 

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


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

DECLARE @string_to_trim varchar(60)
SET @string_to_trim = ’Four spaces are after the period in this sentence.    ’
SELECT ’Here is the string without the leading spaces: ’ + CHAR(13) +
   RTRIM(@string_to_trim)
GO

下面是结果集:

(1 row(s) affected)
------------------------------------------------------------------------
Here is the string without the leading spaces: Four spaces are after the period in this
sentence.          
(1 row(s) affected)

 


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

语法
SOUNDEX ( character_expression )

参数
character_expression

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

返回类型
char

注释
SOUNDEX 将 alpha 字符串转换成由四个字符组成的代码,以查找相似的词或名称。代码的第一个字符是
character_expression 的第一个字符,代码的第二个字符到第四个字符是数字。将忽略
character_expression 中的元音,除非它们是字符串的第一个字母。可以嵌套字符串函数。

示例
下例显示 SOUNDEX 函数及相关的 DIFFERENCE 函数。在第一个示例中,返回所有辅音字母的标准 SOUNDEX
值。为 Smith 和 Smythe 返回的 SOUNDEX 结果相同,因为不包括所有元音、字母 y、连写字母和字母 h。

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

下面是结果集:

----- -----
S530  S530 

(1 row(s) affected)

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

-- Using DIFFERENCE
SELECT DIFFERENCE(’Smithers’, ’Smythers’)
GO

下面是结果集:

-----------
4          

(1 row(s) affected)

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

SELECT DIFFERENCE(’Anothers’, ’Brothers’)
GO

下面是结果集:

-----------
2          

 

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

语法
SPACE ( integer_expression )

参数
integer_expression

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

返回类型
char

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

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

USE pubs
GO
SELECT RTRIM(au_lname) + ’,’ + SPACE(2) +  LTRIM(au_fname)
FROM authors
ORDER BY au_lname, au_fname
GO

下面是结果集:

Name                                                           
---------------------------------------------------------------
Bennet,  Abraham                                               
Blotchet-Halls,  Reginald                                      
Carson,  Cheryl                                                
DeFrance,  Michel                                              
del Castillo,  Innes                                           
Dull,  Ann                                                     
Green,  Marjorie                                               
Greene,  Morningstar                                           
Gringlesby,  Burt                                              
Hunter,  Sheryl                                                
Karsen,  Livia                                                 
Locksley,  Charlene                                            
MacFeather,  Stearns                                           
McBadden,  Heather                                             
O’Leary,  Michael                                              
Panteley,  Sylvia                                              
Ringer,  Albert                                                
Ringer,  Anne                                                  
Smith,  Meander                                                
Straight,  Dean                                                
Stringer,  Dirk                                                
White,  Olivier                                                
Yokomoto,  Akiko                                               

(23 row(s) affected)

 

19.STR
由数字数据转换来的字符数据。

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

参数
float_expression

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

length

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

decimal

是小数点右边的位数。

返回类型
char

注释
如果为 STR 提供 length 和 decimal 参数值,则这些值应该是正数。在默认情况下或者小数参数为 0 时,
数字四舍五入为整数。指定长度应该大于或等于小数点前面的数字加上数字符号(若有)的长度。短的
float_expression 在指定长度内右对齐,长的 float_expression 则截断为指定的小数位数。例如,STR
(12,10) 输出的结果是 12,在结果集内右对齐。而 STR(1223, 2) 则将结果集截断为 **。可以嵌套字符串
函数。

 

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


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

SELECT STR(123.45, 6, 1)
GO

下面是结果集:

------
 123.5

(1 row(s) affected)

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

SELECT STR(123.45, 2, 2)
GO

下面是结果集:

--
**

(1 row(s) affected)

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

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

下面是结果集:

--------
 123.000

(1 row(s) affected)

B. 使用 STR 和 CONVERT 函数
下例比较 STR 和 CONVERT 的结果。

SELECT STR(3.147) AS ’STR’,
       STR(3.147, 5, 2) AS ’2 decimals’,
       STR(3.147, 5, 3) AS ’3 decimals’
GO

下面是结果集:

STR        2 decimals 3 decimals
---------- ---------- ----------
         3  3.15      3.147     

(1 row(s) affected)

-- Use CONVERT.
SELECT CONVERT(char(1), 3.147) AS ’CHAR(1)’,
       CONVERT(char(3), 3.147) AS ’CHAR(3)’,
       CONVERT(char(5), 3.147) AS ’CHAR(5)’
GO

下面是结果集:

CHAR(1) CHAR(3) CHAR(5)
------- ------- -------
(null)  (null)  3.147  

 


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

语法
STUFF ( character_expression , start , length , character_expression )

参数
character_expression

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

start

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

length

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

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

注释
可以嵌套字符串函数。

示例
下例通过在第一个字符串 (abcdef) 中删除从第二个位置(字符 b)开始的三个字符,然后在删除的起始位置
插入第二个字符串,创建并返回一个字符串。

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

下面是结果集:

---------
aijklmnef

 

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

语法
STUFF ( character_expression , start , length , character_expression )

参数
character_expression

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

start

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

length

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

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

注释
可以嵌套字符串函数。

示例
下例通过在第一个字符串 (abcdef) 中删除从第二个位置(字符 b)开始的三个字符,然后在删除的起始位置
插入第二个字符串,创建并返回一个字符串。

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

下面是结果集:

---------
aijklmnef

 

22.SUBSTRING
返回字符、binary、text 或 image 表达式的一部分。有关可与该函数一起使用的有效 Microsoft? SQL
Server? 数据类型的更多信息,请参见数据类型。

语法
SUBSTRING ( expression , start , length )

参数
expression

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

start

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

length

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

 

说明  由于在 text 数据上使用 SUBSTRING 时 start 和 length 指定字节数,因此 DBCS 数据(如日本
汉字)可能导致在结果的开始或结束位置拆分字符。此行为与 READTEXT 处理 DBCS 的方式一致。然而,由
于偶而会出现奇怪的结果,建议对 DBCS 字符使用 ntext 而非 text。


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

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

给定的表达式 返回类型
text varchar
image varbinary
ntext nvarchar


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

 

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


示例
A. 在字符串上使用 SUBSTRING
下例显示如何只返回字符串的一部分。该查询在一列中返回 authors 表中的姓氏,在另一列中返回
authors 表中的名字首字母。

USE pubs
SELECT au_lname, SUBSTRING(au_fname, 1, 1)
FROM authors
ORDER BY au_lname

下面是结果集:

au_lname                                  
---------------------------------------- -
Bennet                                   A
Blotchet-Halls                           R
Carson                                   C
DeFrance                                 M
del Castillo                             I
...
Yokomoto                                 A

(23 row(s) affected)

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

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

下面是结果集:

x
----------
bcd

(1 row(s) affected)

B. 在 text、ntext 和 image 数据上使用 SUBSTRING
下例显示如何从 pubs 数据库的 publishers 表内的每个 text 和 image 数据列中返回前 200 个字符。
text 数据以 varchar 的形式返回,image 数据则以 varbinary 的形式返回。

USE pubs
SELECT pub_id, SUBSTRING(logo, 1, 10) AS logo,
   SUBSTRING(pr_info, 1, 10) AS pr_info
FROM pub_info
WHERE pub_id = ’1756’

下面是结果集:

pub_id logo                   pr_info   
------ ---------------------- ----------
1756   0x474946383961E3002500 This is sa

(1 row(s) affected)

下例显示 SUBSTRING 在 text 和 ntext 数据上的效果。首先,下例在 pubs 数据库内创建一个名为
npr_info 的新表。然后,在 npr_info 表中用 pub_info.pr_info 列的前 80 个字符创建 pr_info 列,
并添加ü作为首字符。最后,INNER JOIN 检索所有出版商标识号以及 text 和 ntext 出版商信息列的
SUBSTRING。

IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES
      WHERE table_name = ’npub_info’)
   DROP TABLE npub_info
GO
-- Create npub_info table in pubs database. Borrowed from instpubs.sql.
USE pubs
GO
CREATE TABLE npub_info
(
 pub_id         char(4)           NOT NULL
         REFERENCES publishers(pub_id)
         CONSTRAINT UPKCL_npubinfo PRIMARY KEY CLUSTERED,
 pr_info        ntext             NULL
)

GO

-- Fill the pr_info column in npub_info with international data.
RAISERROR(’Now at the inserts to pub_info...’,0,1)

GO

INSERT npub_info VALUES(’0736’, N’üThis is sample text data for New Moon Books, publisher
0736 in the pubs database’)
INSERT npub_info values(’0877’, N’üThis is sample text data for Binnet & Hardley,
publisher 0877 in the pubs databa’)
INSERT npub_info values(’1389’, N’üThis is sample text data for Algodata Infosystems,
publisher 1389 in the pubs da’)
INSERT npub_info values(’9952’, N’üThis is sample text data for Scootney Books, publisher
9952 in the pubs database’)
INSERT npub_info values(’1622’, N’üThis is sample text data for Five Lakes Publishing,
publisher 1622 in the pubs d’)
INSERT npub_info values(’1756’, N’üThis is sample text data for Ramona Publishers,
publisher 1756 in the pubs datab’)
INSERT npub_info values(’9901’, N’üThis is sample text data for GGG&G, publisher 9901 in
the pubs database. GGG&G i’)
INSERT npub_info values(’9999’, N’üThis is sample text data for Lucerne Publishing,
publisher 9999 in the pubs data’)
GO
-- Join between npub_info and pub_info on pub_id.
SELECT pr.pub_id, SUBSTRING(pr.pr_info, 1, 35) AS pr_info,
   SUBSTRING(npr.pr_info, 1, 35) AS npr_info
FROM pub_info pr INNER JOIN npub_info npr
   ON pr.pub_id = npr.pub_id
ORDER BY pr.pub_id ASC

 

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

语法
UNICODE ( ’ncharacter_expression’ )

参数
’ncharacter_expression’

是 nchar 或 nvarchar 表达式。

返回类型
int

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

DECLARE @nstring nchar(12)
SET @nstring = N’?kergatan 24’
SELECT UNICODE(@nstring), NCHAR(UNICODE(@nstring))

下面是结果集:

----------- -
197         ?
B. 使用 SUBSTRING、UNICODE 和 CONVERT 函数
下面的示例使用 SUBSTRING、UNICODE 和 CONVERT 函数输出字符串 ?kergatan 24 中每个字符的字符号、
Unicode 字符和 UNICODE 值。

-- The @position variable holds the position of the character currently
-- being processed. The @nstring variable is the Unicode character
-- string to process.
DECLARE @position int, @nstring nchar(12)
-- Initialize the current position variable to the first character in
-- the string.
SET @position = 1
-- Initialize the character string variable to the string to process.
-- Notice that there is an N before the start of the string, which
-- indicates that the data following the N is Unicode data.
SET @nstring = N’?kergatan 24’
-- Print the character number of the position of the string you are at,
-- the actual Unicode character you are processing, and the UNICODE
-- value for this particular character.
PRINT ’Character #’ + ’ ’ + ’Unicode Character’ + ’ ’ + ’UNICODE Value’
WHILE @position <= DATALENGTH(@nstring)
-- While these are still characters in the character string,
   BEGIN
   SELECT @position,
      CONVERT(char(17), SUBSTRING(@nstring, @position, 1)),
      UNICODE(SUBSTRING(@nstring, @position, 1))
   SELECT @position = @position + 1
   END

下面是结果集:

Character # Unicode Character UNICODE Value
                                         
----------- ----------------- -----------
1           ?                 197        
                                         
----------- ----------------- -----------
2           k                 107        
                                         
----------- ----------------- -----------
3           e                 101        
                                         
----------- ----------------- -----------
4           r                 114        
                                         
----------- ----------------- -----------
5           g                 103        
                                         
----------- ----------------- -----------
6           a                 97         
                                         
----------- ----------------- -----------
7           t                 116        
                                         
----------- ----------------- -----------
8           a                 97         
                                         
----------- ----------------- -----------
9           n                 110        
                                         
----------- ----------------- -----------
10                            32         
                                         
----------- ----------------- -----------
11          2                 50         
                                         
----------- ----------------- -----------
12          4                 52

 

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

语法
UPPER ( character_expression )

参数
character_expression

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

返回类型
varchar

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

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

USE pubs
GO
SELECT UPPER(RTRIM(au_lname)) + ’, ’ + au_fname AS Name
FROM authors
ORDER BY au_lname
GO

下面是结果集:

Name                                                          
--------------------------------------------------------------
BENNET, Abraham                                               
BLOTCHET-HALLS, Reginald                                      
CARSON, Cheryl                                                
DEFRANCE, Michel                                              
DEL CASTILLO, Innes                                           
DULL, Ann                                                     
GREEN, Marjorie                                               
GREENE, Morningstar                                           
GRINGLESBY, Burt                                              
HUNTER, Sheryl                                                
KARSEN, Livia                                                 
LOCKSLEY, Charlene                                            
MACFEATHER, Stearns                                           
MCBADDEN, Heather                                             
O’LEARY, Michael                                              
PANTELEY, Sylvia                                              
RINGER, Albert                                                
RINGER, Anne                                                  
SMITH, Meander                                                
STRAIGHT, Dean                                                
STRINGER, Dirk                                                
WHITE, Johnson                                                
YOKOMOTO, Akiko

 


 

系统函数


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

语法
APP_NAME ( )

返回类型
nvarchar(128)

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

DECLARE @CurrentApp varchar(35)
SET @CurrentApp = APP_NAME()
IF @CurrentApp <> ’MS SQL Query Analyzer’
PRINT ’This process was not started by a SQL Query Analyzer query session.’

 

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

CASE 具有两种格式:

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


CASE 搜索函数计算一组布尔表达式以确定结果。
两种格式都支持可选的 ELSE 参数。

语法
简单 CASE 函数:

CASE input_expression
    WHEN when_expression THEN result_expression
        [ ...n ]
    [
        ELSE else_result_expression
    END

CASE 搜索函数:

CASE
    WHEN Boolean_expression THEN result_expression
        [ ...n ]
    [
        ELSE else_result_expression
    END

参数
input_expression

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

WHEN when_expression

使用简单 CASE 格式时 input_expression 所比较的简单表达式。When_expression 是任意有效的 SQL
Server 表达式。Input_expression 和每个 when_expression 的数据类型必须相同,或者是隐性转换。

n

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

THEN result_expression

当 input_expression = when_expression 取值为 TRUE,或者 Boolean_expression 取值为 TRUE 时返
回的表达式。result expression 是任意有效的 SQL Server 表达式。

ELSE else_result_expression

当比较运算取值不为 TRUE 时返回的表达式。如果省略此参数并且比较运算取值不为 TRUE,CASE 将返回
NULL 值。Else_result_expression 是任意有效的 SQL Server 表达式。Else_result_expression 和所
有 result_expression 的数据类型必须相同,或者必须是隐性转换。

WHEN Boolean_expression

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

结果类型
从 result_expressions 和可选 else_result_expression 的类型集合中返回最高的优先规则类型。有关
更多信息,请参见数据类型的优先顺序。

结果值
简单 CASE 函数:
计算 input_expression,然后按指定顺序对每个 WHEN 子句的 input_expression = when_expression
进行计算。


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


如果没有取值为 TRUE 的 input_expression = when_expression,则当指定 ELSE 子句时 SQL Server
将返回 else_result_expression;若没有指定 ELSE 子句,则返回 NULL 值。
CASE 搜索函数:
按指定顺序为每个 WHEN 子句的 Boolean_expression 求值。


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


如果没有取值为 TRUE 的 Boolean_expression,则当指定 ELSE 子句时 SQL Server 将返回
else_result_expression;若没有指定 ELSE 子句,则返回 NULL 值。
示例
A. 使用带有简单 CASE 函数的 SELECT 语句
在 SELECT 语句中,简单 CASE 函数仅检查是否相等,而不进行其它比较。下面的示例使用 CASE 函数更改
图书分类显示,以使其更易于理解。

USE pubs
GO
SELECT   Category =
      CASE type
         WHEN ’popular_comp’ THEN ’Popular Computing’
         WHEN ’mod_cook’ THEN ’Modern Cooking’
         WHEN ’business’ THEN ’Business’
         WHEN ’psychology’ THEN ’Psychology’
         WHEN ’trad_cook’ THEN ’Traditional Cooking’
         ELSE ’Not yet categorized’
      END,
   CAST(title AS varchar(25)) AS ’Shortened Title’,
   price AS Price
FROM titles
WHERE price IS NOT NULL
ORDER BY type, price
COMPUTE AVG(price) BY type
GO

下面是结果集:

Category            Shortened Title           Price                     
------------------- ------------------------- --------------------------
Business            You Can Combat Computer S 2.99                      
Business            Cooking with Computers: S 11.95                     
Business            The Busy Executive’s Data 19.99                     
Business            Straight Talk About Compu 19.99                     

                                              avg
                                              ==========================
                                              13.73                     

Category            Shortened Title           Price                     
------------------- ------------------------- --------------------------
Modern Cooking      The Gourmet Microwave     2.99                      
Modern Cooking      Silicon Valley Gastronomi 19.99                     

                                              avg
                                              ==========================
                                              11.49                     

Category            Shortened Title           Price                     
------------------- ------------------------- --------------------------
Popular Computing   Secrets of Silicon Valley 20.00                     
Popular Computing   But Is It User Friendly?  22.95                     

                                              avg
                                              ==========================
                                              21.48                     

Category            Shortened Title           Price                     
------------------- ------------------------- --------------------------
Psychology          Life Without Fear         7.00                      
Psychology          Emotional Security: A New 7.99                      
Psychology          Is Anger the Enemy?       10.95                     
Psychology          Prolonged Data Deprivatio 19.99                     
Psychology          Computer Phobic AND Non-P 21.59                     

                                              avg
                                              ==========================
                                              13.50                     

Category            Shortened Title           Price                     
------------------- ------------------------- --------------------------
Traditional Cooking Fifty Years in Buckingham 11.95                     
Traditional Cooking Sushi, Anyone?            14.99                     
Traditional Cooking Onions, Leeks, and Garlic 20.95                     

                                              avg
                                              ==========================
                                              15.96                     

(21 row(s) affected)

B. 使用带有简单 CASE 函数和 CASE 搜索函数的 SELECT 语句
在 SELECT 语句中,CASE 搜索函数允许根据比较值在结果集内对值进行替换。下面的示例根据图书的价格范
围将价格(money 列)显示为文本注释。

USE pubs
GO
SELECT    ’Price Category’ =
      CASE
         WHEN price IS NULL THEN ’Not yet priced’
         WHEN price < 10 THEN ’Very Reasonable Title’
         WHEN price >= 10 and price < 20 THEN ’Coffee Table Title’
         ELSE ’Expensive book!’
      END,
   CAST(title AS varchar(20)) AS ’Shortened Title’
FROM titles
ORDER BY price
GO

下面是结果集:

Price Category        Shortened Title     
--------------------- --------------------
Not yet priced        Net Etiquette       
Not yet priced        The Psychology of Co
Very Reasonable Title The Gourmet Microwav
Very Reasonable Title You Can Combat Compu
Very Reasonable Title Life Without Fear   
Very Reasonable Title Emotional Security: 
Coffee Table Title    Is Anger the Enemy? 
Coffee Table Title    Cooking with Compute
Coffee Table Title    Fifty Years in Bucki
Coffee Table Title    Sushi, Anyone?      
Coffee Table Title    Prolonged Data Depri
Coffee Table Title    Silicon Valley Gastr
Coffee Table Title    Straight Talk About 
Coffee Table Title    The Busy Executive’s
Expensive book!       Secrets of Silicon V
Expensive book!       Onions, Leeks, and G
Expensive book!       Computer Phobic And 
Expensive book!       But Is It User Frien

(18 row(s) affected)

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

USE pubs
SELECT SUBSTRING((RTRIM(a.au_fname) + ’ ’+
   RTRIM(a.au_lname) + ’ ’), 1, 25) AS Name, a.au_id, ta.title_id,
   Type =
  CASE
    WHEN SUBSTRING(ta.title_id, 1, 2) = ’BU’ THEN ’Business’
    WHEN SUBSTRING(ta.title_id, 1, 2) = ’MC’ THEN ’Modern Cooking’
    WHEN SUBSTRING(ta.title_id, 1, 2) = ’PC’ THEN ’Popular Computing’
    WHEN SUBSTRING(ta.title_id, 1, 2) = ’PS’ THEN ’Psychology’
    WHEN SUBSTRING(ta.title_id, 1, 2) = ’TC’ THEN ’Traditional Cooking’
  END
FROM titleauthor ta JOIN authors a ON ta.au_id = a.au_id

下面是结果集:

Name                      au_id       title_id Type               
------------------------- ----------- -------- -------------------
Johnson White             172-32-1176 PS3333   Psychology         
Marjorie Green            213-46-8915 BU1032   Business           
Marjorie Green            213-46-8915 BU2075   Business           
Cheryl Carson             238-95-7766 PC1035   Popular Computing  
Michael O’Leary           267-41-2394 BU1111   Business           
Michael O’Leary           267-41-2394 TC7777   Traditional Cooking
Dean Straight             274-80-9391 BU7832   Business           
Abraham Bennet            409-56-7008 BU1032   Business           
Ann Dull                  427-17-2319 PC8888   Popular Computing  
Burt Gringlesby           472-27-2349 TC7777   Traditional Cooking
Charlene Locksley         486-29-1786 PC9999   Popular Computing  
Charlene Locksley         486-29-1786 PS7777   Psychology         
Reginald Blotchet-Halls   648-92-1872 TC4203   Traditional Cooking
Akiko Yokomoto            672-71-3249 TC7777   Traditional Cooking
Innes del Castillo        712-45-1867 MC2222   Modern Cooking     
Michel DeFrance           722-51-5454 MC3021   Modern Cooking     
Stearns MacFeather        724-80-9391 BU1111   Business           
Stearns MacFeather        724-80-9391 PS1372   Psychology         
Livia Karsen              756-30-7391 PS1372   Psychology         
Sylvia Panteley           807-91-6654 TC3218   Traditional Cooking
Sheryl Hunter             846-92-7186 PC8888   Popular Computing  
Anne Ringer               899-46-2035 MC3021   Modern Cooking     
Anne Ringer               899-46-2035 PS2091   Psychology         
Albert Ringer             998-72-3567 PS2091   Psychology         
Albert Ringer             998-72-3567 PS2106   Psychology         

(25 row(s) affected)

 

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

语法
COALESCE ( expression [ ,...n ] )

参数
expression

任何类型的表达式。

n

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

返回类型
将相同的值作为 expression 返回。

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

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

CASE
   WHEN (expression1 IS NOT NULL) THEN expression1
   ...
   WHEN (expressionN IS NOT NULL) THEN expressionN
   ELSE NULL

示例
在下面的示例中,显示包含三列有关某个雇员每年工资收入信息的 wages 表:hourly_wage、salary 和
commission。但是,每个雇员只能接受一种付款方式。若要确定支付给所有雇员的工资总额,请使用
COALESCE 函数接受在 hourly_wage、salary 和 commission 中找到的非空值。

SET NOCOUNT ON
GO
USE master
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = ’wages’)
   DROP TABLE wages
GO
CREATE TABLE wages
(
   emp_id      tinyint    identity,
   hourly_wage   decimal   NULL,
   salary      decimal    NULL,
   commission   decimal   NULL,
   num_sales   tinyint   NULL
)
GO
INSERT wages VALUES(10.00, NULL, NULL, NULL)
INSERT wages VALUES(20.00, NULL, NULL, NULL)
INSERT wages VALUES(30.00, NULL, NULL, NULL)
INSERT wages VALUES(40.00, NULL, NULL, NULL)
INSERT wages VALUES(NULL, 10000.00, NULL, NULL)
INSERT wages VALUES(NULL, 20000.00, NULL, NULL)
INSERT wages VALUES(NULL, 30000.00, NULL, NULL)
INSERT wages VALUES(NULL, 40000.00, NULL, NULL)
INSERT wages VALUES(NULL, NULL, 15000, 3)
INSERT wages VALUES(NULL, NULL, 25000, 2)
INSERT wages VALUES(NULL, NULL, 20000, 6)
INSERT wages VALUES(NULL, NULL, 14000, 4)
GO
SET NOCOUNT OFF
GO
SELECT CAST(COALESCE(hourly_wage * 40 * 52,
   salary,
   commission * num_sales) AS money) AS ’Total Salary’
FROM wages
GO

下面是结果集:

Total Salary
------------
20800.0000
41600.0000
62400.0000
83200.0000
10000.0000
20000.0000
30000.0000
40000.0000
45000.0000
50000.0000
120000.0000
56000.0000

(12 row(s) affected)

 


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

语法
COLLATIONPROPERTY( collation_name, property )

参数
collation_name

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

property

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

属性名称 描述
CodePage 排序规则的 nonUnicode 代码页。
LCID 排序规则的 Windows LCID。
为 SQL 排序规则返回 NULL。
ComparisonStyle 排序规则的 Windows 比较风格。
为二进制或 SQL 排序规则返回 NULL。


返回类型
sql_variant

示例
SELECT COLLATIONPROPERTY(’Traditional_Spanish_CS_AS_KS_WS’, ’CodePage’)

结果集

1252

 

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

语法
CURRENT_TIMESTAMP

返回类型
datetime

示例
A. 使用 CURRENT_TIMESTAMP 返回当前的日期和时间
下面的示例返回 CURRENT_TIMESTAMP 的值和一个文本描述。

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

下面是结果集:

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

(1 row(s) affected)

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

USE pubs
GO
CREATE TABLE sales2
(
 sales_id int IDENTITY(10000, 1) NOT NULL,
 cust_id  int NOT NULL,
 sales_date datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
 sales_amt money NOT NULL,
 delivery_date datetime NOT NULL DEFAULT DATEADD(dd, 10, GETDATE())
)
GO
INSERT sales2 (cust_id, sales_amt)
   VALUES (20000, 550)

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

USE pubs
GO
SELECT *
FROM sales2
GO

下面是结果集:

sales_id    cust_id    sales_date          sales_amt delivery_date              
----------- ---------- ------------------- --------- -------------------
10000       20000      Mar 4 1998 10:06AM  550.00    Mar 14 1998 10:06AM

(1 row(s) affected)

 

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

语法
CURRENT_USER

返回类型
sysname

示例
A. 使用 CURRENT_USER 返回当前的用户名
下面的示例将一个变量声明为 char,并将 CURRENT_USER 的当前值指派给它,然后返回该变量,返回时还带
有一个文本描述。

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

下面是结果集:

---------------------------------------------------
The current user is: dbo                           

(1 row(s) affected)

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

USE pubs
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = ’orders2’)
   DROP TABLE orders2
GO
SET NOCOUNT ON
CREATE TABLE orders2
(
 order_id int IDENTITY(1000, 1) NOT NULL,
 cust_id  int NOT NULL,
 order_date datetime NOT NULL DEFAULT GETDATE(),
 order_amt money NOT NULL,
 order_person char(30) NOT NULL DEFAULT CURRENT_USER
)
GO
INSERT orders2 (cust_id, order_amt)
VALUES (5105, 577.95)
GO
SET NOCOUNT OFF

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

SELECT *
FROM orders2

下面是结果集:

order_id    cust_id     order_date             order_amt   
order_person                  
----------- ----------- ------------------- ------------- --------------
1000        5105        Mar 4 1998 10:13AM      577.95          
dbo                           

(1 row(s) affected)

 

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

语法
DATALENGTH ( expression )

参数
expression

任何类型的表达式。

返回类型
int

注释
DATALENGTH 对 varchar、varbinary、text、image、nvarchar 和 ntext 数据类型特别有用,因为这些
数据类型可以存储可变长度数据。

NULL 的 DATALENGTH 的结果是 NULL。

 

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


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

USE pubs
GO
SELECT length = DATALENGTH(pub_name), pub_name
FROM publishers
ORDER BY pub_name
GO

下面是结果集:

length      pub_name                                
----------- ----------------------------------------
20          Algodata Infosystems                    
16          Binnet & Hardley                        
21          Five Lakes Publishing                   
5           GGG&G                                   
18          Lucerne Publishing                      
14          New Moon Books                          
17          Ramona Publishers                       
14          Scootney Books                          

(8 row(s) affected)

 

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

语法
@@ERROR

返回类型
integer

注释
当 Microsoft? SQL Server? 完成 Transact-SQL 语句的执行时,如果语句执行成功,则 @@ERROR 设置
为 0。若出现一个错误,则返回一条错误信息。@@ERROR 返回此错误信息代码,直到另一条 Transact-SQL
语句被执行。您可以在 sysmessages 系统表中查看与 @@ERROR 错误代码相关的文本信息。

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

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

USE pubs
GO
UPDATE authors SET au_id = ’172 32 1176’
WHERE au_id = "172-32-1176"

IF @@ERROR = 547
   print "A check constraint violation occurred"

B.用 @@ERROR 有条件地退出一个过程
在此示例中,IF...ELSE 语句在存储过程中的 INSERT 语句后检测 @@ERROR。@@ERROR 变量的值将决定传给
调用程序的返回值,以指示此过程的成功与失败。

USE pubs
GO

-- Create the procedure.
CREATE PROCEDURE add_author
@au_id varchar(11),@au_lname varchar(40),
@au_fname varchar(20),@phone char(12),
@address varchar(40) = NULL,@city varchar(20) = NULL,
@state char(2) = NULL,@zip char(5) = NULL,
@contract bit = NULL
AS

-- Execute the INSERT statement.
INSERT INTO authors
(au_id,  au_lname, au_fname, phone, address,
 city, state, zip, contract) values
(@au_id,@au_lname,@au_fname,@phone,@address,
 @city,@state,@zip,@contract)

-- Test the error value.
IF @@ERROR <> 0
BEGIN
   -- Return 99 to the calling program to indicate failure.
   PRINT "An error occurred loading the new author information"
   RETURN(99)
END
ELSE
BEGIN
   -- Return 0 to the calling program to indicate success.
   PRINT "The new author information has been loaded"
   RETURN(0)
END
GO

C.用 @@ERROR 检测几条语句的成功
下面的示例取决于 INSERT 和 DELETE 语句的成功操作。局部变量在两条语句后均被设置为 @@ERROR 的值,
并且用于此操作的共享错误处理例程中。

USE pubs
GO
DECLARE @del_error int, @ins_error int
-- Start a transaction.
BEGIN TRAN

-- Execute the DELETE statement.
DELETE authors
WHERE au_id = ’409-56-7088’

-- Set a variable to the error value for
-- the DELETE statement.
SELECT @del_error = @@ERROR

-- Execute the INSERT statement.
INSERT authors
   VALUES(’409-56-7008’, ’Bennet’, ’Abraham’, ’415 658-9932’,
   ’6223 Bateman St.’, ’Berkeley’, ’CA’, ’94705’, 1)
-- Set a variable to the error value for
-- the INSERT statement.
SELECT @ins_error = @@ERROR

-- Test the error values.
IF @del_error = 0 AND @ins_error = 0
BEGIN
   -- Success. Commit the transaction.
   PRINT "The author information has been replaced"   
   COMMIT TRAN
END
ELSE
BEGIN
   -- An error occurred. Indicate which operation(s) failed
   -- and roll back the transaction.
   IF @del_error <> 0
      PRINT "An error occurred during execution of the DELETE
      statement."

   IF @ins_error <> 0
      PRINT "An error occurred during execution of the INSERT
      statement."

   ROLLBACK TRAN
END
GO

D. 与 @@ROWCOUNT 一同使用 @@ERROR
下面的示例用 @@ERROR 和 @@ROWCOUNT 验证一条 UPDATE 语句的操作。为任何可能出现的错误而检验
@@ERROR 的值,而用 @@ROWCOUNT 保证更新已成功应用于表中的某行。

USE pubs
GO
CREATE PROCEDURE change_publisher
@title_id tid,
@new_pub_id char(4)
AS

-- Declare variables used in error checking.
DECLARE @error_var int, @rowcount_var int

-- Execute the UPDATE statement.
UPDATE titles SET pub_id = @new_pub_id
WHERE title_id = @title_id

-- Save the @@ERROR and @@ROWCOUNT values in local
-- variables before they are cleared.
SELECT @error_var = @@ERROR, @rowcount_var = @@ROWCOUNT

-- Check for errors. If an invalid @new_pub_id was specified
-- the UPDATE statement returns a foreign-key violation error #547.
IF @error_var <> 0
BEGIN
   IF @error_var = 547
   BEGIN
      PRINT "ERROR: Invalid ID specified for new publisher"
      RETURN(1)
   END
   ELSE
   BEGIN
      PRINT "ERROR: Unhandled error occurred"
      RETURN(2)
   END
END

-- Check the rowcount. @rowcount_var is set to 0
-- if an invalid @title_id was specified.
IF @rowcount_var = 0
BEGIN
   PRINT "Warning: The title_id specified is not valid"
   RETURN(1)
END
ELSE
BEGIN
   PRINT "The book has been updated with the new publisher"
   RETURN(0)
END
GO

 

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

语法
fn_helpcollations ()

返回表
fn_helpcollations 返回下列信息。

列名 数据类型 描述
Name sysname 标准排序规则名称
Description nvarchar(1000) 对排序规则的描述

 

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

语法
fn_servershareddrives()

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

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

名称 数据类型 描述
DriveName nchar(1) 共享驱动器的名称


注释
fn_servershareddrives 返回该群集服务器使用的共享驱动器的列表。这些共享驱动器与 SQL Server 资源
属于同一群集组。此外,SQL Server 资源依赖于这些驱动器。

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

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

SELECT *
FROM ::fn_servershareddrives()

下面是结果集:

DriveName
--------
m
n

 

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

语法
fn_virtualfilestats ( [@DatabaseID=] database_id
    , [ @FileID = ] file_id )

参数
[@DatabaseID=] database_id

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

[ @FileID = ] file_id

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

返回表
Column Name 数据类型 描述
DbId smallint 数据库 ID
FileId smallint 文件 ID
TimeStamp int 提取数据的时间
NumberReads bigint 在文件上发出的读取次数
NumberWrites bigint 在文件上写入的次数
BytesRead bigint 在文件上发出的读取字节数
BytesWritten bigint 在文件上写入的字节数
IoStallMS bigint 用户等待在文件上完成 I/O 活动的总计时间(以毫秒为单位)


注释
fn_virtualfilestats 是系统表值函数,提供统计信息,如在文件上操作的 I/O 活动的总数。该函数有助于
跟踪用户必须等待以读取或写入文件的时间长度。该函数还有助于识别出遇到大量 I/O 活动的文件。

示例
SELECT *
FROM :: fn_virtualfilestats(1, 1)
 


12.FORMATMESSAGE
从 sysmessages 现有的消息构造消息。FORMATMESSAGE 与 RAISERROR 语句的功能相似;但 RAISERROR 立
即输出消息而 FORMATMESSAGE 返回编辑后的信息供进一步处理。

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

参数
msg_number

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

param_value

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

返回类型
nvarchar

注释
与 RAISERROR 语句相像,FORMATMESSAGE 用所提供的参数值替换消息中的占位符变量来编辑消息。有关错误
信息中允许使用的占位符和编辑进程的更多信息,请参见 RAISERROR。

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

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

示例
此示例使用假定的存储于 sysmessages 中的 50001 号消息"The number of rows in %s is %1d."(%s
的行数为 %1d。)。FORMATMESSAGE 用值 Table1 和 5 替换参数占位符。结果字符串"The number of
rows in Table1 is 5."存储于局部变量 @var1。

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

 

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

语法
GETANSINULL ( [ ’database’ ] )

参数
’database’

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

返回类型
int

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

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

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


SET ANSI_NULL_DFLT_ON ON


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

USE pubs
GO
SELECT GETANSINULL(’pubs’)
GO

下面是结果集:

------
1     

(1 row(s) affected)

 

14.HOST_ID
返回工作站标识号。

语法
HOST_ID ( )

返回类型
char(8)

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

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

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

CREATE TABLE Orders
   (OrderID     INT       PRIMARY KEY,
    CustomerID  NCHAR(5)  REFERENCES Customers(CustomerID),
    TerminalID  CHAR(8)   NOT NULL DEFAULT HOST_ID(),
    OrderDate   DATETIME  NOT NULL,
    ShipDate    DATETIME  NULL,
    ShipperID   INT       NULL REFERENCES Shippers(ShipperID))
GO

 

15.HOST_NAME
返回工作站名称。

语法
HOST_NAME ( )

返回类型
nchar

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

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

示例
下面的示例创建一个表,该表在 DEFAULT 定义中使用 HOST_NAME() 来记录那些向记录订单的表中插入行的
计算机工作站名称。

CREATE TABLE Orders
   (OrderID     INT        PRIMARY KEY,
    CustomerID  NCHAR(5)   REFERENCES Customers(CustomerID),
    Workstation NCHAR(30)  NOT NULL DEFAULT HOST_NAME(),
    OrderDate   DATETIME   NOT NULL,
    ShipDate    DATETIME   NULL,
    ShipperID   INT        NULL REFERENCES Shippers(ShipperID))

 


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

语法
IDENT_CURRENT(’table_name’)

参数
table_name

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

返回类型
sql_variant

注释
IDENT_CURRENT 类似于 Microsoft? SQL Server? 2000 标识函数 SCOPE_IDENTITY 和 @@IDENTITY。这
三个函数都返回最后生成的标识值。但是,它们在定义"最后"的作用域和会话上不同。

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


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


SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
示例
下面的示例说明由 IDENT_CURRENT、@@IDENTITY 和 SCOPE_IDENTITY 返回的不同的标识值。

USE pubs
DROP TABLE t6
DROP TABLE t7
GO
CREATE TABLE t6(id int IDENTITY)
CREATE TABLE t7(id int IDENTITY(100,1))
GO
CREATE TRIGGER t6ins ON t6 FOR INSERT
AS
BEGIN
   INSERT t7 DEFAULT VALUES
END
GO
--end of trigger definition

SELECT   * FROM t6
--id is empty.

SELECT   * FROM t7
--id is empty.

--Do the following in Session 1
INSERT t6 DEFAULT VALUES
SELECT @@IDENTITY     
/*Returns the value 100, which was inserted by the trigger.*/

SELECT SCOPE_IDENTITY()  
/* Returns the value 1, which was inserted by the
INSERT stmt 2 statements before this query.*/

SELECT IDENT_CURRENT(’t7’)
/* Returns value inserted into t7, i.e. in the trigger.*/

SELECT IDENT_CURRENT(’t6’)
/* Returns value inserted into t6, which was the INSERT statement 4 stmts before this
query.*/

-- Do the following in Session 2
SELECT @@IDENTITY
/* Returns NULL since there has been no INSERT action
so far in this session.*/

SELECT SCOPE_IDENTITY()
/* Returns NULL since there has been no INSERT action
so far in this scope in this session.*/

SELECT IDENT_CURRENT(’t7’)
/* Returns the last value inserted into t7.*/

 

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

语法
IDENT_INCR ( ’table_or_view’ )

参数
table_or_view

一个表达式,用来指定表或视图以检查有效的标识增量值。table_or_view 可以是带有引号的字符串常量,
也可以是变量、函数或列名。table_or_view 的数据类型为 char、nchar、varchar 或 nvarchar。

返回类型
数字

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

USE pubs
SELECT TABLE_NAME, IDENT_INCR(TABLE_NAME) AS IDENT_INCR
FROM INFORMATION_SCHEMA.TABLES
WHERE IDENT_INCR(TABLE_NAME) IS NOT NULL

下面是结果集:

TABLE_NAME                                                  IDENT_INCR  
------------------------------------------------------------ -----------
jobs                                                         1          
 
(1 row(s) affected)

 

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

语法
IDENT_SEED ( ’table_or_view’ )

参数
table_or_view

一个表达式,指定表或视图以检查有效的标识种子值。table_or_view 可以是带有引号的字符串常量,也可
以是变量、函数或列名。table_or_view 的数据类型为 char、nchar、varchar 或 nvarchar。

返回类型
数字

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

USE pubs
SELECT TABLE_NAME, IDENT_SEED(TABLE_NAME) AS IDENT_SEED
FROM INFORMATION_SCHEMA.TABLES
WHERE IDENT_SEED(TABLE_NAME) IS NOT NULL

下面是结果集:

TABLE_NAME                                                   IDENT_SEED 
------------------------------------------------------------ -----------
jobs                                                         1          

(1 row(s) affected)

 

19.@@IDENTITY
返回最后插入的标识值。

语法
@@IDENTITY

返回类型
numeric

注释
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。
若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,
@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语
句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失
败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。

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

@@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,
SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回任何会话和任何作用域
中为特定表生成的标识值。有关更多信息,请参见 IDENT_CURRENT。

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

INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES (’Accountant’,12,125)
SELECT @@IDENTITY AS ’Identity’

 

20.IDENTITY(函数)
只用在带有 INTO table 子句的 SELECT 语句中,以将标识列插入到新表中。

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

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

参数
data_type

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

seed

要指派给表中第一行的值。给每一个后续行指派下一个标识值,该值等于上一个 IDENTITY 值加上
increment 值。如果既没有指定 seed,也没有指定 increment,那么它们都默认为 1。

increment

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

column_name

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

返回类型
返回与 data_type 相同的类型。

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

--(1)
SELECT IDENTITY(int, 1,1) AS ID_Num
INTO NewTable
FROM OldTable

--(2)
SELECT ID_Num = IDENTITY(int, 1, 1)
INTO NewTable
FROM OldTable

示例
下面的示例将来自 pubs 数据库中 employee 表的所有行都插入到名为 employees 的新表。使用
IDENTITY 函数在 employees 表中从 100 而不是 1 开始编标识号。

USE pubs
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = ’employees’)
   DROP TABLE employees
GO
EXEC sp_dboption ’pubs’, ’select into/bulkcopy’, ’true’

SELECT emp_id AS emp_num,
   fname AS first,
   minit AS middle,
   lname AS last,
   IDENTITY(smallint, 100, 1) AS job_num,
   job_lvl AS job_level,
   pub_id,
   hire_date
INTO employees
FROM employee
GO
USE pubs
EXEC sp_dboption ’pubs’, ’select into/bulkcopy’, ’false’

 

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

语法
ISDATE ( expression )

参数
expression

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

返回类型
int

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

列值 (varchar) ISDATE 返回值
NULL 0
Abc 0
100、-100、100 a 或 100.00 0
.01 0
-100.1234e-123 0
.231e90 0
$100.12345、- $100.12345 或 $-1000.123 0
as100 或 1a00 0
1995-10-1、1/20/95、1995-10-1 12:00pm、Feb 7 1995 11:00pm、1995-10-1 或者 1/23/95 1
13/43/3425 或 1995-10-1a 0
$1000、$100 或 $100 a 0


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

DECLARE @datestring varchar(8)
SET @datestring = ’12/21/98’
SELECT ISDATE(@datestring)

下面是结果集:

-----------
1          

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

USE tempdb
CREATE TABLE test_dates (Col_1 varchar(15), Col_2 datetime)
GO
INSERT INTO test_dates VALUES (’abc’, ’July 13, 1998’)
GO
SELECT ISDATE(Col_1) AS Col_1, ISDATE(Col_2) AS Col_2
   FROM test_dates

下面是结果集:

Col_1                     Col_2              
-----------------         --------------------
0                         1                  

 

22.ISNULL
使用指定的替换值替换 NULL。

语法
ISNULL ( check_expression , replacement_value )

参数
check_expression

将被检查是否为 NULL的表达式。check_expression 可以是任何类型的。

replacement_value

在 check_expression 为 NULL时将返回的表达式。replacement_value 必须与 check_expresssion 具有
相同的类型。

返回类型
返回与 check_expression 相同的类型。

注释
如果 check_expression 不为 NULL,那么返回该表达式的值;否则返回 replacement_value。

示例
A. 将 ISNULL 与 AVG 一起使用
下面的示例查找所有书的平均价格,用值 $10.00 替换 titles 表的 price 列中的所有 NULL 条目。

USE pubs
GO
SELECT AVG(ISNULL(price, $10.00))
FROM titles
GO

下面是结果集:

--------------------------
14.24                     

(1 row(s) affected)

B. 使用 ISNULL
下面的示例为 titles 表中的所有书选择书名、类型及价格。如果一个书名的价格是 NULL,那么在结果集中
显示的价格为 0.00。

USE pubs
GO
SELECT SUBSTRING(title, 1, 15) AS Title, type AS Type,
   ISNULL(price, 0.00) AS Price
FROM titles
GO

下面是结果集:

Title           Type         Price         
--------------- ------------ --------------------------
The Busy Execut business     19.99                     
Cooking with Co business     11.95                     
You Can Combat  business     2.99                      
Straight Talk A business     19.99                     
Silicon Valley  mod_cook     19.99                     
The Gourmet Mic mod_cook     2.99                      
The Psychology  UNDECIDED    0.00                      
But Is It User  popular_comp 22.95                     
Secrets of Sili popular_comp 20.00                     
Net Etiquette   popular_comp 0.00                      
Computer Phobic psychology   21.59                     
Is Anger the En psychology   10.95                     
Life Without Fe psychology   7.00                      
Prolonged Data  psychology   19.99                     
Emotional Secur psychology   7.99                      
Onions, Leeks,  trad_cook    20.95                     
Fifty Years in  trad_cook    11.95                     
Sushi, Anyone?  trad_cook    14.99                     

(18 row(s) affected)

 

23.ISNUMERIC
确定表达式是否为一个有效的数字类型。

语法
ISNUMERIC ( expression )

参数
expression

要计算的表达式。

返回类型
int

注释
当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返
回 0。返回值为 1 确保可以将 expression 转换为上述数字类型中的一种。

示例
A. 使用 ISNUMERIC
下面的示例返回 1,这是因为 zip 列包含有效的数值。

USE pubs
SELECT ISNUMERIC(zip)
FROM authors
GO

B. 使用 ISNUMERIC 和 SUBSTRING
下面的示例对于 titles 表中的所有书名都返回 0,这是因为没有一个书名是有效的数值。

USE pubs
GO
-- Because the title column is all character data, expect a result of 0
-- for the ISNUMERIC function.
SELECT SUBSTRING(title, 1, 15) type, price, ISNUMERIC(title)
FROM titles
GO

下面是结果集:

type            price                                 
--------------- -------------------------- -----------
The Busy Execut 19.99                      0          
Cooking with Co 11.95                      0          
You Can Combat  2.99                       0          
Straight Talk A 19.99                      0          
Silicon Valley  19.99                      0          
The Gourmet Mic 2.99                       0          
The Psychology  (null)                     0          
But Is It User  22.95                      0          
Secrets of Sili 20.00                      0          
Net Etiquette   (null)                     0          
Computer Phobic 21.59                      0          
Is Anger the En 10.95                      0          
Life Without Fe 7.00                       0          
Prolonged Data  19.99                      0          
Emotional Secur 7.99                       0          
Onions, Leeks,  20.95                      0          
Fifty Years in  11.95                      0          
Sushi, Anyone?  14.99                      0          

(18 row(s) affected)

 

24.NEWID
创建 uniqueidentifier 类型的唯一值。

语法
NEWID ( )

返回类型
uniqueidentifier

示例
A.对变量使用 NEWID 函数
下面的示例使用 NEWID 对声明为 uniqueidentifier 数据类型的变量赋值。在测试该值前,将先打印
uniqueidentifier 数据类型变量的值。

-- Creating a local variable with DECLARE/SET syntax.
DECLARE @myid uniqueidentifier
SET @myid = NEWID()
PRINT ’Value of @myid is: ’+ CONVERT(varchar(255), @myid)

下面是结果集:

Value of @myid is: 6F9619FF-8B86-D011-B42D-00C04FC964FF

 

说明  对于每台计算机,由 NEWID 返回的值不同。所显示的数字仅起解释说明的作用。


B.在 CREATE TABLE 语句中使用 NEWID
下面的示例创建具有 uniqueidentifier 数据类型的 cust 表,并使用 NEWID 将默认值填充到表中。为
NEWID() 赋默认值时,每个新行和现有行均具有 cust_id 列的唯一值。

-- Creating a table using NEWID for uniqueidentifier data type.
CREATE TABLE cust
(
 cust_id uniqueidentifier NOT NULL
   DEFAULT newid(),
 company varchar(30) NOT NULL,
 contact_name varchar(60) NOT NULL,
 address varchar(30) NOT NULL,
 city varchar(30) NOT NULL,
 state_province varchar(10) NULL,
 postal_code varchar(10) NOT NULL,
 country varchar(20) NOT NULL,
 telephone varchar(15) NOT NULL,
 fax varchar(15) NULL
)
GO
-- Inserting data into cust table.
INSERT cust
(cust_id, company, contact_name, address, city, state_province,
 postal_code, country, telephone, fax)
VALUES
(newid(), ’Wartian Herkku’, ’Pirkko Koskitalo’, ’Torikatu 38’, ’Oulu’, NULL,
 ’90110’, ’Finland’, ’981-443655’, ’981-443655’)
INSERT cust
(cust_id, company, contact_name, address, city, state_province,
postal_code, country, telephone, fax)
VALUES
(newid(), ’Wellington Importadora’, ’Paula Parente’, ’Rua do Mercado,
12’, ’Resende’, ’SP’,
 ’08737-363’, ’Brazil’, ’(14) 555-8122’, ’’)
INSERT cust
(cust_id, company, contact_name, address, city, state_province,
 postal_code, country, telephone, fax)
VALUES
(newid(), ’Cactus Comidas para Ilevar’, ’Patricio Simpson’, ’Cerrito 333’, ’Buenos
Aires’, NULL,
 ’1010’, ’Argentina’, ’(1) 135-5555’, ’(1) 135-4892’)
INSERT cust
(cust_id, company, contact_name, address, city, state_province,
 postal_code, country, telephone, fax)
VALUES
(newid(), ’Ernst Handel’, ’Roland Mendel’, ’Kirchgasse 6’, ’Graz’, NULL,
 ’8010’, ’Austria’, ’7675-3425’, ’7675-3426’)
INSERT cust
(cust_id, company, contact_name, address, city, state_province,
 postal_code, country, telephone, fax)
VALUES
(newid(), ’Maison Dewey’, ’Catherine Dewey’, ’Rue Joseph-Bens 532’, ’Bruxelles’, NULL,
 ’B-1180’, ’Belgium’, ’(02) 201 24 67’, ’(02) 201 24 68’)
GO

C. 使用 uniqueidentifier 和变量赋值
下面的示例声明局部变量 @myid 为 uniqueidentifier 数据类型。然后使用 SET 语句为该变量赋值。

DECLARE @myid uniqueidentifier
SET @myid = ’A972C577-DFB0-064E-1189-0154C99310DAAC12’
GO

 


25.NULLIF
如果两个指定的表达式相等,则返回空值。

语法
NULLIF ( expression , expression )

参数
expression

常量、列名、函数、子查询或算术运算符、按位运算符以及字符串运算符的任意组合。

返回类型
返回类型与第一个 expression 相同。

如果两个表达式不相等,NULLIF 返回第一个 expression 的值。如果相等,NULLIF 返回第一个
expression 类型的空值。

注释
如果两个表达式相等且结果表达式为 NULL,NULLIF 等价于 CASE 的搜索函数。

示例
下面的示例创建 budgets 表,表中显示部门 (dept) 及其当年的预算 (current_year) 以及去年预算
(previous_year)。对于当年预算,那些同去年相比预算没有改变的部门使用 NULL,那些预算还没有确定的
部门使用 0。要只计算那些接收预算的部门的预算平均值,并引用上一年度的预算值(当 current_year 为
0 时,使用 previous_year 值),请组合使用 NULLIF 和 COALESCE 函数。

USE pubs
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = ’budgets’)
   DROP TABLE budgets
GO
SET NOCOUNT ON
CREATE TABLE budgets
(
   dept            tinyint   IDENTITY,
   current_year      decimal   NULL,
   previous_year   decimal   NULL
)
INSERT budgets VALUES(100000, 150000)
INSERT budgets VALUES(NULL, 300000)
INSERT budgets VALUES(0, 100000)
INSERT budgets VALUES(NULL, 150000)
INSERT budgets VALUES(300000, 250000)
GO 
SET NOCOUNT OFF
SELECT AVG(NULLIF(COALESCE(current_year,
   previous_year), 0.00)) AS ’Average Budget’
FROM budgets
GO

下面是结果集:

Average Budget                          
----------------------------------------
212500.000000

(1 row(s) affected)

 

26.PARSENAME
返回对象名的指定部分。可以检索的对象部分有对象名、所有者名称、数据库名称和服务器名称。

 

说明  PARSENAME 函数不表明所指定名称的对象是否存在,而只是返回给定对象名的指定部分。


语法
PARSENAME ( ’object_name’ , object_piece )

参数
’object_name’

要检索其指定部分的对象名。object_name 是 sysname 值。本参数是可选的合法对象名。如果该对象名的所
有部分均符合要求,则该名称由以下四部分组成:服务器名称、数据库名称、所有者名称和对象名。

object_piece

要返回的对象部分。object_piece 是 int 值,可以为下列值。

Value 描述
1 对象名
2 所有者名称
3 数据库名称
4 服务器名称


返回类型
nchar

注释
如果符合下列条件之一,则 PARSENAME 返回 NULL 值:

object_name 或 object_piece 为 NULL 值。


发生语法错误。


所请求的对象部分长度为 0,并且是无效的 Microsoft? SQL Server? 标识符。零长度的对象名将导致整个
合法名称无效。
示例
本示例使用 PARSENAME 返回有关 pubs 数据库中 authors 表的信息。

USE pubs
SELECT PARSENAME(’pubs..authors’, 1) AS ’Object Name’
SELECT PARSENAME(’pubs..authors’, 2) AS ’Owner Name’
SELECT PARSENAME(’pubs..authors’, 3) AS ’Database Name’
SELECT PARSENAME(’pubs..authors’, 4) AS ’Server Name’

下面是结果集:

Object Name                   
------------------------------
authors                       

(1 row(s) affected)

Owner Name                    
------------------------------
(null)                        

(1 row(s) affected)

Database Name                 
------------------------------
pubs                          

(1 row(s) affected)

Server Name                   
------------------------------
(null)                        

(1 row(s) affected)

 

27.PERMISSIONS
返回一个包含位图的值,表明当前用户的语句、对象或列权限。

语法
PERMISSIONS ( [ objectid [ , ’column’ ] ] )

参数
objectid

对象的 ID。如果未指定 objectid,则位图值包含当前用户的语法权限;否则,位图包含当前用户在该对象
ID 上的对象权限。指定的对象必须在当前数据库中。将 OBJECT_ID 函数用于对象名以确定 objectid 值。

column

返回其权限信息的列的可选名。该列必须是 objectid 所指定表中的有效列名。

返回类型
int

注释
可使用 PERMISSIONS 确定当前用户是否有执行某个语句所需的权限,或者是否有将某个对象上的权限授予另
一用户所需的权限。

所返回的权限信息是 32 位位图。

低 16 位反映对当前用户的安全帐户所授予的权限,以及应用于当前用户所在的 Microsoft? Windows NT?
组或 Microsoft SQL Server? 角色的权限。例如,当没有指定 objectid 时,将返回值 66(十六进制值
0x42),表示当前用户有执行 CREATE TABLE(十进制值 2)和 BACKUP DATABASE(十进制值 64)语句的权
限。

高 16 位反映当前用户可以授予其他用户的权限。除左移 16 位(与 65536 相乘)之外,高 16 位的解释方
式与下表中所介绍的低 16 位的解释方式完全相同。例如,位 0x8(十进制值 8)说明当指定 objectid 时
的 INSERT 权限。而 0x80000(十进制值 524288)说明 GRANT INSERT 权限的能力,这是因为 524288 =
8 x 65536。由于角色中的成员资格,该用户可能没有执行语句的权限,但仍然能够将该权限授予他人。

下表显示语句权限所使用的位(未指定 objectid)。

位(十进制) 位(十六进制) 语句权限
1 0x1 CREATE DATABASE(仅限于 master 数据库)
2 0x2 CREATE TABLE
4 0x4 CREATE PROCEDURE
8 0x8 CREATE VIEW
16 0x10 CREATE RULE
32 0x20 CREATE DEFAULT
64 0x40 BACKUP DATABASE
128 0x80 BACKUP LOG
256 0x100 保留


下表显示当仅指定 objectid 时,返回的对象权限所使用的位。

位(十进制) 位(十六进制) 语句权限
1 0x1 SELECT ALL
2 0x2 UPDATE ALL
4 0x4 REFERENCES ALL
8 0x8 INSERT
16 0x10 DELETE
32 0x20 EXECUTE(仅限于过程)
4096 0x1000 SELECT ANY(至少一列)
8192 0x2000 UPDATE ANY
16384 0x4000 REFERENCES ANY


下表显示当同时指定 objectid 和 column 时,返回的列级对象权限所使用的位。

位(十进制) 位(十六进制) 语句权限
1 0x1 SELECT
2 0x2 UPDATE
4 0x4 REFERENCES


如果指定的参数为 NULL 值或无效(例如,objectid 或 column 不存在),则返回 NULL 值。没有定义不
适用的权限所使用的位值(例如,表的 EXECUTE 权限、位 0x20)。

使用按位 AND (&) 运算符确定 PERMISSIONS 函数返回的位图中的每个位集。

还可使用 sp_helprotect 系统存储过程返回某位用户在当前数据库中的对象权限列表。

示例
A. 对语句权限使用 PERMISSIONS 函数
本示例确定当前用户是否能够执行 CREATE TABLE 语句。

IF PERMISSIONS()&2=2
   CREATE TABLE test_table (col1 INT)
ELSE
   PRINT ’ERROR: The current user cannot create a table.’

B. 对对象权限使用 PERMISSIONS 函数
本示例确定当前用户是否能够在 authors 表中插入数据行。

IF PERMISSIONS(OBJECT_ID(’authors’))&8=8
   PRINT ’The current user can insert data into authors.’
ELSE
   PRINT ’ERROR: The current user cannot insert data into authors.’

C. 对可授予的权限使用 PERMISSIONS 函数
本示例确定当前用户是否能够将 authors 表中的 INSERT 权限授予另一用户。

IF PERMISSIONS(OBJECT_ID(’authors’))&0x80000=0x80000
   PRINT ’INSERT on authors is grantable.’
ELSE
   PRINT ’You may not GRANT INSERT permissions on authors.’

 

28.@@ROWCOUNT
返回受上一语句影响的行数。

语法
@@ROWCOUNT

返回类型
integer

注释
任何不返回行的语句将这一变量设置为 0 ,如 IF 语句。

示例
下面的示例执行 UPDATE 语句并用 @@ROWCOUNT 来检测是否有发生更改的行。

UPDATE authors SET au_lname = ’Jones’
WHERE au_id = ’999-888-7777’
IF @@ROWCOUNT = 0
   print ’Warning: No rows were updated’

 

29.ROWCOUNT_BIG
返回受执行的最后一个语句影响的行数。该函数的功能与 @@ROWCOUNT 一样,除非 ROWCOUNT_BIG 的返回类
型是 bigint。

语法
ROWCOUNT_BIG ( )

返回类型
bigint

注释
位于 SELECT 语句之后时,该函数返回由 SELECT 语句返回的行数。

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

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

 

30.SCOPE_IDENTITY
返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过
程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的
作用域中。

语法
SCOPE_IDENTITY( )

返回类型
sql_variant

注释
SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 在功能上相似,因为它们都返回插入到 IDENTITY 列中
的值。

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中
的特定表所生成的值。有关更多信息,请参见 IDENT_CURRENT。

SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,
SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。

例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并
在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的
插入。

假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后
返回不同的值。

@@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。

SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个 INSERT。如果
在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。

有关说明,请参见示例。

示例
下列示例将创建两个表 TZ 和 TY,并在 TZ 上创建一个 INSERT 触发器。当将某行插入表 TZ 中时,触发
器 (Ztrig) 将激发并在 TY 中插入一行。

USE tempdb
GO
CREATE TABLE TZ (
   Z_id  int IDENTITY(1,1)PRIMARY KEY,
   Z_name varchar(20) NOT NULL)

INSERT TZ
   VALUES (’Lisa’)
INSERT TZ
   VALUES (’Mike’)
INSERT TZ
   VALUES (’Carla’)

SELECT * FROM TZ

--Result set: This is how table TZ looks
Z_id   Z_name
-------------
1      Lisa
2      Mike
3      Carla

CREATE TABLE TY (
   Y_id  int IDENTITY(100,5)PRIMARY KEY,
   Y_name varchar(20) NULL)

INSERT TY (Y_name)
   VALUES (’boathouse’)
INSERT TY (Y_name)
   VALUES (’rocks’)
INSERT TY (Y_name)
   VALUES (’elevator’)

SELECT * FROM TY
--Result set: This is how TY looks:
Y_id  Y_name
---------------
100   boathouse
105   rocks
110   elevator

/*Create the trigger that inserts a row in table TY
when a row is inserted in table TZ*/
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
   BEGIN
   INSERT TY VALUES (’’)
   END

/*FIRE the trigger and find out what identity values you get
with the @@IDENTITY and SCOPE_IDENTITY functions*/
INSERT TZ VALUES (’Rosalie’)

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT   @@IDENTITY AS [@@IDENTITY]
GO

--Here is the result set.
SCOPE_IDENTITY
4
/*SCOPE_IDENTITY returned the last identity value in the same scope, which was the insert
on table TZ*/

@@IDENTITY
115
/*@@IDENTITY returned the last identity value inserted to TY by the trigger, which fired
due to an earlier insert on TZ*/

 

31.SERVERPROPERTY
返回有关服务器实例的属性信息。

语法
SERVERPROPERTY ( propertyname )

参数
propertyname

是包含要返回的服务器属性信息的表达式。Propertyname 可以是下列值中的一个。

属性名称 返回的值
Collation 服务器的默认排序规则名称。
如果输入无效或发生错误,则返回 NULL。

基本数据类型:nvarchar
 
Edition 安装在服务器上的 Microsoft? SQL Server? 实例版本。
返回:

’Desktop Engine’
’Developer Edition’
’Enterprise Edition’
’Enterprise Evaluation Edition’
’Personal Edition’
’Standard Edition’

基本数据类型:nvarchar(128)
 
Engine Edition 安装在服务器上的 SQL Server 实例引擎版本。
1 = 个人或 Desktop Engine
2 = 标准
3 = 企业(适用于企业版、企业评估版和开发版)

基本数据类型:int
 
InstanceName 用户连接到的实例的名称。
如果实例名称是默认实例,或者输入无效或发生错误,则返回 NULL。

基本数据类型:nvarchar
 
IsClustered 在故障转移群集中配置服务器实例。
1 = 聚集。
0 = 非聚集。
NULL = 输入无效或发生错误。

基本数据类型:int
 
IsFullTextInstalled 在 SQL Server 的当前实例中安装全文组件。
1 = 已安装全文组件。
0 = 未安装全文组件。
NULL = 输入无效或发生错误。

基本数据类型:int
 
IsIntegratedSecurityOnly 服务器为集成安全模式。
1 = 集成安全模式。
0 = 非集成安全模式。
NULL = 输入无效或发生错误。

基本数据类型:int
 
IsSingleUser 服务器为单用户模式。
1 = 单用户。
0 = 非单用户
NULL = 无效输入或错误。

基本数据类型:int
 
IsSyncWithBackup 数据库为发布数据库或分发数据库,并且在还原时不用中断事务复制。
1 = 真。
0 = 假。

基本数据类型:int
 
LicenseType SQL Server实例模式。
PER_SEAT = 单机模式
PER_PROCESSOR = 单处理器模式
DISABLED = 禁用许可。

基本数据类型:nvarchar(128)
 
MachineName 服务器实例在其上运行的 Windows NT 计算机名称。
对于聚集实例,即在 Microsoft Cluster Server 的虚拟服务器上运行的 SQL Server 实例,返回虚拟服务
器的名称。

如果输入无效或发生错误,则返回 NULL。

基本数据类型:nvarchar
 
NumLicenses 如果是单机模式,则为该 SQL Server 实例的注册客户端许可数。
如果是单处理器模式,则为该 SQL Server 实例的许可处理器数。

如果不是上述模式,则返回 NULL 值。

基本数据类型:int
 
ProcessID SQL Server 服务的进程 ID。(ProcessID 在标识属于该实例的 sqlservr.exe 方面很有
用。)
如果输入无效或发生错误,则返回 NULL。

基本数据类型:int
 
ProductVersion SQL Server 实例的版本,格式为"major.minor.build"。
基本数据类型:varchar(128)
 
ProductLevel SQL Server 实例的版本级别。
返回:
’RTM’ = 发售版。
’SPn’ = 服务包版
’Bn’, = beta 测试版

基本数据类型:nvarchar(128)。
 
ServerName Windows NT 服务器和与指定的 SQL Server 实例关联的实例信息。
如果输入无效或发生错误,则返回 NULL。

基本数据类型:nvarchar
 


返回类型
sql_variant

注释
SERVERPROPERTY 函数的 ServerName 属性与 @@SERVERNAME 返回相似的信息。ServerName 属性提供
Windows NT 服务器和实例名称,两者共同构成唯一的服务器实例。@@SERVERNAME 提供当前配置的本地服务
器名称。

如果安装时未更改默认服务器名称,则 ServerName 属性和 @@SERVERNAME 返回相同的信息。通过执行
sp_addserver 和 sp_dropserver 可以配置本地服务器名称。

如果在安装时已将本地服务器名称从默认服务器名称更改成其它名称,则 @@SERVERNAME 返回更改后的新名
称。

示例
该示例在 SELECT 语句中使用 SERVERPROPERTY 函数返回有关当前服务器的信息。如果 Windows NT 服务器
安装了多个 SQL Server 实例,而且客户端需要打开另一个到当前连接所使用的同一实例的连接时,此方案很
有用。

SELECT   CONVERT(char(20), SERVERPROPERTY(’servername’))

 

32.SESSIONPROPERTY
返回会话的 SET 选项设置。

语法
SESSIONPROPERTY ( option )

参数
option

是该会话的当前选项设置。option 可以是下列值中的一个。

选项 描述
ANSI_NULLS 指定是否对空值上的等号 (=) 和不等号 (<>)应用遵从 SQL-92 标准行为。
1 = ON
0 = OFF
 
ANSI_PADDING 控制列存储小于定义的列大小的值的方式,以及列存储在字符串和 binary 数据中有尾随空格
的值的方式。
1 = ON
0 = OFF
 
ANSI_WARNINGS 指定是否对某些情况(包括被零除和算术溢出)生成错误信息或警告应用 SQL-92 标准行
为。
1 = ON
0 = OFF
 
ARITHABORT 确定在执行查询过程中发生溢出或被零除的错误时是否终止查询。
1 = ON
0 = OFF
 
CONCAT_NULL_YIELDS_
NULL 控制是将串联结果视为空值还是空字符串值。
1 = ON
0 = OFF
 
NUMERIC_ROUNDABORT 指定当表达式中的四舍五入导致精度降低时是否生成错误信息和警告。
1 = ON
0 = OFF
 
QUOTED_IDENTIFIER 指定是否遵从 SQL-92 关于使用引号分隔标识符和文字字符串的规则。
1 = ON
0 = OFF
 
<任何其它字符串> NULL = 无效的输入


返回类型
sql_variant

注释
通过组合服务器级别、数据库级别和用户指定的选项对 SET 选项进行配置。

示例
下例返回 CONCAT_NULL_YIELDS_NULL 选项的设置。

SELECT   SESSIONPROPERTY (’CONCAT_NULL_YIELDS_NULL’)

 

33.SESSION_USER
是一个 niladic 函数,允许在未指定默认值时将系统为当前会话的用户名提供的值插入到表中。还允许在查
询、错误信息等中使用用户名。

语法
SESSION_USER

返回类型
nchar

注释
SESSION_USER 可在 CREATE TABLE 或 ALTER TABLE 语句中与 DEFAULT 约束一起使用,或者用作任何标准
函数。

示例
A. 使用 SESSION_USER 返回会话的当前用户名
下例声明一个 char 类型的变量,并将 SESSION_USER 赋为当前值,然后输出该变量并带有文本描述。

DECLARE @session_usr char(30)
SET @session_usr = SESSION_USER
SELECT ’This session’’s current user is: ’+ @session_usr
GO

下面是结果集:

--------------------------------------------------------------
This session’s current user is: dbo                           

(1 row(s) affected)

B. 将 SESSION_USER 与 DEFAULT 约束一起使用
下例将 SESSION_USER niladic 函数用作 DEFAULT 约束为交货人创建表。

USE pubs
GO
CREATE TABLE deliveries2
(
 order_id int IDENTITY(5000, 1) NOT NULL,
 cust_id  int NOT NULL,
 order_date datetime NOT NULL DEFAULT GETDATE(),
 delivery_date datetime NOT NULL DEFAULT DATEADD(dd, 10, GETDATE()),
 delivery_person char(30) NOT NULL DEFAULT SESSION_USER
)
GO
INSERT deliveries2 (cust_id)
VALUES (7510)
INSERT deliveries2 (cust_id)
VALUES (7231)
INSERT deliveries2 (cust_id)
VALUES (7028)
INSERT deliveries2 (cust_id)
VALUES (7392)
INSERT deliveries2 (cust_id)
VALUES (7452)
GO

以下查询选择 deliveries2 表中的全部信息。

SELECT order_id AS ’Ord#’, cust_id AS ’Cust#’, order_date,
   delivery_date, delivery_person AS ’Delivery’
FROM deliveries2
ORDER BY order_id
GO

下面是结果集:

Ord#  Cust#  order_date          delivery_date        Delivery    
----  ------ ------------------  -------------------- ----------------
5000  7510   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo                           
5001  7231   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo                           
5002  7028   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo                           
5003  7392   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo                           
5004  7452   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo                           

(5 row(s) affected)

 

34.STATS_DATE
返回最后一次更新指定索引统计的日期。

语法
STATS_DATE ( table_id , index_id )

参数
table_id

是所用表的 ID。

index_id

是所用索引的 ID。

返回类型
datetime

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

示例
下例返回最后一次更新指定对象统计的日期。

USE master
GO
SELECT ’Index Name’ = i.name,
   ’Statistics Date’ = STATS_DATE(i.id, i.indid)
FROM sysobjects o, sysindexes i
WHERE o.name = ’employee’ AND o.id = i.id
GO

 

35.@@TRANCOUNT
返回当前连接的活动事务数。

语法
@@TRANCOUNT

返回类型
integer

注释
BEGIN TRANSACTION 语句使 @@TRANCOUNT 递增 1。ROLLBACK TRANSACTION 将 @@TRANCOUNT 递减为 0,
但 ROLLBACK TRANSACTION savepoint_name 语句并不影响 @@TRANCOUNT 值。COMMIT TRANSACTION 或
COMMIT WORK 将 @@TRANCOUNT 递减 1。

示例
下面的示例用 @@TRANCOUNT 测试应该提交的打开事务。

BEGIN TRANSACTION
UPDATE authors SET au_lname = upper(au_lname)
WHERE au_lname = ’White’
IF @@ROWCOUNT = 2
   COMMIT TRAN

IF @@TRANCOUNT > 0
BEGIN
   PRINT ’A transaction needs to be rolled back’
   ROLLBACK TRAN
END

 

36.USER_NAME
返回给定标识号的用户数据库用户名。

语法
USER_NAME ( [ id ] )

参数
id

用来返回用户名的标识号。id 的数据类型为 int。

返回类型
nvarchar(256)

注释
当省略 id 时,则假定为当前用户。必须加上圆括号。

示例
A. 使用 USER_NAME
本示例返回用户编号为 13 的用户名。

SELECT USER_NAME(13)
GO

B. 使用不带 ID 的 USER_NAME
本示例在不指定 ID 的情况下查找当前用户的名称。

SELECT user_name()
GO

下面是结果集(对于是 sysadmin 固定服务器角色成员的用户):

------------------------------
dbo                           

(1 row(s) affected)

C. 在 WHERE 子句中使用 USER_NAME
本示例在 sysusers 中找到一行,该行的名称等于将系统函数 USER_NAME 应用于用户标识号 1 的结果。

SELECT name
FROM sysusers
WHERE name = USER_NAME(1)
GO

下面是结果集:

name                          
------------------------------
dbo                           

(1 row(s) affected)


 

一个很有用的函数

SQL_SERVER函数OBJECTPROPERTY(很详细很有用^_^)
返回当前数据库中对象的有关信息。

语法
OBJECTPROPERTY ( id , property )

参数
id

一个表达式,包含当前数据库中某个对象的 ID。id 的数据类型是 int。

Property

一个表达式,包含针对由 id 指定的对象将要返回的信息。Property 可以是下面这些值中的一个。

 

说明  除非加以注释,否则,如果 property 是无效的属性名,则返回 NULL。


属性名称             对象类型           描述和返回的值
CnstIsClustKey       约束               带有聚集索引的主键。
1 = True
0 = False
 
CnstIsColumn         约束               COLUMN 约束。
1 = True
0 = False
 
CnstIsDeleteCascade  约束               带有 ON DELETE CASCADE 选项的外键约束。
CnstIsDisabled       约束               禁用的约束。
1 = True
0 = False
 
CnstIsNonclustKey    约束               带有非聚集索引的主键。
1 = True
0 = False
 
CnstIsNotTrusted     约束               启用约束时未检查现有行,所以可能不是所有行都受约束的控
制。
1 = True
0 = False
 
CnstIsNotRepl        约束               使用 NOT FOR REPLICATION 关键字定义约束。
CnstIsUpdateCascade  约束               带有 ON UPDATE CASCADE 选项的外键约束。
ExecIsAfterTrigger   触发器             AFTER 触发器。
ExecIsAnsiNullsOn    过程、触发器、视图 创建时的 ANSI_NULLS 设置。
1 = True
0 = False
 
ExecIsDeleteTrigger  触发器             DELETE 触发器。
1 = True
0 = False
 
ExecIsFirstDeleteTrigger 触发器         对表执行 DELETE 时触发的第一个触发器。
ExecIsFirstInsertTrigger 触发器         对表执行 INSERT 时触发的第一个触发器。
ExecIsFirstUpdateTrigger 触发器         对表执行 UPDATE 时触发的第一个触发器。
ExecIsInsertTrigger 触发器              INSERT 触发器。
1 = True
0 = False
 
ExecIsInsteadOfTrigger  触发器          INSTEAD OF 触发器。
ExecIsLastDeleteTrigger 触发器          对表执行 DELETE 时触发的最后一个触发器。
ExecIsLastInsertTrigger 触发器          对表执行 INSERT 时触发的最后一个触发器。
ExecIsLastUpdateTrigger 触发器          对表执行 UPDATE 时触发的最后一个触发器。
ExecIsQuotedIdentOn  过程、触发器、视图 创建时的 QUOTED_IDENTIFIER 设置。
1 = True
0 = False
 
ExecIsStartup       过程                启动过程。
1 = True
0 = False
 
ExecIsTriggerDisabled 触发器            禁用的触发器。
1 = True
0 = False
 
ExecIsUpdateTrigger 触发器              UPDATE 触发器。
1 = True
0 = False
 
HasAfterTrigger  表,视图 表或视图具有  AFTER 触发器。
1 = True
0 = False
 
HasInsertTrigger 表,视图 表或视图具有  INSERT 触发器。
1 = True
0 = False
 
HasInsteadOfTrigger 表、视图 表或视图具有 INSTEAD OF 触发器。
1 = True
0 = False
 
HasUpdateTrigger 表、视图 表或视图具有 UPDATE 触发器。
1 = True
0 = False
 
IsAnsiNullsOn 函数、过程、表、触发器、视图 指定表的 ANSI NULLS 选项设置为 ON,表示所有与空值的
比较都取值为 UNKNOWN。只要表存在,该设置就应用于表定义中的所有表达式,包括计算列和约束。
1 = ON
0 = OFF
 
IsCheckCnst 任何 CHECK 约束。
1 = True
0 = False
 
IsConstraint 任何 约束。
1 = True
0 = False
 
IsDefault 任何 绑定的默认值。
1 = True
0 = False
 
IsDefaultCnst 任何 DEFAULT 约束。
1 = True
0 = False
 
IsDeterministic 函数、视图 函数的确定性属性。只适用于标量值及表值函数。
1 = 可确定的
0 = 不可确定的
NULL = 不是标量值或表值函数,或者是无效的对象 ID。
 
IsExecuted 任何 指定执行该对象的方式(视图、过程或触发器)。
1 = True
0 = False
 
IsExtendedProc      任何        扩展过程。
1 = True
0 = False
 
IsForeignKey        任何        FOREIGN KEY 约束。
1 = True
0 = False
 
IsIndexed        表、视图       带有索引的表或视图。
IsIndexable      表、视图       可以创建索引的表或视图。
IsInlineFunction   函数         内嵌函数。
1 = 内嵌函数
0 = 非内嵌函数
NULL = 不是函数,或者是无效的对象 ID。
 
IsMSShipped      任何         在安装 Microsoft? SQL Server? 2000 的过程中创建的对象。
1 = True
0 = False
 
IsPrimaryKey     任何          PRIMARY KEY 约束。
1 = True
0 = False
 
IsProcedure      任何          过程。
1 = True
0 = False
 
IsQuotedIdentOn  函数、过程、表、触发器、视图 指定表的被引用标识符设置为 ON,表示在表定义所涉及
的所有表达式中,双引号标记分隔标识符。
1 = ON
0 = OFF
 
IsReplProc       任何          复制过程。
1 = True
0 = False
 
IsRule           任何          绑定的规则。
1 = True
0 = False
 
IsScalarFunction 函数         标量值函数。
1 = 标量值
0 = 表值
NULL = 不是函数,或者是无效的对象 ID。
 
IsSchemaBound    函数,视图   使用 SCHEMABINDING 创建的架构绑定函数或视图。
1 = 架构绑定
0 = 非架构绑定
NULL = 不是函数或视图,或者是无效的对象 ID。
 
IsSystemTable     表          系统表。
1 = True
0 = False
 
IsTable           表          表。
1 = True
0 = False
 
IsTableFunction  函数         表值函数。
1 = 表值
0 = 标量值
NULL = 不是函数,或者是无效的对象 ID。
 
IsTrigger        任何         触发器。
1 = True
0 = False
 
IsUniqueCnst     任何         UNIQUE 约束。
1 = True
0 = False
 
IsUserTable      表          用户定义的表。
1 = True
0 = False
 
IsView          视图           视图。
1 = True
0 = False
 
OwnerId          任何          对象的所有者。
Nonnull = 对象所有者的数据库用户 ID。
NULL = 无效的输入。
 
TableDeleteTrigger 表         表有 DELETE 触发器。
>1 = 给定类型的第一个触发器的 ID。
 
TableDeleteTriggerCount 表 表具有指定数目的 DELETE 触发器。
>1 = 给定类型的第一个触发器的 ID。
NULL = 无效的输入。
 
TableFullTextBackgroundUpdateIndexOn 表 表已启用全文后台更新索引。
1 = True
0 = False
 
TableFulltextCatalogId 表 表的全文索引数据所驻留的全文目录的 ID。
Nonzero = 全文目录 ID,它与标识全文索引表中行的唯一索引相关。
0 = 表不是全文索引的。
 
TableFullTextChangeTrackingOn 表 表已启用全文更改跟踪。
1 = True
0 = False
 
TableFulltextKeyColumn 表 与某个单列唯一索引相关联的列 ID,这个单列唯一索引参与全文索引定义。
0 = 表不是全文索引的。
 
TableFullTextPopulateStatus 表 0 = 不填充
1 = 完全填充
2 = 增量填充
TableHasActiveFulltextIndex 表 表具有一个活动的全文索引。
1 = True
0 = False
 
TableHasCheckCnst 表 表具有 CHECK 约束。
1 = True
0 = False
 
TableHasClustIndex 表 表具有聚集索引。
1 = True
0 = False
 
TableHasDefaultCnst 表 表具有 DEFAULT 约束。
1 = True
0 = False
 
TableHasDeleteTrigger 表 表具有 DELETE 触发器。
1 = True
0 = False
 
TableHasForeignKey 表 表具有 FOREIGN KEY 约束。
1 = True
0 = False
 
TableHasForeignRef 表 表由 FOREIGN KEY 约束引用。
1 = True
0 = False
 
TableHasIdentity 表 表具有标识列。
1 = True
0 = False
 
TableHasIndex 表 表具有一个任何类型的索引。
1 = True
0 = False
 
TableHasInsertTrigger 表 对象具有 Insert 触发器。
1 = True
0 = False
NULL = 无效的输入。
 
TableHasNonclustIndex 表 表具有非聚集索引。
1 = True
0 = False
 
TableHasPrimaryKey 表 表具有主键。
1 = True
0 = False
 
TableHasRowGuidCol 表 对于 uniqueidentifier 列,表具有 ROWGUIDCOL。
1 = True
0 = False
 
TableHasTextImage 表 表具有 text 列。
1 = True
0 = False
 
TableHasTimestamp 表 表具有 timestamp 列。
1 = True
0 = False
 
TableHasUniqueCnst 表 表具有 UNIQUE 约束。
1 = True
0 = False
 
TableHasUpdateTrigger 表 对象具有 Update 触发器。
1 = True
0 = False
 
TableInsertTrigger 表 表具有 INSERT 触发器。
>1 = 给定类型的第一个触发器的 ID。
 
TableInsertTriggerCount 表 表具有指定数目的 INSERT 触发器。
>1 = 给定类型的第一个触发器的 ID。
 
TableIsFake 表 表不是真实的。根据需要 SQL Server 对其进行内部具体化。
1 = True
0 = False
 
TableIsPinned 表 驻留表以将其保留在数据高速缓存中。
1 = True
0 = False
 
TableTextInRowLimit 表 text in row 所允许的最大字节数,如果没有设置 text in row 选项则为 0。
TableUpdateTrigger 表 表具有 UPDATE 触发器。
>1 = 给定类型的第一个触发器的 ID。
 
TableUpdateTriggerCount 表 表具有指定数目的 UPDATE 触发器。
>1 = 给定类型的第一个触发器的 ID。
 


返回类型
int

注释
OBJECTPROPERTY(view_id,’IsIndexable’) 可能会耗费大量的计算机资源,这是因为对 IsIndexable 属性
的评估需要分析视图定义、进行规范化以及部分优化。

当至少添加了表的一列以用于索引时,OBJECTPROPERTY(table_id, ’TableHasActiveFulltextIndex’) 将
返回"1"(True)。只要添加了用于索引的第一列后,全文索引即可用于填充。

当除去索引中的最后一列时,索引变成非活动。

如果某些索引键需求条件得不到满足,那么实际创建索引仍然可能会失败。详细信息请参见 CREATE INDEX。

示例
A. 查明 authors 是否为一个表
下面的示例测试 authors 是否为一个表。

IF OBJECTPROPERTY ( object_id(’authors’),’ISTABLE’) = 1
   print ’Authors is a table’

ELSE IF OBJECTPROPERTY ( object_id(’authors’),’ISTABLE’) = 0
   print ’Authors is not a table’

ELSE IF OBJECTPROPERTY ( object_id(’authors’),’ISTABLE’) IS NULL
   print ’ERROR: Authors is not an object’

B. 确定是否在表上启用了 text in row
下面的示例测试是否在 authors 表上启用了 text in row 选项,以便 text、ntext 或 image 数据可以
存储在它的数据行内。

USE pubs
SELECT OBJECTPROPERTY(OBJECT_ID(’authors’),’TableTextInRowLimit’)

结果集显示在表上没有启用 text in row。

-----
0

C. 确定用户定义的标量值函数是否具有确定性
下面的示例测试用户定义的标量值函数 fn_CubicVolume 是否具有确定性,该函数返回小数。

CREATE FUNCTION fn_CubicVolume
-- Input dimensions in centimeters.
   (@CubeLength decimal(4,1), @CubeWidth decimal(4,1),
   @CubeHeight decimal(4,1) )
RETURNS decimal(12,3) -- Cubic Centimeters.
WITH SCHEMABINDING
AS
BEGIN
   RETURN ( @CubeLength * @CubeWidth * @CubeHeight )
END

--Is it a deterministic function?
SELECT OBJECTPROPERTY(OBJECT_ID(’fn_CubicVolume’), ’IsDeterministic’)

结果集显示 fn_CubicVolume 是确定性函数。

-----
1
 

不是函数

逻辑运算
1.ALL
用标量值与单列集中的值进行比较。

语法
scalar_expression { = | <> | != | > | >= | !>| < | <= | !< } ALL ( subquery )

参数
scalar_expression

是任何有效的 Microsoft? SQL Server? 表达式。

{ = | <> | != | > | >= | !> | < | <= | !< }

是比较运算符。

subquery

是返回单列结果集的子查询。返回列的数据类型必须与 scalar_expression 的数据类型相同。

是受限的 SELECT 语句(不允许使用 ORDER BY 子句、COMPUTE 子句和 INTO 关键字)。

返回类型
Boolean

结果值
如果所有给定的比较对(scalar_expression, x)均为 TRUE,其中 x 是单列集中的值,则返回 TRUE;否
则返回 FALSE。

 

2.AND
连结两个布尔型表达式并当两个表达式都为 TRUE 时返回 TRUE。当语句中有多个逻辑运算符时,AND 运算符
将首先计算。可以通过使用括号更改计算次序。

语法
boolean_expression AND boolean_expression

参数
boolean_expression

任何有效的 Microsoft? SQL Server? 表达式都将返回下列布尔值:TRUE FALSE 或 UNKNOWN。

结果类型
Boolean

结果值
当两个表达式均为 TRUE 时返回 TRUE。

注释
下表概括了使用 AND 运算符比较 TRUE 和 FALSE 时的结果。

  TRUE FALSE UNKNOWN
TRUE TRUE FALSE UNKNOWN
FALSE FALSE FALSE FALSE
UNKNOWN UNKNOWN FALSE UNKNOWN

 

3.SOME | ANY
用标量值与单列集中的值进行比较。

语法
scalar_expression { = | < > | != | > | > = | ! > | < | < = | ! < }
    { SOME | ANY } ( subquery )

参数
scalar_expression

是任何有效的 Microsoft? SQL Server? 表达式。

{ = | <> | != | > | >= | !> | < | <= | !< }

是任何有效的比较运算符。

SOME | ANY

指定应进行比较。

subquery

是包含某列结果集的子查询。所返回列的数据类型必须是与 scalar_expression 相同的数据类型。

结果类型
Boolean

结果值
对于 ANY 对 (scalar_expression, x)(其中 x 是单列集中的值),当指定的比较是 TRUE时,SOME 或
ANY 返回 TRUE。否则返回 FALSE。

 

4.BETWEEN
指定测试范围。

语法
test_expression [ NOT ] BETWEEN begin_expression AND end_expression

参数
test_expression

是用来在由 begin_expression 和 end_expression 定义的范围内进行测试的表达式。test_expression
必须与 begin_expression 和 end_expression 具有相同的数据类型。

NOT

指定谓词的结果被取反。

begin_expression

是任何有效的 Microsoft? SQL Server? 表达式。begin_expression 必须与 test_expression 和
end_expression 具有相同的数据类型。

end_expression

是任何有效的 SQL Server 表达式。end_expression 必须与 test_expression 和 begin_expression 一
样具有相同的数据类型。

AND

作为一个占位符,表示 test_expression 应该处于由 begin_expression 和 end_expression 指定的范围
内。

结果类型
Boolean

结果值
如果 test_expression 的值大于或等于 begin_expression 的值并且小于或等于 end_expression 的值,
则 BETWEEN 返回 TRUE。

如果 test_expression 的值小于 begin_expression 的值或者大于 end_expression 的值,则 NOT
BETWEEN 返回 TRUE。

注释
若要指定排除范围,请使用大于 (>) 和小于 (<) 运算符。如果任何 BETWEEN 或 NOT BETWEEN 谓词的输入
为 NULL,则结果是 UNKNOWN。

示例
A. 使用 BETWEEN
本例返回书的题头标识符,这些书的年度至今单位销售额是从 4,095 到 12,000。

USE pubs
GO
SELECT title_id, ytd_sales
FROM titles
WHERE ytd_sales BETWEEN 4095 AND 12000
GO

下面是结果集:

title_id ytd_sales
-------- -----------
BU1032   4095       
BU7832   4095       
PC1035   8780       
PC8888   4095       
TC7777   4095       

(5 row(s) affected)

B. 使用 > 和 < 代替 BETWEEN
本例使用大于 (>) 和小于 (<) 运算符,由于这些运算符是非包含的,所以返回不同的结果。

USE pubs
GO
SELECT title_id, ytd_sales     
FROM titles     
WHERE ytd_sales > 4095 AND ytd_sales < 12000     
GO

下面是结果集:

title_id ytd_sales  
-------- -----------
PC1035   8780       

(1 row(s) affected)

C. 使用 NOT BETWEEN
本例找出一个指定范围(从 4,095 到 12,000)外的所有行。

USE pubs
GO
SELECT title_id, ytd_sales
FROM titles
WHERE ytd_sales NOT BETWEEN 4095 AND 12000
GO

下面是结果集:

title_id ytd_sales  
-------- -----------
BU1111   3876       
BU2075   18722      
MC2222   2032       
MC3021   22246      
PS1372   375        
PS2091   2045       
PS2106   111        
PS3333   4072       
PS7777   3336       
TC3218   375        
TC4203   15096      

(11 row(s) affected)

 

5.EXISTS
指定一个子查询,检测行的存在。

语法
EXISTS subquery

参数
subquery

是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。有关更多信息,请参见 SELECT 中
有关子查询的讨论。

结果类型
Boolean

结果值
如果子查询包含行,则返回 TRUE。

示例
A. 在子查询中使用 NULL 仍然返回结果集
这个例子在子查询中指定 NULL,并返回结果集,通过使用 EXISTS 仍取值为 TRUE。

USE Northwind
GO
SELECT CategoryName
FROM Categories
WHERE EXISTS (SELECT NULL)
ORDER BY CategoryName ASC
GO

B. 比较使用 EXISTS 和 IN 的查询
这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相
同的信息。

USE pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
   (SELECT *
   FROM titles
   WHERE pub_id = publishers.pub_id
   AND type = ’business’)
GO

-- Or, using the IN clause:

USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
   (SELECT pub_id
   FROM titles
   WHERE type = ’business’)
GO

下面是任一查询的结果集:

pub_name                                
----------------------------------------
Algodata Infosystems                    
New Moon Books                          

(2 row(s) affected)

C.比较使用 EXISTS 和 = ANY 的查询
本示例显示查找与出版商住在同一城市中的作者的两种查询方法:第一种方法使用 = ANY,第二种方法使用
EXISTS。注意这两种方法返回相同的信息。

USE pubs
GO
SELECT au_lname, au_fname
FROM authors
WHERE exists
   (SELECT *
   FROM publishers
   WHERE authors.city = publishers.city)
GO

-- Or, using = ANY

USE pubs
GO
SELECT au_lname, au_fname
FROM authors
WHERE city = ANY
   (SELECT city
   FROM publishers)
GO

下面是任一查询的结果集:

au_lname                                 au_fname            
---------------------------------------- --------------------
Carson                                   Cheryl              
Bennet                                   Abraham             

(2 row(s) affected)

D.比较使用 EXISTS 和 IN 的查询
本示例所示查询查找由位于以字母 B 开头的城市中的任一出版商出版的书名:

USE pubs
GO
SELECT title
FROM titles
WHERE EXISTS
   (SELECT *
   FROM publishers
   WHERE pub_id = titles.pub_id
   AND city LIKE ’B%’)
GO

-- Or, using IN:

USE pubs
GO
SELECT title
FROM titles
WHERE pub_id IN
   (SELECT pub_id
   FROM publishers
   WHERE city LIKE ’B%’)
GO

下面是任一查询的结果集:

title                                                                           
------------------------------------------------------------------------
The Busy Executive’s Database Guide                                             
Cooking with Computers: Surreptitious Balance Sheets                            
You Can Combat Computer Stress!                                                 
Straight Talk About Computers                                                   
But Is It User Friendly?                                                        
Secrets of Silicon Valley                                                       
Net Etiquette                                                                   
Is Anger the Enemy?                                                             
Life Without Fear                                                               
Prolonged Data Deprivation: Four Case Studies                                   
Emotional Security: A New Algorithm                                             

(11 row(s) affected)

E. 使用 NOT EXISTS
NOT EXISTS 的作用与 EXISTS 正相反。如果子查询没有返回行,则满足 NOT EXISTS 中的 WHERE 子句。本
示例查找不出版商业书籍的出版商的名称:

USE pubs
GO
SELECT pub_name
FROM publishers
WHERE NOT EXISTS
   (SELECT *
   FROM titles
   WHERE pub_id = publishers.pub_id
   AND type = ’business’)
ORDER BY pub_name
GO

下面是结果集:

pub_name                                
----------------------------------------
Binnet & Hardley                        
Five Lakes Publishing                   
GGG&G                                   
Lucerne Publishing                      
Ramona Publishers                       
Scootney Books                          

(6 row(s) affected)

 

6.IN
确定给定的值是否与子查询或列表中的值相匹配。

语法
test_expression [ NOT ] IN
    (
        subquery
        | expression [ ,...n ]
    )

参数
test_expression

是任何有效的 Microsoft? SQL Server? 表达式。

subquery

是包含某列结果集的子查询。该列必须与 test_expression 有相同的数据类型。

expression [,...n]

一个表达式列表,用来测试是否匹配。所有的表达式必须和 test_expression 具有相同的类型。

结果类型
布尔型

结果值
如果 test_expression 与 subquery 返回的任何值相等,或与逗号分隔的列表中的任何 expression 相
等,那么结果值就为 TRUE。否则,结果值为 FALSE。

使用 NOT IN 对返回值取反。

示例
A. 对比 OR 和 IN
下面的示例选择名称和州的列表,列表中列出所有居住在加利福尼亚、印地安纳或马里兰州的作者。

USE pubs

SELECT au_lname, state
FROM authors
WHERE state = ’CA’ OR state = ’IN’ OR state = ’MD’

但是,也可以使用 IN 获得相同的结果:

USE pubs

SELECT au_lname, state
FROM authors
WHERE state IN (’CA’, ’IN’, ’MD’)

以下是上面任一查询的结果集:

au_lname   state
--------   -----
White      CA
Green      CA
Carson      CA
O’Leary      CA
Straight      CA
Bennet      CA
Dull      CA
Gringlesby      CA
Locksley      CA
Yokomoto      CA
DeFrance      IN
Stringer      CA
MacFeather      CA
Karsen      CA
Panteley            MD
Hunter            CA
McBadden            CA

(17 row(s) affected)

B. 将 IN 与子查询一起使用
下面的示例在 titleauthor 表中查找从任一种书得到的版税少于 50% 的所有作者的 au_ids,然后从
authors 表中选择 au_ids 与 titleauthor 查询结果匹配的所有作者的姓名。结果显示有一些作者属于得
到的版税少于 50% 的一类。

USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE au_id IN
   (SELECT au_id
   FROM titleauthor
   WHERE royaltyper < 50)

下面是结果集:

au_lname                                 au_fname            
---------------------------------------- --------------------
Green                                    Marjorie            
O’Leary                                  Michael             
Gringlesby                               Burt                
Yokomoto                                 Akiko               
MacFeather                               Stearns             
Ringer                                   Anne                

(6 row(s) affected)

C. 将 NOT IN 与子查询一起使用
NOT IN 将找到那些与值列表中的项目不匹配的作者。下面的示例查找至少有一种书取得不少于 50% 的版税的
作者姓名:

USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE au_id NOT IN
   (SELECT au_id
   FROM titleauthor
   WHERE royaltyper < 50)

下面是结果集:

au_lname                                 au_fname            
---------------------------------------- --------------------
White                                    Johnson             
Carson                                   Cheryl              
Straight                                 Dean                
Smith                                    Meander             
Bennet                                   Abraham             
Dull                                     Ann                 
Locksley                                 Charlene            
Greene                                   Morningstar         
Blotchet-Halls                           Reginald            
del Castillo                             Innes               
DeFrance                                 Michel              
Stringer                                 Dirk                
Karsen                                   Livia               
Panteley                                 Sylvia              
Hunter                                   Sheryl              
McBadden                                 Heather             
Ringer                                   Albert              

(17 row(s) affected)

 

7.LIKE
确定给定的字符串是否与指定的模式匹配。模式可以包含常规字符和通配符字符。模式匹配过程中,常规字符
必须与字符串中指定的字符完全匹配。然而,可使用字符串的任意片段匹配通配符。与使用 = 和 != 字符串
比较运算符相比,使用通配符可使 LIKE 运算符更加灵活。如果任何参数都不属于字符串数据类型,
Microsoft? SQL Server? 会将其转换成字符串数据类型(如果可能)。

语法
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

参数
match_expression

任何字符串数据类型的有效 SQL Server 表达式。

pattern

match_expression 中的搜索模式,可以包含下列有效 SQL Server 通配符。

通配符 描述 示例
% 包含零个或更多字符的任意字符串。 WHERE title LIKE ’%computer%’ 将查找处于书名任意位置的包含
单词 computer 的所有书名。
_(下划线) 任何单个字符。 WHERE au_fname LIKE ’_ean’ 将查找以 ean 结尾的所有 4 个字母的名字
(Dean、Sean 等)。
[ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。 WHERE au_lname LIKE ’[C-P]arsen’
将查找以arsen 结尾且以介于 C 与 P 之间的任何单个字符开始的作者姓氏,例如,Carsen、Larsen、
Karsen 等。
[^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。 WHERE au_lname LIKE ’de[^l]%’
将查找以 de 开始且其后的字母不为 l 的所有作者的姓氏。


escape_character

字符串数据类型分类中的所有数据类型的任何有效 SQL Server 表达式。escape_character 没有默认值,
且必须仅包含一个字符。

结果类型
Boolean

结果值
如果 match_expression 匹配指定模式,LIKE 将返回 TRUE。

注释
当使用 LIKE 进行字符串比较时,模式字符串中的所有字符都有意义,包括起始或尾随空格。如果查询中的比
较要返回包含"abc "(abc 后有一个空格)的所有行,则将不会返回包含"abc"(abc 后没有空格)的列所在
行。但是可以忽略模式所要匹配的表达式中的尾随空格。如果查询中的比较要返回包含"abc"(abc 后没有空
格)的所有行,则将返回以"abc"开始且具有零个或多个尾随空格的所有行。

由于数据存储方式的原因,使用包含 char 和 varchar 数据模式的字符串比较可能无法通过 LIKE 比较。了
解每种数据类型的存储方式以及导致 LIKE 比较失败的原因十分重要。下面的示例将局部 char 变量传递给存
储过程,然后使用模式匹配查找某个作者的所有著作。在此过程中,作者的姓将作为变量传递。

CREATE PROCEDURE find_books @AU_LNAME char(20)
AS
SELECT @AU_LNAME = RTRIM(@AU_LNAME) + ’%’
SELECT t.title_id, t.title
FROM authors a, titleauthor ta, titles t
WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id
   AND a.au_lname LIKE @AU_LNAME

当名字中包含的字符数小于 20 时,char 变量 (@AU_LNAME) 将包含尾随空格,这导致 find_books 过程中
没有行返回。由于 au_lname 列为 varchar 类型,所以没有尾随空格。因为尾随空格是有意义的,所以此过
程失败。

但下面的示例是成功的,因为尾随空格没有被添加到 varchar 变量中:

USE pubs
GO
CREATE PROCEDURE find_books2 @au_lname varchar(20)
AS
SELECT t.title_id, t.title
FROM authors a, titleauthor ta, titles t
WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id
   AND a.au_lname LIKE @au_lname + ’%’

EXEC find_books2 ’ring’

下面是结果集:

title_id title                                                                           
-------- ---------------------------------------------------------------
MC3021   The Gourmet Microwave                                                           
PS2091   Is Anger the Enemy?                                                             
PS2091   Is Anger the Enemy?                                                             
PS2106   Life Without Fear                                                               

(4 row(s) affected)

使用 LIKE 的模式匹配
当搜索 datetime 值时,推荐使用 LIKE,因为 datetime 项可能包含各种日期部分。例如,如果将值
19981231 9:20 插入到名为 arrival_time 的列中,则子句 WHERE arrival_time = 9:20 将无法找到
9:20 字符串的精确匹配,因为 SQL Server 将其转换为 1900 年 1 月 1 日上午 9:20。然而,子句
WHERE arrival_time LIKE ’%9:20%’ 将找到匹配。

LIKE 支持 ASCII 模式匹配和 Unicode 模式匹配。当所有参数,包括 match_expression、pattern 和
escape_character(如果有)都是 ASCII 字符数据类型时,将执行 ASCII 模式匹配。如果其中任何参数属
于 Unicode 数据类型,则所有参数将被转换为 Unicode 并执行 Unicode 模式匹配。当对 Unicode 数据
(nchar 或 nvarchar 数据类型)使用 LIKE 时,尾随空格是有意义的。但是对于非 Unicode 数据,尾随
空格没有意义。Unicode LIKE 与 SQL-92 标准兼容。ASCII LIKE 与 SQL Server 的早期版本兼容。

下面的一系列示例显示 ASCII LIKE 模式匹配与 Unicode LIKE 模式匹配所返回的行之间的差异:

-- ASCII pattern matching with char column
CREATE TABLE t (col1 char(30))
INSERT INTO t VALUES (’Robert King’)
SELECT *
FROM t
WHERE col1 LIKE ’% King’   -- returns 1 row

-- Unicode pattern matching with nchar column
CREATE TABLE t (col1 nchar(30))
INSERT INTO t VALUES (’Robert King’)
SELECT *
FROM t
WHERE col1 LIKE ’% King’   -- no rows returned

-- Unicode pattern matching with nchar column and RTRIM
CREATE TABLE t (col1 nchar (30))
INSERT INTO t VALUES (’Robert King’)
SELECT *
FROM t
WHERE RTRIM(col1) LIKE ’% King’   -- returns 1 row

 

说明  如果使用 LIKE 进行字符串比较,模式字符串中的所有字符都有意义,包括起始空格或尾随空格。


使用 % 通配符
如果指定 LIKE ’5%’,SQL Server 将搜索后面带有零个或多个任意字符的数字 5。

例如,此查询将显示数据库中所有的系统表,因为它们都以字母 sys 开始:

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE ’sys%’

 

说明  请注意:系统表可以随版本不同而更改。推荐使用信息架构视图或适用的存储过程处理 SQL Server
系统表。


若要查阅非系统表的所有对象,请使用 NOT LIKE ’sys%’。如果共有 32 个对象且 LIKE 找到 13 个与模式
匹配的名称,则 NOT LIKE 将找到 19 个与 LIKE 模式不匹配的对象。

使用 LIKE ’[^s][^y][^s]%’ 模式不一定每次找到的名称都相同。可能仅得到 14 个名称(而不是 19
个),除了系统表名称外,所有以 s 开始或第二个字母为 y 或第三个字母为 s 的名称也都将从结果中消
除。这是因为用反向通配符匹配字符串是分步骤进行计算的,一次一个通配符。如果在计算过程中任一环节匹
配失败,那么就会将其消除。

将通配符作为文字使用
可以将通配符模式匹配字符串用作文字字符串,方法是将通配符放在括号中。下表显示了使用 LIKE 关键字
和 [ ] 通配符的示例。

符号 含义
LIKE ’5[%]’ 5%
LIKE ’[_]n’ _n
LIKE ’[a-cdf]’ a、b、c、d 或 f
LIKE ’[-acdf]’ -、a、c、d 或 f
LIKE ’[ [ ]’ [
LIKE ’]’ ]
LIKE ’abc[_]d%’ abc_d 和 abc_de
LIKE ’abc[def]’ abcd、abce 和 abcf


使用 ESCAPE 子句的模式匹配
可搜索包含一个或多个特殊通配符的字符串。例如,customers 数据库中的 discounts 表可能存储含百分
号 (%) 的折扣值。若要搜索作为字符而不是通配符的百分号,必须提供 ESCAPE 关键字和转义符。例如,一
个样本数据库包含名为 comment 的列,该列含文本 30%。若要搜索在 comment 列中的任何位置包含字符串
30% 的任何行,请指定由 WHERE comment LIKE ’%30!%%’ ESCAPE ’!’ 组成的 WHERE 子句。如果不指定
ESCAPE 和转义符,SQL Server 将返回所有含字符串 30 的行。

下例说明如何在 pubs 数据库 titles 表的 notes 列中搜索字符串"50% off when 100 or more copies
are purchased":

USE pubs
GO
SELECT notes
FROM titles
WHERE notes LIKE ’50%% off when 100 or more copies are purchased’
   ESCAPE ’%’
GO

示例
A. 使用带 % 通配符的 LIKE
下例查找 authors 表中所有区号为 415 的电话号码。

USE pubs
GO
SELECT phone
FROM authors
WHERE phone LIKE ’415%’
ORDER by au_lname
GO

下面是结果集:

phone       
------------
415 658-9932
415 548-7723
415 836-7128
415 986-7020
415 836-7128
415 534-9219
415 585-4620
415 354-7128
415 834-2919
415 843-2991
415 935-4228

(11 row(s) affected)

B. 使用带 % 通配符的 NOT LIKE
下例查找 authors 表中所有区号不是 415 的电话号码。

USE pubs
GO
SELECT phone
FROM authors
WHERE phone NOT LIKE ’415%’
ORDER BY au_lname
GO

下面是结果集:

phone       
------------
503 745-6402
219 547-9982
615 996-8275
615 297-2723
707 938-6445
707 448-4982
408 286-2428
301 946-8853
801 826-0752
801 826-0752
913 843-0462
408 496-7223

(12 row(s) affected)

C. 使用 ESCAPE 子句
下例使用 ESCAPE 子句和转义符查找 mytbl2 表的 c1 列中的精确字符串 10-15%。

USE pubs
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = ’mytbl2’)
   DROP TABLE mytbl2
GO
USE pubs
GO
CREATE TABLE mytbl2
(
 c1 sysname
)
GO
INSERT mytbl2 VALUES (’Discount is 10-15% off’)
INSERT mytbl2 VALUES (’Discount is .10-.15 off’)
GO
SELECT c1
FROM mytbl2
WHERE c1 LIKE ’%10-15!% off%’ ESCAPE ’!’
GO

D. 使用 [ ] 通配符
下例查找名字为 Cheryl 或 Sheryl 的作者。

USE pubs
GO
SELECT au_lname, au_fname, phone
FROM authors
WHERE au_fname LIKE ’[CS]heryl’
ORDER BY au_lname ASC, au_fname ASC
GO

下例查找姓为 Carson、Carsen、Karson 或 Karsen 的作者所在的行。

USE pubs
GO
SELECT au_lname, au_fname, phone
FROM authors
WHERE au_lname LIKE ’[CK]ars[eo]n’
ORDER BY au_lname ASC, au_fname ASC
GO

 

8.NOT
对布尔型输入取反。

语法
[ NOT ] boolean_expression

参数
boolean_expression

是任何有效的 Microsoft? SQL Server? 布尔表达式。

结果类型
Boolean

结果值
NOT 反转任何布尔表达式的值。

注释
可用 NOT 对一个表达式求反。

下面的表显示使用 NOT 运算符比较 TRUE 和 FALSE 值的结果。

  NOT
TRUE FALSE
FALSE TRUE
UNKNOWN UNKNOWN


示例
下面的示例查找所有预付款不超过 $5,500 的商业和心理学丛书。

USE pubs
GO
SELECT title_id, type, advance
FROM titles
WHERE (type = ’business’ OR type = ’psychology’)
   AND NOT advance > $5500
ORDER BY title_id ASC
GO

下面是结果集:

title_id type         advance              
-------- ------------ ---------------------
BU1032   business     5000.0000
BU1111   business     5000.0000
BU7832   business     5000.0000
PS2091   psychology   2275.0000
PS3333   psychology   2000.0000
PS7777   psychology   4000.0000

(6 row(s) affected)

 

9.OR
将两个条件结合起来。当在一个语句中使用多个逻辑运算符时,在 AND 运算符之后求 OR 运算符的值。但
是,通过使用括号可以更改求值的顺序。

语法
boolean_expression OR boolean_expression

参数
boolean_expression

是任何返回 TRUE、FALSE 或 UNKNOWN 的有效 Microsoft? SQL Server? 表达式。

结果类型
Boolean

结果值
当两个条件中的任何一个为 TRUE 时,OR 返回 TRUE。

注释
下表显示 OR 运算符的结果。

  TRUE FALSE UNKNOWN
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE UNKNOWN
UNKNOWN TRUE UNKNOWN UNKNOWN


示例
下面的示例检索某些书名,这些书具有大于 $5,500 的预付款,并且这些书籍是商业书籍或心理学书籍。如果
没有括号,那么 WHERE 子句就会检索预付款超过 $5,500 的所有商业书籍或者心理学书籍。

USE pubs
GO
SELECT SUBSTRING(title, 1, 30) AS Title, type
FROM titles
WHERE (type = ’business’ OR type = ’psychology’) AND
   advance > $5500
ORDER BY title
GO

下面是结果集:

Title                          type        
------------------------------ ------------
Computer Phobic AND Non-Phobic psychology  
Life Without Fear              psychology  
You Can Combat Computer Stress business    

(3 row(s) affected)

转载于:https://www.cnblogs.com/4501550/archive/2006/12/17/594547.html

SQL Server函数是用于在T-SQL中执行特定任务的代码块。根据其性质,函数可以分为确定性函数和非确定性函数。确定性函数在相同的参数下始终返回相同的结果,而非确定性函数的结果可能会受到其他因素的影响。\[1\] 非确定性函数在使用自定义函数等特定的SQL编程对象时有一些限制。这是因为SQL Server需要显式执行这些函数,而不能依赖于缓存或预编译的可执行对象。因此,在构建可重用的编程对象时,理解函数的确定性与非确定性是很重要的。\[2\] 此外,SQL Server还提供了一些工具函数,用于返回服务器和数据库的配置细节,以及返回不同对象属性状态的通用和专用函数。这些函数封装了对系统表和用户数据库的查询,建议使用这些系统函数而不是自己创建对系统表的查询,以防将来SQL Server版本对模式进行更改。\[3\] 总结来说,SQL Server函数是用于执行特定任务的代码块,可以分为确定性函数和非确定性函数。在使用自定义函数等特定的SQL编程对象时,对非确定性函数有一些限制。此外,SQL Server还提供了一些工具函数,用于返回服务器和数据库的配置细节。 #### 引用[.reference_title] - *1* *2* *3* [SQL函数说明大全](https://blog.csdn.net/leamonjxl/article/details/6309864)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值