项目二
Transact-SQL语言
1. 项目要点
(1) 使用RETURN语句返回存储过程的参考值。
(2) 使用CURRENT_USER约束列。
2. 引言
Transact-SQL是SQL Server 2008的编程语言,是一种结构化查询语言,是SQL的增强版本。使用Transact-SQL语言,可以从数据库中提取数据,完成SQL语言的数据定义(DDL)、数据操作(DML)和数据控制(DCC)等行为。本项目首先对Transact-SQL语言进行简单概述,然后详细讲述Transact-SQL语言的基本功能。先介绍Transact-SQL语言的两种标识符,即常规标识符和分隔标识符,然后介绍Transact-SQL语言中常用的几种常量、变量、常用的运算符和常用的表达式。最后介绍Transact-SQL语言中常用的9种函数,并对典型函数进行举例。通过本项目的讲述,读者将能够较详细地了解Transact-SQL语言的基本功能,方便后续项目的学习。
3. 项目导入
陈倩用Transact-SQL语言编写程序,查询教学管理系统Teacher数据库student_grade表中成绩大于80的数据,看下面的语句:
SELECT * FROM student_grade WHERE 成绩>80
程序执行结果如图2-1所示。
图2-1 使用Transact-SQL进行查询
4. 项目分析
在如图2-1所示的查询中,比较运算符(>)的返回值为布尔数据类型,可以有3种值:TRUE、FALSE或NULL。比较表达式的条件成立时,返回TRUE,否则返回FALSE。如果打开ANSI_NULLS选项,则当比较操作数中任一个为NULL时,将返回NULL。
5. 能力目标
(1) 掌握Transact-SQL的基本语言。
(2) 掌握Transact-SQL的内置函数。
6. 知识目标
(1) 学习Transact-SQL常量、变量、运算符、表达式、控制流程语句。
(2) 学习数学函数、字符串函数、日期时间函数等。
任务1 使用RETURN语句返回存储过程的参考值
Transact-SQL是Microsoft公司在关系型数据库管理系统SQL Server中对SQL-3标准的实现,是微软对SQL的扩展,具有SQL的主要特点,同时增加了变量、运算符、函数、流程控制和注释等语言元素,使其功能更加强大。
知识储备
1. Transact-SQL概述
Transact-SQL对SQL Server十分重要,在SQL Server中,使用图形界面能够完成的所有功能,都可以通过Transact-SQL来实现。与SQL Server通信的所有应用程序都通过向服务器发送Transact-SQL语句来进行操作,而与应用程序的界面无关。
根据其完成的具体功能,可以将Transact-SQL语句分为4大类,分别为数据定义语句、数据操纵语句、数据控制语句和一些附加的语言元素。
(1) 数据定义语句:CREATE TABLE、DROP TABLE、ALTER TABLE、CREATE VIEW、DROP VIEW、CREATE INDEX、DROP INDEX、CREATE PROCEDURE、ALTER PROCEDURE、DROP PROCEDURE、CREATE TRIGGER、ALTER TRIGGER、DROP TRIGGER。
(2) 数据操纵语句:SELECT、INSERT、DELETE、UPDATE。
(3) 数据控制语句:GRANT、DENY、REVOKE。
(4) 附加的语言元素:BEGIN TRANSACTION / COMMIT、ROLLBACK、SET TRANSACTION、DECLARE OPEN、FETCH、CLOSE、EXECUTE。
2. 标识符
数据库对象的名称即为标识符。Microsoft SQL Server中的所有内容都可以有标识符,例如服务器、表、视图、列、索引、触发器、过程、约束及规则等。大多数对象都要求有标识符,但有些对象标识符是不可选的,例如,约束标识符是系统自动生成的,不需要用户提供。
对象标识符是在定义对象时创建的,标识符随后用于引用该对象。
【例1】创建一个标识符为student的表,该表中有两个列标识符,分别是Number和Address:
CREATE TABLE student
(Number INT PRIMARY KEY, Address nvarchar(80))
此表还有一个未命名的约束。PRIMARY KEY约束没有标识符。
标识符的排序规则取决于定义标识符时所在的级别。实例级对象的标识符指定的是实例的默认排序规则,例如登录名、数据库名。数据库对象的标识符分配数据库的默认排序规则,例如表、视图和列名。按照标识符的使用方式,可把标识符分为两类,即常规标识符和分隔标识符。这两种标识符包含的字符数必须在1~128之间。对于本地临时表,标识符最多可以有116个字符。
(1) 常规标识符
常规标识符的格式规则取决于数据库的兼容级别。可以使用ALTER DATABASE进行设置。当兼容级别为100时,适用下列规则。
① 第一个字符必须是下列字符之一:Unicode标准3.2所定义的字母,这些定义的字母包括拉丁字符a~z和A~Z,以及来自其他语言的字母字符;下划线(_)、符号@或数字符号#。
在Transact-SQL中,某些位于标识符开头位置的符号具有特殊意义。
以@符号开头的常规标识符始终表示局部变量或参数,并且不能用作任何其他类型的对象的名称。某些Transact-SQL函数的名称以两个符号(@@)开头。为了避免与这些函数混淆,不应使用以@@开头的名称命名。
以一个数字符号开头的标识符表示临时表或过程。以两个数字符号(##)开头的标识符表示全局临时对象。虽然数字符号或两个数字符号字符可用作其他类型对象名的开头,但这里不建议使用。
② 后续字符可以包括:Unicode标准3.2中所定义的字母;基本拉丁字符或其他国家/地区字符中的十进制数字;@符号、美元符号($)、数字符号(#)或下划线(_)。
③ 标识符一定不能是Transact-SQL保留字。SQL Server可以保留大写形式和小写形式的保留字。
④ 不允许嵌入空格或其他特殊字符。
⑤ 不允许使用增补字符。
例如,studentInformation、@number_20、Money_88$等是合法的常规标识符,而the student、My name_@、age 30等不是合法的标识符。
在Transact-SQL语句中,如果符合标识符的格式规则,在使用常规标识符时,不用将其分隔开。例2中使用的标识符均是合法的,不用进行分隔。
【例2】查询学号为15的学生信息:
SELECT *
FROM student
WHERE Number = 15
知识链接: 变量、函数和存储过程的名称必须符合Transact-SQL标识符的规则。在 Transact-SQL语句中使用标识符时,不符合上述规则的标识符必须用双引号或括号分隔,即我们下面要介绍的分隔标识符。
(2) 分隔标识符
分隔标识符是包含在双引号(“”)或者方括号([])内的标识符。使用双引号(“”)分隔的标识符称为引用标识符,使用方括号([])分隔的标识符称为括在括号内的标识符。默认情况下使用方括号([])分隔标识符。只有QUOTED_IDENTIFIER选项设置为ON时,才使用双引号(“”)分隔标识符。
在Transact-SQL语句中,符合标识符格式规则的标识符可以分隔,也可以不分隔。下面是对例2中的合法标识符进行分隔:
SELECT *
FROM [student]
WHERE [number] = 15
在Transact-SQL语句中,如果对象名称包含了Microsoft SQL Server中的保留字或使用了未列入限定字符的字符,均不符合标识符的格式规则,必须进行分隔。例3中包含不合法的标识符My student和保留字order,必须进行分隔。
【例3】查询序号为15的学生信息:
SELECT *
FROM [My student]
WHERE [order] = 15
注意: 美元符号($)的关键字通常用得较少,不为人们所熟知,应尽量避免使用,以提高程序的可读性。
3. 常量和变量
(1) 常量
常量是表示特定数据值的符号,也称为字面量,在整个程序运行过程中保持不变。常量的格式取决于它所表示的值的数据类型。Transact-SQL中常用的常量主要有字符串常量、整型常量、实型常量、Money常量、uniqueidentifier常量和日期时间常量等。
① 字符串常量
分为ASCII字符串常量和Unicode字符串常量两种。
ASCII字符串常量是用单引号括起来的由ASCII字符构成的符号串,每个ASCII字符用一个字节来存储。
Unicode字符串常量数据中的每个字符用两个字节存储,与ASCII字符串常量相似。N前缀必须为大写字母,例如N‘What is you name?’。
ASCII和Unicode常量被分配了当前数据库的默认排序规则,除非使用COLLATE子句分配特定的排序规则,例如:
'abc' COLLATE French_CI_AI或者N'lustig' COLLATE German_Phonebook_CS_AS
注意: 如果单引号中的字符串包含引号,可以使用两个单引号表示嵌入的单引号。
② 整型常量
按照整型常量表示方式的不同,可将整型常量分为二进制整型常量、十进制整型常量和十六进制整型常量。
* 二进制整型常量的表示:即数字0或1,并且不使用引号。如果使用一个大于1的数字,它将被转换为1。
* 十进制整型常量的标识:即不带小数点的十进制数,例如2012、9、+20120215、-20120215。
* 十六进制整型常量的表示:前辍0x,后跟十六进制数字串。例如0xAEBF、0x12Ff、0x48AEFD010E、0x。
③ 实型常量
实型常量按表示方式的不同,可分为定点表示和浮点表示。
* 定点表示:例如1894.1204、2.0、+145345234.2234、-2147483648.10。
* 浮点表示:例如101.5E5、0.5E-2、+123E-3、-12E5。
④ 日期时间常量
日期时间常量用单引号将表示日期时间的字符串括起来构成。SQL Server可以识别的日期和时间格式有字母日期格式、数字日期格式和未分隔的字符串格式。例如‘April 15, 2012’、‘4/15/1998’、‘20001207’、‘04:24:PM’、‘April 15, 2012 14:30:24’。
⑤ money常量
money常量是以$作为前缀的整型或实型常量数据。例如$12、$542023、-$45.56、+$423456.99。下面是将money常量应用到Transact-SQL中的例子:
SELECT Price +$6.50
FROM CommodityTable
⑥ uniqueidentifier常量
uniqueidentifier常量是表示全局唯一标识符(GUID)值的字符串。uniqueidentifier常量可以使用字符或者十六进制字符串格式来指定。例如‘642D-000F96D458AB19FF011-B04FC964FF’、0x2012ff6fd00c04fc964ff。
注意: 引用数值常量时不用单引号,引用日期、字符串常量时需要加单引号。
(2) 变量
变量是在程序运行过程中会发生改变的量。根据作用范围,可以将变量分为局部变量和全局变量两种。
① 局部变量
局部变量是指在批处理或脚本中用来保存数据值的对象,是用户自己定义的变量。局部变量一次只能保存一个值,它的作用范围仅在程序内部。
一般局部变量只在一个批处理或存储过程中使用,用来存储从表中查询到的数据,或当作程序执行过程中的暂存变量使用。通常,局部变量可以作为计数器,计算循环执行的次数或控制循环执行的次数;此外,利用局部变量还可以保存数据值,以供流程控制语句测试,以及保存由存储过程返回的数据值等。
局部变量使用Declare语句来声明,其语法格式如下:
Declare {变量名 数据类型}[...n]
例如:
DECLARE @name varchar(8)
DECLARE @seat int
声明完局部变量后,就可以对其进行赋值了,赋值格式如下:
SET @变量名 = 值 (普通赋值)
SELECT @变量名 = 值[,...](查询赋值)
使用SELECT语句赋值时,若返回多个值,结果为返回的最后一个值。若省略“=”及其后的表达式,可以将局部变量的值显示出来。
例如下面两个为变量赋值的语句:
SET @name = '张三'
SELECT @name = sname FROM student
WHERE snum = '001'
注意: 局部变量必须先声明后使用,初值为NULL。
【例4】编写程序,计算两个整数之和:
DECLARE @i int, @j int, @sum int
SET @i = 50
SET @j = 60
SELECT @sum = @i + @j
PRINT @sum
GO
语法说明如下:DECLARE声明局部变量。@i、@j、@sum为变量名,总是以@开始。int为变量的数据类型。SELECT和SET用来对局部变量进行赋值。SET一次只能给一个局部变量赋值,SELECT可以同时给多个局部变量赋值。
② 全局变量
全局变量也称配置函数,是SQL Server系统提供并赋值的变量,用于存储系统的特定信息,作用范围并不局限于某一程序,而是任何程序均可随时调用。
全局变量是在服务器级定义的,以@@开头。例如@@version。
全局变量对用户来说,是只读的,用户只能使用预先定义的全局变量,不能建立全局变量,也不能修改其值,但可在程序中用全局变量来测试系统的设定值或Transact-SQL命令执行后的状态值。
在Transact-SQL语句中,常用的全局变量如表2-1所示。
……