DBASK-数据库管理员结构化知识体系-Structured knowledge system for DataBase Administrators

Home

Transact-SQL 函数




Transact-SQL 函数。这些函数,用于从数据库中返回信息。在 select 列表中,在 where 子句中,以及在可以使用表达式的任何地方,都可以使用这些函数。它们往往被用作存储过程或程序的一部分。

本页面介绍部分常用函数,其他函数请点击右上角搜索图标搜索查询使用方法

abs函数




说明返回表达式的绝对值。
语法abs(numeric_expression)
参数 numeric_expression是数据类型为精确数值、近似数值、货币(或任何可隐式转换为这些类型的类型)的列、变量或表达式。
示例返回 -1 的绝对值:
select abs(-1)
-----------
1
用法abs 是一个数学函数,返回给定表达式的绝对值。结果与数值表达式属于同一类型并且具有相同的精度和标度。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 abs。

avg函数




说明计算所有(不同)值的数字平均值。
语法avg([all | distinct] expression)
参数
all 
将 avg 应用到所有值。all 为缺省值。
distinct 在应用 avg 之前消除重复值。distinct 是可选参数。
expression 可以是列名、常量、函数、任何由算术运算符或逐位运算符连接的列名、常量和函数组合,也可以是子查询。使用集合时,表达式通常是列名。
示例示例 1 计算平均预付款以及所有商业书籍总销售额的总和。每个这样的集合函数都将为检索到的所有行生成一个汇总值:
select avg(advance), sum(total_sales) from titles where type = "business"
------------------------ -----------
6,281.25 30788
用法 • avg 是一个集合函数,它查找一列中所有值的平均值。avg 只能用于数字(整数、浮点或货币)数据类型。计算平均值时将忽略空值。
• 在计算(有符号或无符号)int、smallint、tinyint 数据的平均值时,Adaptive Server 返回 int 值形式的结果。在计算(有符号或无符号)bigint 数据的平均值时,Adaptive Server 返回 bigint 值形式的结果。若要避免 DB-Library 程序出现溢出错误,请适当声明结果使用的变量。
• 不能对二进制数据类型使用 avg。
• 由于仅在数值数据类型上定义平均值,因此使用 avg Unicode 表达式会产生错误。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 avg。

case函数




说明支持条件 SQL 表达式;可用于任何能够使用值表达式的情况。
语法
case 

 when search_condition then expression 
[when search_condition then expression]...
 [else expression]
 end
 
 case 和值语法:
case expression
 when expression then expression 
[when expression then expression]...
 [else expression]
 end
参数
case
开始 case 表达式。
when
位于搜索条件或需要比较的表达式之前。
search_condition
用来为选择的结果设置条件。case 表达式的搜索条件与 where 子句中的搜索条件相似。。
then
位于指定 case 结果值的表达式之前。
expression
可以是列名、常量、函数、子查询或者任何由算术运算符或逐位运算符连接起来的列名、常量和函数的组合。
示例返回 discounts 表的 lowqty 或 highqty 列中第一次出现的非空值:
select stor_id, discount, coalesce (lowqty, highqty) from discounts
用法
• case 表达式允许使用 when...then 结构(而非 if 语句)来表达搜索条件,从而简化了标准 SQL 表达式。
• SQL 中可使用表达式的地方都可以使用 case 表达式。
• 如果查询生成了多种数据类型,那么数据类型层次就决定了 case 表达式结果的数据类型。如第7页的“混合模式表达式的数据类型”中所述。如果指定了两种 Adaptive Server 不能隐式转换的数据类型(例如,char 和 int),查询将会失败。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限case 权限缺省情况下授予所有用户。使用它无需任何权限。

cast函数




