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)
22NEWID
创建 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'
23NULLIF
如果两个指定的表达式相等,则返回空值。
语法
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)
24PARSENAME
返回对象名的指定部分。可以检索的对象部分有对象名、所有者名称、数据库名称和服务器名称。
说明 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)
25PERMISSIONS
返回一个包含位图的值,表明当前用户的语句、对象或列权限。
语法
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.'
26@@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'
27ROWCOUNT_BIG
返回受执行的最后一个语句影响的行数。该函数的功能与 @@ROWCOUNT 一样,除非 ROWCOUNT_BIG 的返回类型是 bigint。
语法
ROWCOUNT_BIG ( )
返回类型
bigint
注释
位于 SELECT 语句之后时,该函数返回由 SELECT 语句返回的行数。
位于 INSERT、UPDATE 或 DELETE 语句之后时,该函数返回受数据修改语句影响的行数。
位于 IF 这类不返回行的语句之后时,该函数返回零 (0)。
请参见
28SCOPE_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
29SERVERPROPERTY
返回有关服务器实例的属性信息。
语法
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'))
30SESSIONPROPERTY
返回会话的 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')
31SESSION_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)
32STATS_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
33SYSTEM_USER
当未指定默认值时,允许将系统为当前系统用户名提供的值插入表中。
语法
SYSTEM_USER
注释
在 CREATE TABLE 或 ALTER TABLE 语句中将 SYSTEM_USER niladic 函数用在 DEFAULT 约束中,或作为任何标准函数使用。
如果当前用户使用 Windows 身份验证登录到 Microsoft® SQL Server™,SYSTEM_USER 将返回 Windows 2000 或 Windows NT 4.0 登录标识名称,例如"DOMAIN\user_login_name"。然而,如果当前用户使用 SQL Server 身份验证登录到 SQL Server,SYSTEM_USER 将返回 SQL Server 登录标识名称,例如,当用户以 sa 登录时将返回 sa。
示例
A. 使用 SYSTEM_USER 返回当前系统用户名
本示例声明一个 char 变量,将 SYSTEM_USER 的当前值置于该变量中,然后打印该变量。
DECLARE @sys_usr char(30)
SET @sys_usr = SYSTEM_USER
SELECT 'The current system user is: '+ @sys_usr
GO
下面是结果集:
----------------------------------------------------------
The current system user is: sa
(1 row(s) affected)
B. 在 DEFAULT 约束中使用 SYSTEM_USER
本示例创建一个表,将 SYSTEM_USER 用作病人数据行中 receptionist 列的 DEFAULT 约束。
USE pubs
GO
CREATE TABLE appointments2
(
patient_id int IDENTITY(2000, 1) NOT NULL,
doctor_id int NOT NULL,
appt_date datetime NOT NULL DEFAULT GETDATE(),
receptionist varchar(30) NOT NULL DEFAULT SYSTEM_USER
)
GO
INSERT appointments2 (doctor_id)
VALUES (151)
INSERT appointments2 (doctor_id, appt_date)
VALUES (293, '5/15/98')
INSERT appointments2 (doctor_id, appt_date)
VALUES (27882, '6/20/98')
INSERT appointments2 (doctor_id)
VALUES (21392)
INSERT appointments2 (doctor_id, appt_date)
VALUES (24283, '11/03/98')
GO
下面是选择 appointments2 表中所有信息的查询:
SELECT *
FROM appointments2
ORDER BY doctor_id
GO
下面是结果集:
patient_id doctor_id appt_date receptionist
----------- ----------- ------------------------ ---------------
2000 151 Mar 4 1998 10:36AM sa
2001 293 May 15 1998 12:00AM sa
2003 21392 Mar 4 1998 10:36AM sa
2004 24283 Nov 3 1998 12:00AM sa
2002 27882 Jun 20 1998 12:00AM sa
(5 row(s) affected)
34@@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
35USER_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)