8、系统函数
系统函数用于获取有关计算机系统、用户、数据库和数据库对象的信息。系统函数可以让用户在得到信息后,使用条件语句,根据返回的信息进行不同的操作。与其它函数一样,可以在SELECT 语句的SELECT 和WHERE 子句以及表达式中使用系统函数。
·APP_NAME()
APP_NAME() 函数语法如下:
APP_NAME()
APP_NAME() 函数返回当前执行的应用程序的名称。其返回值类型为nvarchar (128)。
例4-77: 测试当前应用程序是否为SQL Server Query Analyzer
·COALESCE()
COALESCE() 函数语法如下:
COALESCE (
1<expression> [, ...n])
2COALESCE() 函数返回众多表达式中第一个非NULL 表达式的值。如果所有的表达式均为NULL, 则COALESCE() 函数返回NULL 值。COALESCE() 函数等效于下面的CASE 语句:
3
4CASE
5WHEN (expression1 IS NOT NULL) THEN expression1
6…
7WHEN (expressionN IS NOT NULL) THEN expression
8ELSE NULL
9
10**例4-78:**
11
12
13·COL_LENGTH()
14COL_LENGTH() 函数语法如下:
15COL_LENGTH (<'table_name'>, <'column_name'>)
16COL_LENGTH() 函数返回表中指定字段的长度值。其返回值为INT 类型。
17
18**例4-79:**
19
20
21·COL_NAME()
22COL_NAME() 函数语法如下:
23COL_NAME (<table_id>, <column_id>)
24COL_NAME() 函数返回表中指定字段的名称,即列名。其返回值为SYSNAME 类型。其中table_id 和column_id 都是INT 类型的数据,函数用table_id 和column_id 参数来生成列名字符串。关于如何获得table_id 和column_id, 请参见OBJECT_ID() 函数。
25
26**例4-80:**
27
28
29
30·DATALENGTH()
31DATALENGTH() 函数语法如下:
32DATALENGTH (<expression>)
33DATALENGTH() 函数返回数据表达式的数据的实际长度。其返回值类型为INT。DATALENGTH() 函数对VARCHAR、 VARBINARY、 TEXT、 IMAGE、 NVARCHAR和NTEX 等能存储变动长度数据的数据类型特别实用。NULL 的长度为NULL。
34
35**例4-81:**
36
37
38· DB_ID()
39DB_ID() 函数语法如下:
40DB_ID (['database_name'])
41DB_ID() 函数返回数据库的编号。其返回值为SMALLINT 类型。如果没有指定database_name, 则返回当前数据库的编号。
42
43**例4-82:**
44
45
46
47·DB_NAME()
48DB_NAME() 函数语法如下:
49DB_NAME (database_id)
50DB_NAME() 函数返回数据库的名称.其返回值类型为NVARCHAR (128). database_id是SMALLINT 类型的数据.如果没有指定database_id, 则返回当前数据库的名称.
51
52**例4-83:**
53
54
55· FORMATMESSAGE()
56FORMATMESSAGE() 函数语法如下:
57FORMATMESSAGE (<message_number>, <param_value>[, ...n])
58FORMATMESSAGE() 函数用于从系统信息表sysmessages 中挑选一条现存的信息,
59再将其格式转换为用户需要的形式.其功能类似于RAISERROR 命令,不同的是RAISERROR命令立即打印出信息,而FORMATMESSAGE() 函数返回编辑过的信息给调用它的程序.其返回值类型为NVARCHAR.
60其中message_number 是存储在sysmessages 系统表中的信息ID 号.param_value 是在信息中使用的参数.最多可使用20 个参数.
61FORMATMESSAGE() 函数查找使用当前语言平台语言的信息,如果没有本地语言的信息,则使用U.S. English 版本语言的信息.
62
63**例4-84:** 假定有一个编号为10001 的信息存储在sysmessages 表中,此信息的内容为"The Length of rows %column_name in %table_name is %column_num.".FORMATMESSAGE() 函数用值myColumn、 myTable 和20 分别替代上述参数值,将结果存储在变量@test1 中.程序如下:
64declare @test1 varchar (100)
65select @test1 = formatmessage (10001, 'myColumn', 'myTable', 20)
66
67·GETANSINULL()
68GETANSINULL() 函数语法如下:
69GETANSINULL() (['database_name'])
70GETANSINULL() 函数返回当前数据库默认的NULL 值.其返回值类型为INT.GETANSINULL() 函数对ANSI 空值NULL 返回1; 如果没有定义ANSI 空值,则返回0.
71
72**例4-85:
73** select getansinull ('pangu')
74运行结果如下:
75\------
761
77
78·HOST_ID()
79HOST_ID() 函数语法如下:
80HOST_ID()
81HOST_ID() 函数返回服务器端计算机的名称.其返回值类型为NCHAR.
82
83**例4-86:**
84declare @hostID char (8)
85select @hostID = host_id()
86print @hostID
87运行结果如下:
88-606771
89
90·HOST_NAME()
91HOST_NAME() 函数语法如下:
92HOST_NAME()
93HOST_NAME() 函数返回服务器端计算机的名称.其返回值类型为CHAR (8).
94
95**例4-87:**
96declare @hostNAME nchar (20)
97select @hostNAME = host_name()
98print @hostNAME
99
100运行结果如下:
101XUJIN
102
103·IDENTITY()
104IDENTITY() 函数语法如下:
105IDENTITY (<data_type>[, seed, increment]) [AS column_name])
106IDENTITY() 函数只在SELECT...INTO 语句中使用,用于插入一个identity column列到新表中.其返回值类型与data_type 的类型相同.
107
108其中:
109data_type 指定数据类型.data type 是INTEGER 或DECIMAL 类的数据类型.Seed指定identity column 的初值,即第一个值.Increment 指定增加一个记录时,记录的identity column 值应在前记录的基础上增加的值.seed 和increment 的缺省值为1.column_name 是所插入的identity column 的列名.虽然AS column_name 为可选项,但由于函数在表中插入了一个新列,所以必须指定列名.如果不使用AS column_name 选项,可以使用以下两种方式来指定列名:
110(1) select identity (int, 1, 1) as column_name
111into newtable
112from oldtable
113(2) select column_name = identity (int, 1, 1)
114into newtable
115from oldtable
116有关identity column 的信息,请参见"管理数据库表"中的"列属性"章节.
117
118·IDENT_INCR()
119IDENT_INCR() 函数语法如下:
120IDENT_INCR ('table_or_view')
121IDENT_INCR() 函数返回表中标识性字段identity column 的增量.若无此字段,则返回NULL 值.其返回值类型为NUMERIC.
122
123**例4-88:**
124
125
126·IDENT_SEED()
127IDENT_SEED() 函数语法如下:
128IDENT_SEED (<'table_or_view'>)
129IDENT_SEED() 函数返回表中标识性字段identity column 的初值.若无此字段,则返回NULL 值.其返回值类型为NUMERIC.
130
131**例4-89:**
132
133
134·INDEX_COL()
135INDEX_COL() 函数语法如下:
136INDEX_COL (<'table_name'>, <index_id>, <key_id>)
137INDEX_COL() 函数返回表内索引识别码为index_id 的索引的名称,并找出组成该索引的列组合中第key_id 个列名.其返回值类型为NCHAR.
138
139**例4-90:**
140
141
142
143·ISDATE()
144ISDATE() 函数语法如下:
145ISDATE (<expression>)
146ISDATE() 函数判断所给定的表达式是否为合理日期,如果是则返回1, 不是则返回0.
147
148**例4-91:**
149
150
151
152·ISNULL()
153ISNULL() 函数语法如下:
154ISNULL (<check_expression>, <replacement_value>)
155ISNULL() 函数将表达式中的NULL 值用指定值替换.如果check_expresssion 不是NULL, 则返回其原来的值,否则,返回replacement_value 的值.
156
157**提醒:** reaplacement_value的数据类型应与chech_expresssion一致.
158
159**例4-92:**
160
161
162·ISNUMERIC()
163ISNUMERIC() 函数语法如下:
164ISNUMERIC (<expression>)
165ISNUMERIC() 函数判断所给定的表达式是否为合理的数值(INTEGER、 FLOATING POINT NUMBER、 MONEY 或DECIMAL 类型),如果是则返回1, 不是则返回0.
166
167**提醒:** 检查MONEY型数据时,应先用CONVERT()函数将其转换为数值型或字符型。
168
169**例4-93:**
170
171
172
173·NEWID
174NEWID() 函数语法如下:
175NEWID()
176NEWID() 函数返回一个UNIQUEIDENTIFIER 类型的数值.此函数使用计算机的网卡的Ethernet 地址加上经由CPU Clock 产生的数字而得到其返回值.由于网卡的Ethernet地址是全球惟一的(在未来近一百年内不会生产出相同Ethernet 地址的网卡),因而函数所产生的数字也是惟一的.
177
178**例4-94:**
179
180
181·NULLIF()
182NULLIF() 函数语法如下:
183NULLIF (<expression1>, <expression2>)
184NULLIF() 函数在expression1 与expression2 相等时返回NULL 值,若不相等时则返回expression1 的值.其返回值类型与expression1 相同.expression1 与expression2 应为同类的数据类型.
185
186**例4-95:**
187
188
189·OBJECT_ID()
190OBJECT_ID() 函数语法如下:
191OBJECT_ID (<'object_name'>)
192OBJECT_ID() 函数返回数据库对象的编号.其返回值类型为INT.
193
194**例4-96:**
195
196
197**提醒:** 当指定一个临时表的表名时,其表名的前面必须加上临时数据库名"tempdb",如:select object_id("tempdb..#mytemptable").
198
199·OBJECT_NAME()
200OBJECT_NAME() 函数语法如下:
201OBJECT_NAME (<object_id>)
202OBJECT_NAME() 函数返回数据库对象的名称.其返回值类型为NCHAR.
203
204**例4-97:**
205
206
207·PARSENAME()
208PARSENAME() 函数语法如下:
209PARSENAME (<'object_name '>, <object_piece>)
210PARSENAME() 函数返回一个数据库对象完整名称中的特定部分(对象名称或数据库拥有者名称或数据库名称或服务器名称).其返回值类型为NCHAR.
211其中object_piece 为INT 类型,其取值如下:
212对象名称Object name;
213数据库拥有者名称Owner name;
214数据库名称Database name;
215服务器名称Server name.
216如果object_name 或object_piece 为NULL, 则返回NULL 值.
217
218**例4-98:**
219
220
221·PERMISSIONS()
222PERMISSIONS() 函数语法如下:
223PERMISSIONS ([object_id [, 'column_name']])
224PERMISSIONS() 函数用于获取当前用户对某一对象的存取权限或对某一命令的执行权限.其返回值为一个32 位的bitmap 值,其中低16 位表示目前用户对象的存取权限设定值.高16 位表示用户是否可以开放此对象的权限给其它人.
225如果不指定object_id, 则函数返回目前用户的命令执行权限的bitmap 值.使用column_name 选项可以得到表的列权限.各权限值见表4-10 至4-12.
226 
227有关PERMISSIONS() 函数使用方法,我们将在以后的章节分别讲述.
228
229·STATS_DATE()
230STATS_DATE() 函数语法如下:
231STATS_DATE (<table_id>, <index_id>)
232STATS_DATE() 函数返回最新的索引统计日期.其返回值类型为DATETIME.
233
234**例4-99:**
235
236
237·SUSER_SID()
238SUSER_ SID() 函数语法如下:
239SUSER_SID (['login_name'])
240SUSER_SID() 函数根据用户登录名返回用户的SID (Security Identification Number,安全帐户名)号.其返回值类型为INT. 如果不指定login_name, 则返回当前用户的SID号.
241
242**例4-100:**
243
244
245·SUSER_SNAME()
246SUSER_SNAME() 函数语法如下:
247SUSER_SNAME ([server_user_sid])
248SUSER_SNAME() 函数根据SID 号返回用户的登录名.如果没有指定server_user_sid,则返回当前用户的登录名.其返回值类型为NCHAR.
249
250**例4-101:**
251
252
253·USER_ID()
254USER_ID() 函数语法如下:
255USER_ID (['user_name'])
256USER_ID() 函数根据用户数据库的用户名返回用户的数据库ID 号.其返回值类型为INT. 如果没有指定user_name, 则返回当前用户的数据库ID 号.
257
258**例4-102:**
259
260
261·USER_NAME()
262USER_NAME() 函数语法如下:
263USER_NAME ([user_id])
264USER_NAME() 函数根据用户的数据库ID 号返回用户的数据库用户名.其返回值类型为NCHAR. 如果没有指定user_id, 则返回当前数据库的用户名.
265
266**例4-103:**
267
268
2699、TEXT 和IMAGE 函数
270·TEXTPTR()
271TEXTPTR() 函数语法如下:
272**TEXTPTR ( <column>) **
273TEXTPTR() 函数返回一个指向存储文本的第一个数据库页的指针.其返回值是一个VARBINARY (16) 类型的二进制字符串.如果数据类型为TEXT、 NTEXT 或IMAGE的列没有赋予初值,则TEXTPTR() 函数返回一个NULL 指针.
274
275**例4-104:**
276
277
278·TEXTVALID()
279TEXTVALID() 函数语法如下:
280**TEXTVALID ( <'table.column'>, <text_ pointer="">) **
281TEXTVALID() 函数用于检查指定的文本指针是否有效.如果有效,则返回1; 无效,则返回0. 如果列未赋予初值,则返回NULL 值.
282
283**例4-105:**
284
285
286
28710、NILADIC 函数
288NILADIC 函数返回一个用户或时间戳值.这类函数均不带参数.NILADIC 函数经常被定义为CREATE 或ALERT TABLE 语句中DEFAULT 约束的一部分,可参见"管理数据库表"章节.主要的NILADIC 函数如下:
289
290·CURRENT_TIMESTAMP
291CURRENT_TIMESTAMP 函数语法如下:
292**CURRENT_TIMESTAMP**
293CURRENT_TIMESTAMP 函数返回当前的日期和时间,等同于GETDATE() 函数.返回值类型为DATETIME.
294
295**例4-106:**
296
297
298·CURRENT_USER
299CURRENT_USER 函数语法如下:
300**CURRENT_USER**
301CURRENT_USER 函数与USER_NAME() 函数功能相同,返回当前用户的数据库用户名.返回值类型为SYSNAME.
302
303**例4-107:**
304 
305
306·SESSION_USER
307SESSION_USER 函数语法如下:
308**SESSION_USER**
309SESSION_USER 函数等同于USER_NAME() 函数,返回当前用户的数据库用户名.返回值类型为NCHAR.
310
311·SYSTEM_USER
312SYSTEM_USER 函数语法如下:
313**SYSTEM_USER**
314SYSTEM_USER 返回当前系统的用户名.如果用户是以Windows NT 认证方式登录SQL Server 的,则会返回Windows NT 的登录名;如果用户是以SQL Server 认证方式登录的,则返回SQL Server 中的用户名.
315
316**例4-108:**
317
318
319·USER
320USER 函数语法如下:
321**USER**
322USER 与系统函数USER_NAME() 的功能相同,返回当前用户的数据库用户名.返回值类型为CHAR.
323
324**例4-109:**
325
326
32711、用户自定义函数
328从SQL Server 2000 开始,用户可以自定义函数了.在SQL Server 2000 中用户自定义函数是作为一个数据库对象来管理的,可以使用企业管理器(Enterprise Manager) 或Transact-SQL 命令来创建、修改、删除.其具体方法请参见第13 章"游标、视图和自定义函数".
329
330本章介绍了Transact-SQL 语言的基本概念,及其使用方法.Transact-SQL 语言需要大量的实践,才能熟练运用.本章及以后的SQL 语法基本上都是标准的ANSI SQL 兼容语法,在其它数据库中,如ORACLE、 SYBASE、 INFORMIX、 FOXPRO 等,大部分语句均可套用.</text_></column></index_id></table_id></object_piece></object_id></expression2></expression1></expression></replacement_value></check_expression></expression></key_id></index_id></data_type></param_value></message_number></expression></column_id></table_id></expression>