SQL內置Function--系统函数(2)

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值