说明将指定的值转换为其它数据类型。
语法
cast (expression as datatype [(length | precision[, scale])])
参数
expression
是要从一种数据类型或日期格式转换为另一种数据类型或日期格式的值。它包括列、常量、函数以及由算术运算符或逐位运算符或子查询连接在一起的常量和函数的任意组合。
如果数据库中已启用 Java,expression 可以是将要转换为 Java-SQL 类的值。
当 unichar 用作目标数据类型时,如果未指定长度,则使用缺省长度,即 30 个 Unicode 值。
length
是与 char、nchar、unichar、univarchar、varchar、nvarchar、binary 和 varbinary 数据类型一起使用的可选参数。如果不提供长度,Adaptive Server 将把字符类型的数据截断到 30 个字符,把二进制类型的数据截断到 30 字节。字符和二进制表达式可以具有的最大长度是 64K。
precision
是 numeric 或 decimal 数据类型中的有效位数。对于 float 数据类型,精度是指尾数中有效的二进制位数。如果不提供精度,Adaptive Server 将对 numeric 和 decimal 数据类型使用缺省精度 18。
scale
是 numeric 或 decimal 数据类型中小数点右侧的位数。如果不提供标度,Adaptive Server 将使用缺省标度 0。
示例将日期转换为更加易读的 datetime 格式:
select cast("01/03/63" as datetime)
-----------
Jan 3 1963 12:00AM
用法
• cast 对 date 和 time 数据类型使用缺省格式。
• 当 cast 的参数超出该函数的定义范围时,该函数就会产生域错误。这种错误应极少发生。
• 使用 null 或 not null 可指定目标列的可为空性。可以将 null 或 not null与 select into 一同使用以创建一个新表,然后在源表中更改现有列的数据类型和可为空性。
• 您可以使用 cast 将 image 列转换为 binary 或 varbinary。这种转换受到 binary 数据类型的最大长度的限制,该长度由服务器逻辑页大小的最大列大小决定。如果未指定长度,转换后的值将具有缺省的长度(30 个字符)。
• 可以将  unichar 表达式用作目标数据类型,也可将它们转换为其它数据类型。unichar 表达式可在服务器支持的任何其它数据类型间显式或隐式转换。
• 当 unichar 用作目标类型时,如果您未指定长度,则使用缺省长度,即 30 个 Unicode 值。如果目标类型的长度不足以容纳给定的表达式,就会显示出错消息。

隐式转换
如果两种数据类型的主字段不匹配,那么在这两种数据类型之间进行隐式转换可能导致数据截断、插入缺省值或产生错误消息。例如,如果将datetime 值转换为 date 值,时间部分将被截断,只留下日期部分。如果将 time 值转换为 datetime 值,将在新的 datetime 值中添加缺省的日期部分 Jan 1, 1900。如果将 date 值转换为 datetime 值,则将向 datetime 值添加缺省的时间部分 00:00:00:000。
DATE -> VARCHAR、 CHAR、BINARY、VARBINARY、DATETIME、SMALLDATETIME
 TIME -> VARCHAR、 CHAR、BINARY、VARBINARY、DATETIME、SMALLDATETIME
 VARCHAR、CHAR、BINARY、VARBINARY、DATETIME、SMALLDATETIME -> DATE
 VARCHAR、CHAR、BINARY、VARBINARY、DATETIME、SMALLDATETIME -> TIME

显式转换
如果试图将 date 显式转换为 datetime,并且值(如“Jan 1, 1000”)超出 datetime 范围,则不允许转换并出现提示性的错误消息。
DATE -> UNICHAR、 UNIVARCHAR
 TIME -> UNICHAR、 UNIVARCHAR
 UNICHAR、UNIVARCHAR -> DATE
 UNICHAR、UNIVARCHAR -> TIME

涉及 Java 类的转换
• 如果数据库中已启用 Java,则可按下列方法使用 cast 更改数据类型:
• 将 Java 对象类型转换为 SQL 数据类型。
• 将 SQL 数据类型转换为 Java 类型。
• 如果表达式(源类)的编译时数据类型是目标类的子类或超类,
则会将安装在 Adaptive Server 上的任何 Java-SQL 类转换为安装在 Adaptive Server 上的任何其它 Java-SQL 类。
 
标准符合 ANSI SQL 的级别:符合 ANSI 标准。
权限任何用户都可以执行 cast。

ceiling函数




说明返回大于或等于指定值的最小整数。
语法ceiling(value)
参数 value 是列、变量或表达式,它们的数据类型为精确数值、近似数值、货币、或任何可隐式转换为这些类型之一的类型。
示例返回值 124:
select ceiling(123.45)
124
用法• ceiling 是一个数学函数,它返回大于或等于指定值的最小整数。返回值与所提供值的数据类型相同。对于 numeric 和 decimal 值,结果的精度与所提供的值相同,而标度为零。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 ceiling。

convert函数




说明将指定的值转换成另一数据类型或其它 datetime 显示格式。
语法
convert (datatype [(length) | (precision[, scale])] 
[null | not null], expression [, style])
参数
 datatype
