3.3 T-SQL中的常量、变量、批处理、注释和输出语句
3.3.1 常量
在程序的生命周期内,表示特定值的符号称为“常量”。常量是指使用字符或数字表示出来的字符串、数值或日期等数据,表示一个特定数据值的符号。
在SQL Server中,标识符的命名规则如下:
· 名称不能超过30个字符;
· 起始字符必须是字母[a…z]或[A…Z]、下画线“_”、“@”或“#”;
· 起始字符后面可以是字母、数字、“#”、“$”或下画线“_”;
· 名称中不能包括空格;
· 不能使用SQL Server的关键字;
· 在中文版的SQL Server中可以使用中文作为标识符。
标识符不仅可以代表变量的名称,也可以代表表名、视图名、函数名、触发器名和存储过程名等。为变量命名不仅要遵守以上规则,而且变量必须以“@”开头。
(1)字符串常量。例如,‘abcde’,‘1234’,‘数据类型’等。
(2)Unicode字符串。Unicode字符串的格式与普通字符串的格式相似,但需在字符串前面加一个“N”进行区别,N必须大写,例如,N‘abcde’,N‘1234’,N‘数据类型’等。
(3)二进制常量。二进制常量指使用0x作为前缀的十六进制数字字符串,例如,0x12345、0xABC等。单独的0x视为一个空二进制常量。
(4)datetime常量。例如,‘2007-7-16’、‘may 1,2007’、‘2007年7月16日’、‘07/16/2007 15:00:00’等。
(5)整型常量。整型常量是指不带小数点的整数,例如,1234、+12345、-120。
(6)decimal常量。decimal常量是指带小数点的数,例如,1.234、+33.33、-100.33。
(7)float和real常量。float和real常量是指使用科学计数表示的数,例如,1.23E3、+0.123e-5、+5.73E14。
(8)货币常量。货币常量是指以“$”开头的数字,例如,$12、$43222.123。
示例3.1
显示几种常见类型的常量,使用select语句得到的结果如图3.1所示。
select ‘abcdABCD’字符串常量, 123.45 精确值常量, 12.345E+6 近似值常量, convert(datetime, ‘2007-7-16’) 日期时间常量
注意点:convert(datetime, ‘2007-7-16’)是把字符串‘2007-7-16’转换成日期时间。
图3.1 常见类型常量的正确显示
3.3.2 局部变量
表示输入数据、输出结果和中间结果的符号称为“变量”。在程序运行过程中变量的取值可以随时变化,可以用赋值语句为其赋值,也可以在其他T-SQL语句中引用变量的值。
T-SQL语言中定义了两种类型的变量,即局部变量和全局变量。
局部变量的作用范围只在T-SQL批处理语句、触发器、存储过程中起作用。局部变量在赋值或引用之前,首先要声明局部变量的数据类型,目的同其他高级语言一样是按类型分配存储空间。
1.局部变量声明的语法
declare @<局部变量名1> <类型及宽度>,@<局部变量名2> <类型及宽度>,…
注意点:
(1)声明的变量名必须符合SQL标识符规定,变量之间用“,”号隔开,且“,”号必须是半角英文字符。
(2)@与<局部变量名>之间没有空格。
2.局部变量的赋值
(1)使用set语句赋值。
set @局部变量名=表达式
其中,表达式与局部变量的数据类型要相匹配。
示例3.2
声明两个变量——学号和课程号,并为它们赋值,并用select语句显示结果。
declare @stuID varchar(8),@courseID varchar(5)
set @stuID=‘31031002’ set @courseID=‘30002’ select @stuID 学号,@courseID 课程号
执行结果如图3.2所示。
图3.2 set赋值语句的使用
注意点:
使用set语句为变量赋值时,一次仅能为一个变量赋值。
示例3.3
下列语句声明了一个datetime和一个smalldatetime类型变量@var1、@var2,然后用set语句为它们赋值,并用select语句显示两个变量的内容。
declare @var1 datetime,@var2 smalldatetime set @var1=‘2007/7/16 4:20:25.100 PM’ set @var2=‘2007/7/16 4:20:25 AM’ select ‘@var1’=@var1, ‘@var2’=@var2
执行结果如图3.3所示。
图3.3 set赋值语句对日期变量的操作
注意点:
日期格式‘2007-7-16’、‘2007/7/16’、‘7/16/2007’、‘7-16-2007’等是正确的,但‘2007-16-7’、‘2007/16/7’、‘16/7/2007’、‘16-7-2007’、‘2007年7月16日’等是无法显示结果的,请读者自己上机进行验证。
(2)使用select语句赋值。
select @局部变量名1=〈表达式1〉,@局部变量名2=〈表达式2〉,… [from <数据源>] [where <查询条件>] [order by 列名1 asc/desc,列名2 asc/desc,…]
注意点:
· []为可选顶,<数据源>为表名、表的连接、子查询结果等。
· <表达式>为表的列名、列的计算结果、子查询结果,赋值表达式之间用“,”隔开。
· 使用select语句还可以显示变量的内容。
示例3.4
声明两个变量——学号和课程号,并为它们赋值,然后将它们应用到select语句中,用来查询指定学生和课程的成绩。
use StuInfo declare @stuID varchar(12),@courseID varchar(5),@score int select @stuID=‘31022002’ select @courseID=‘30002’ select @score=Score from tblScore where StuID=@stuID and CourseID=@courseID select @stuID 学号,@courseID 课程号,@score 成绩
执行结果如图3.4所示。
图3.4 select赋值语句的使用
注意点:
· 本示例的程序是在学生成绩表中输入学生成绩信息(输入学生成绩信息时应取消或删除外键约束)的前提下完成的。
· 语句select @score=Score不能书写成select @stuID, @courseID, @score=Score,否则会出现如图3.5所示的错误信息。
利用局部变量还可以保存程序执行过程中的中间结果,保存由存储过程返回的数据值等,这些内容将在以后的章节中进行讲解。
图3.5 select赋值语句的错误使用
3.3.3 全局变量
在整个SQL Server实例范围内、特定会话期间(从数据库实例连接到断开的期间)起作用的变量称为“全局变量”,全局变量的名称前缀为“@@”。
全局变量在整个SQL Server系统内使用,存储的通常是一些SQL Server的配置设定值和统计数据。在使用全局变量时应该注意以下几点:
(1)全局变量是在服务器级定义的。
(2)用户只能使用预先定义的全局变量。
(3)引用全局变量时,必须以标记符“@@”开头。
(4)全局变量对用户来说是只读的。
(5)局部变量的名称不能与全局变量的名称相同。
常用的全局变量如表3.11所示。
表3.11 常用的全局变量
关于其他全局变量的说明,读者可参考“SQL Server联机丛书”中以“@@”开头的项。
示例3.5
下面语句是根据给定学生的学号和课程号显示该课程的成绩并显示两个全局变量的内容。
use StuInfo declare @StuID varchar(12),@CourseID varchar(5),@Score int select @StuID=‘31022002’, @CourseID=‘30002’ update tblScore set Score=120 from tblScore where StuID=@StuID and CourseID=@CourseID print ‘@@error=’+convert(char,@@error)+ ‘@@rowcount=’+convert(char,@@rowcount)
执行结果如图3.6所示。
图3.6 全局变量的使用
3.3.4 批处理、注释和输出语句
1.批处理
批处理是从客户机传递给服务器的一组完整的数据和SQL指令集合。SQL Server将批处理作为一个整体来进行分析、编译和执行,这样可以节省系统开销。但如果一个批处理中存在一个语法错误,那么所有的语句都将无法通过编译。
在书写SQL语句时,可以用go命令标识一个批处理的结束。go本身并不是T-SQL语句的组成部分,当编译器读到go时,就会把go前面的语句当做一个批处理,并打包成一个数据包发送给服务器。
批处理的限制如下:
(1)某些特殊的SQL命令不能和其他语句共同存在于一个批处理中,如create default、
rull、proc、trigger、view。
(2)不能在一个批处理中修改表的结构(如添加新列),然后在同一个批处理中引用刚修改的表结构。
(3)在一个批处理中如果包括多个存储过程,那么在执行第一个存储过程时exec不能省略。
示例3.6
use StuInfo go create view View_ComputerStuInfo As select * from tblStudent /*使用了查询语句*/
Where ClassID in (select ClassID from tblClass where DepartID=‘3’) go select * from View_ComputerStuInfo
以上命令共3个批处理,要用两个go分开,缺一不可。
2.注释
和其他高级语言一样,SQL Server 2008中也有程序注释语句,注释是程序中不被执行的语句,不参与程序的编译和执行,它主要用来说明代码的含义,增强程序的可读性。另一方面,在调试程序时利用注释还可以进行分段按步调试,这为编程带来了诸多方便。
SQL Server支持如下两种形式的注释语句:
(1)--(两个减号),用于注释单行。
(2)/*……*/,用于注释多行,不能跨批处理使用。
注释语句在前面的示例中已多次使用,在此不再举例。
3.输出语句
SQL Server的SQL命令中,可以使用print和select命令来显示表达式的结果。print命令可直接显示表达式结果,select命令可将表达式结果作为查询结果集的字段值来显示。
对这两个命令不再重复举例,读者从前面的示例中即可理解。