是系统提供的数据类型(例如,char(10)、unichar (10)、varbinary (50)或 int),表达式可以转换成这些数据类型。不能使用用户定义的数据类型。
如果数据库中已启用 Java,datatype 也可以是当前数据库中的 Java-SQL 类。
length
是与 char、nchar、unichar、univarchar、varchar、nvarchar、binary 和 varbinary 数据类型一起使用的可选参数。如果不提供长度,Adaptive 
Server 将把字符类型的数据截断到 30 个字符,把二进制类型的数据截断到 30 字节。字符和二进制表达式可以具有的最大长度是 64K.。
precision
是 numeric 或 decimal 数据类型中的有效位数。对于 float 数据类型,精度是指尾数中有效的二进制位数。如果不提供精度,Adaptive Server 将对 numeric 和 decimal 数据类型使用缺省精度 18。
scale
是 numeric 或 decimal 数据类型中小数点右侧的位数。如果不提供标度,Adaptive Server 将使用缺省标度 0。
null | not null
指定结果表达式的可为空性。如果不提供 null 或 not null,转换后的结果将与表达式具有相同的可为空性。
expression
是要从一种数据类型或日期格式转换为另一种数据类型或日期格式的值。
如果数据库中已启用 Java,expression 可以是将要转换为 Java-SQL 类的值。
当 unichar 用作目标数据类型时,如果未指定长度,则使用缺省长度,即 30 个 Unicode 值。
style
是用于已转换数据的显示格式。如果将 money 或 smallmoney 数据转换为字符类型,则使用 style 1,在每 3 位数后显示一个逗号。
示例
select title, convert(char(12), total_sales) from titles
用法
• convert 是一个数据类型转换函数,它在多种数据类型之间进行转换并将日期/时间及货币数据重新格式化,以便于显示。
• 如果它们被压缩,convert 会在将它们转换为其它数据类型之前先解压缩大对象 (LOB) 列。
• convert — 返回已转换为其它数据类型或其它 datetime 显示格式的指定值。当从 unitext 向其它字符和二进制数据类型转换时,结果受到目标数据类型的最大长度的限制。如果未指定长度,转换后的值将具有缺省大小(30 个字节)。如果正在使用 enabled enable surrogate 
processing,将返回整个代理对。例如,如果将包含数据 U+0041U+0042U+20acU+0043 (代表 “AB €”)的 unitext 列转换为 UTF-8 varchar(3) 列,则会返回以下信息:
select convert(varchar(3), ut) from untable
--
AB
• convert 的参数超出该函数的定义范围时,该函数就会产生域错误。这种错误应极少发生。 • 使用 null 或 not null 可指定目标列的可为空性。尤其是,可使用 select into 创建一个新表,然后在源表中更改现有列的数据类型和可为空性(参见前面的示例 8)。 在以下条件下,结果将为未定义的值: • 所转换的表达式将是 not null 结果。 • 表达式的值为空。 使用下面的 select 语句能够为可预测的结果生成已知的非空值:
select convert(int not null isnull(col2, 5)) from table1
• 您可以使用 convert 将 image 列转换为 binary 或 varbinary。这种转换受到 binary 数据类型的最大长度的限制,该长度由服务器逻辑页大小的最大列大小决定。如果未指定长度,转换后的值将具有缺省的长度(30 个字符)。 • 可以将 unichar 表达式用作目标数据类型,也可将它们转换成其它数据类型。unichar 表达式可在服务器支持的任何其它数据类型间显式或隐式转换。 • 当 unichar 用作目标类型时,如果您未指定长度,则使用缺省长度,即 30 个 Unicode 值。如果目标类型的长度不足以容纳给定的表达式,就会显示出错消息。 隐式转换 如果两种数据类型的主字段不匹配,那么在这两种数据类型之间进行隐式转换可能导致数据截断、插入缺省值或产生错误消息。例如,如果将datetime 值转换为 date 值,时间部分将被截断,只留下日期部分。如果将 time 值转换为 datetime 值,将在新的 datetime 值中添加缺省的日期部分 Jan 1, 1900。如果将 date 值转换为 datetime 值,则将向 datetime 值添加缺省的时间部分 00:00:00:000。 DATE -> VARCHAR、 CHAR、BINARY、VARBINARY、DATETIME、SMALLDATETIME TIME -> VARCHAR、 CHAR、BINARY、VARBINARY、DATETIME、SMALLDATETIME VARCHAR、CHAR、BINARY、VARBINARY、DATETIME、SMALLDATETIME -> DATE VARCHAR、CHAR、BINARY、VARBINARY、DATETIME、SMALLDATETIME -> TIME 显式转换 如果试图将 date 显式转换为 datetime,并且值(如“Jan 1, 1000”)超出 datetime 范围,则不允许转换并出现提示性的错误消息。 DATE -> UNICHAR、 UNIVARCHAR TIME -> UNICHAR、 UNIVARCHAR UNICHAR、UNIVARCHAR -> DATE UNICHAR、UNIVARCHAR -> TIME 涉及 Java 类的转换 • 如果数据库中已启用 Java,则可按下列方法使用 convert 更改数据类型: • 将 Java 对象类型转换为 SQL 数据类型。 • 将 SQL 数据类型转换为 Java 类型。 • 如果表达式(源类)的编译时数据类型是目标类的子类或超类,则会将安装在 Adaptive Server 上的任何 Java-SQL 类转换为安装在 Adaptive Server 上的任何其它 Java-SQL 类。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 convert。

count函数




说明以整数形式返回(不同)非空值的数量或选定的行数。
语法
count([all | distinct] expression)
参数
 all
将 count 应用到所有值。all 是缺省值。
distinct
在应用 count 之前消除重复值。distinct 是可选参数。
expression
可以是列名、常量、函数、任何由算术运算符或逐位运算符连接的列名、常量和函数组合,也可以是子查询。使用集合时,表达式通常是列名。
示例查找作者居住的不同城市的数量:
select count(distinct city) from authors 
用法
• count 是一个集合函数,它查找列中非空值的数量。
• 指定 distinct 后,count 将查找唯一非空值的数量。除了text 和 image 之外,count 可用于所有数据类型,包括 unichar。进行计数时将忽略空值。
• 对于空表、只包含空值的列,以及只包含空值的组,count(column_name) 会返回一个为 0 的值。
• count(*) 查找行数。count(*) 不带任何参数,并且不能同 distinct 一起使用。无论是否含有空值,所有行均被计数。
• 当连接多个表时,应在选择列表中包括 count(*),以生成连接结果中的行数。如果是为了计算一个表中符合标准的行数,可使用 count(column_name)。
• count 可在子查询中用来进行存在性检查。例如:
select * from tab where 0 < 
(select count(*) from tab2 where ...)
然而,因为 count 对所有匹配值进行计数,所以 exists 或 in 返回结果的速度可能更快。例如:
select * from tab where exists (select * from tab2 where ...)
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 count。

data_pages函数




说明返回指定表、索引或特定分区所用的页数。结果不包括用于内部结构的页。
语法
data_pages(dbid, object_id [, indid [, ptnid]])
参数
 dbid
是包含数据页的数据库的数据库 ID。
object_id
是表、视图或其它数据库对象的对象 ID。它们存储在 sysobjects 的 id 列中。
indid
是目标索引的索引 ID。
ptnid
是目标分区的分区 ID。
示例返回指定数据库中对象 ID 为 31000114 的对象所使用的页数(包括所有索引):
select data_pages(5, 31000114)
用法
• 以 APL(所有页锁)表为例,如果表中存在聚簇索引,则传递值为以下数字的 indid:
•  0 — 报告数据页。
•  1 — 报告索引页。
当 object_id 在当前数据库中不存在,或当目标 indid 或 ptnid 无法找到时,所有错误条件都返回值零。
• data_pages 会放弃尚未在高速缓存中的对象的描述符,而不是消耗资源。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 data_pages。

datepart函数




说明返回日期表达式的指定分量的整数值。
语法
datepart(date_part {date | time | datetime | bigtime | bigdatetime}))
参数date_part 是日期分量。
示例假定当前日期是 1995 年 11 月 25 日:
select datepart(month, getdate())
-----------
11
用法
• 以整数的形式返回指定 date(第二个参数)的第一个参数中指定的datepart。将 date、time、datetime、bigdatetime、bigtime 或 smalldatetime值作为它的第二个参数。如果 datepart 是小时、分钟、秒、毫秒或
微秒,则结果为 0。
• datepart 返回符合 ISO 标准 8601 的数字,此标准定义了一周中的第一天和一年中的第一周。根据 datepart 函数包含的是 calweekofyear 值、calyearofweek 值还是 caldayorweek 值,对同一时间单位返回的日期可能不同。例如,如果将 Adaptive Server 配置为以美国英语作为缺省语言,以下命令将返回 1988:
datepart(cyr, "1/1/1989")
不过,以下命令将返回 1989:
datepart(yy, "1/1/1989)
出现这种不一致是由于该 ISO 标准将一年的第一周定义为包含周四并且 以周一开始的第一周。 如果服务器以美国英语为缺省语言,则一周的第一天是周日,一年的第一周是包含 1 月 4 日的那一周。 • 如果在 datepart 中使用日期分量 weekday 或 dw,将返回相应的编号。 与星期名称对应的编号取决于 datefirst 设置。某些语言的缺省设置(包括 us_english)会生成 Sunday=1、 Monday=2,依此类推;而其它语言的缺省设置则生成 Monday=1、Tuesday=2,依此类推。可在 每次会话时用 set datefirst 更改缺省行为。 • calweekofyear 可缩写为 cwk,它返回一年中周的序数。calyearofweek 可缩写为 cyr,它返回一周开始的年份。caldayofweek 可缩写为 cdw,它返回一周中每一天的序数。calweekofyear、calyearofweek 和 caldayofweek 不能用作 dateadd、datediff 和 datename 的日期分量。 • 由于 datetime 和 time 仅精确到 1/300 秒,因此当这些数据类型用于 datepart 时,毫秒会舍入到最近的 1/300 秒。 • 由于 smalldatetime 仅对于分钟是精确的,所以在 datepart 中使用 smalldatetime 值时,秒和毫秒总为 0。 • 语言设置将影响星期日期分量的值。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 datepart。

day函数




说明返回指定日期的 datepart 中表示天的整数。
语法
day(date_expression)
参数 date_expression 是 datetime、smalldatetime、date 类型的表达式,或 datetime 格式的字符串。
示例返回整数 02:
day("11/02/03")
-----------
02
用法 day(date_expression) 等同于 datepart(dd,date_expression)。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 day。

db_id函数




说明显示指定数据库的 ID 号。
语法
db_id(database_name)
参数 database_name 是数据库的名称。database_name 必须是字符表达式。如果它是常量表达式,则必须用引号将其引起来。
示例返回 sybsystemprocs 的 ID 号:
select db_id("sybsystemprocs")
-----------
4
用法
 • db_id 是一个系统函数,它返回数据库的 ID 号。
• 如果未指定 database_name,db_id 将返回当前数据库的 ID 号。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 db_id。

db_name函数




说明显示具有指定 ID 号的数据库的名称。
语法
db_name([database_id])
参数 database_id 是数据库 ID 的数值表达式(存储在 sysdatabases.dbid 中)。
示例返回当前数据库的名称:
select db_name()
用法
  • db_name 是一个系统函数,它返回数据库的名称。
• 如果未提供 database_id,db_name 将返回当前数据库的名称。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 db_id。

floor函数




说明返回小于或等于指定值的最大整数。
语法
floor(numeric)
参数 numeric是任意精确数值(numeric、dec、decimal、tinyint、smallint、int 或 bigint)、近似数值(float、real 或 double precision)或 money 列、变量、常量表达式,或上述数据类型的组合形式。。
示例
select floor(123.45)
-----------
123
用法
• floor 是一个数学函数,它返回小于或等于指定值的最大整数。其结果与数字表达式的类型相同。
对于数字和小数表达式,其结果的精度与该表达式的精度相同,标度为零。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 db_id。

getdate函数




说明返回当前系统日期和时间。
语法
getdate()
参数
示例 假定当前日期是 1995 年 11 月 25 日上午 10:32:
select getdate()
Nov 25 1995 10:32AM
用法
  • getdate 是一个日期函数,它返回当前的系统日期和时间。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 db_id。

host_id函数




说明返回当前 Adaptive Server 客户端的客户端计算机操作系统进程 ID。
语法
host_id()
参数
示例
select host_name(), host_id()
------ -----
dbask.cn 2025
用法
 • db_id 是一个系统函数,它返回数据库的 ID 号。
• 如果未指定 database_name,db_id 将返回当前数据库的 ID 号。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 db_id。

host_name函数




说明显示客户端进程的当前宿主计算机名。
语法
host_name()
参数
示例
select host_name()
-----------
dbask.cn
用法
  • host_name 是一个系统函数,它返回客户端进程(而不是服务器进程)的当前宿主计算机名。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 db_id。

lockscheme函数




说明以字符串形式返回指定对象的锁定方案。
语法
lockscheme(object_name)
 lockscheme(object_id [, db_id])
参数
object_name
是锁定方案返回的对象的名称。object_name 也可以是完全限定名。
db_id
 object_id 指定的数据库的 ID。
object_id
是锁定方案返回的对象的 ID。
示例当前数据库中的 titles 表选择锁定方案:
select lockscheme("titles")
用法
  • lockscheme 返回 varchar(11) 并允许为 NULL。
• lockscheme 缺省为当前数据库,前提是:
• 不提供全限定 object_name。
• 不提供 db_id。
• 为 db_id 提供 Null。
• 如果指定对象不是表,lockscheme 将返回字符串“not a table”。
标准符合 ANSI SQL 的级别:Transact-SQL 扩展。
权限任何用户都可以执行 db_id。