变量可以保存查询之后的结果,可以在查询语句中使用变量,也可以将变量中的值插入到数据表中。在T-SQL中,变量的使用非常灵活方便,可以在任何T-SQL语句集合中声明使用,根据其生命周期,可以分为全局变量和局部变量。
全局变量是SQL Server系统提供的内部使用的变量,其作用范围并不仅仅局限于某一程序,而是任何程序均可以随时调用。全局变量通常存储一些SQL Server的配置设定值和统计数据。用户可以在程序中用全局变量来测试系统的设定值或者是T-SQL命令执行后的状态值。在使用全局变量时应注意以下几点。
全局变量不是由用户的程序定义的,它们是在服务器级定义的。用户只能使用预先定义的全局变量,而不能修改全局变量。引用全局变量时,必须以标记符“@@”开头。
局部变量的名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结果。
提示
SQL Server 2017中包含的全局变量及其含义如表3-3所示。
表3-3 SQL Server 2017中包含的全局变量及其含义
下面通过一个实例来介绍全局变量的应用方法。
【例3.1】查看当前SQL Server的版本信息和服务器名称,输入语句如下。
SELECT @@VERSION AS 'SQL Server版本', @@SERVERNAME AS '服务器名称'
使用Windows身份验证登录到SQL Server服务器之后,新建立一个使用当前连接的查询,输入上面的语句,单击【执行】按钮,执行结果如图3-1所示。
图3-1 查看全局变量值
局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内部。在批处理和脚本中变量可以有如下用途:作为计数器计算循环执行的次数或控制循环执行的次数,保存数据值供控制流语句测试以及保存由存储过程代码返回的数据值或者函数返回值。局部变量被引用时要在其名称前加上标志“@”,而且必须先用DECLARE命令声明后才可以使用。定义局部变量的语法形式如下:
DECLARE {@local-variable data-type} [...n]
参数@local-variable用于指定局部变量的名称,变量名必须以符号“@”开头,且必须符合SQL Server的命名规则。
参数data-type用于设置局部变量的数据类型及其大小。data-type可以是任何由系统提供的或用户定义的数据类型。但是,局部变量不能是text、ntext或image数据类型。
【例3.2】使用DECLARE语句创建int数据类型的名为@mycounter的局部变量,输入语句如下。
DECLARE @MyCounter int;
若要声明多个局部变量,在定义的第一个局部变量后使用一个逗号,然后指定下一个局部变量名称和数据类型。
【例3.3】创建3个名为@Name、@Phone和@Address的局部变量,并将每个变量都初始化为NULL,输入语句如下。
DECLARE @Name varchar(30), @Phone varchar(20), @Address char(2);
使用DECLARE命令声明并创建局部变量之后,会将其初始值设为NULL,如果想要设置局部变量的值,必须使用SELECT命令或者SET命令。其语法形式为:
SET {@local-variable=expression} SELECT {@local-variable=expression } [, ...n]
其中,@local-variable是给其赋值并声明的局部变量。expression是任何有效的SQL Server表达式。
【例3.4】使用SELECT语句为@MyCount变量赋值,最后输出@MyCount变量的值,输入语句如下。
DECLARE @MyCount INT SELECT @MyCount =100 SELECT @MyCount GO
执行结果如图3-2所示。
【例3.5】通过查询语句给变量赋值,输入语句如下。
DECLARE @rows int SET @rows=(SELECT COUNT(*) FROM Member) SELECT @rows GO
该语句查询出member表中总的记录数,并将其保存在rows局部变量中,如果表中没有数据记录,则返回结果为0,如图3-3所示。
图3-2 执行结果
图3-3 执行结果
【例3.6】在SELECT查询语句中,使用由SET赋值的局部变量,输入语句如下。
USE test GO DECLARE @memberType varchar(100) SET @memberType ='VIP' SELECT RTRIM(FirstName)+' '+RTRIM(LastName) AS Name, @memberType FROM member GO
批处理是同时从应用程序发送到SQL Server并得以执行的一组单条或多条T-SQL语句。这些语句为了达到一个整体的目标而同时执行。GO命令表示批处理的结束。如果T-SQL脚本中没有GO命令,那么它将被作为单个批处理来执行。
SQL Server将批处理中的语句作为一个整体,编译为一个执行计划,因此批处理中的语句是一起提交给服务器的,所以可以节省系统开销。
批处理中的语句如果在编译时出现错误,则不能产生执行计划,批处理中的任何一个语句都不会执行。批处理运行时出现错误将有如下影响:
批处理使用时有如下限制规则:
脚本是存储在文件中的一系列T-SQL语句。T-SQL脚本包含一个或多个批处理。T-SQL脚本主要有以下用途:
脚本可以看作一个单元,以文本文件的形式存储在系统中。在脚本中,可以使用系统函数和局部变量。例如,某个脚本中包含了如下代码:
该脚本中使用了6条语句,分别包含了USE语句、局部变量的定义、CREATE语句、INSERT语句、SELECT语句以及SET赋值语句,所有的这些语句在一起完成了person数据表的创建、插入数据并统计插入的记录总数的工作。
USE语句用来设置当前使用的数据库,可以看到,因为使用了USE语句,所以在执行INSERT和SELECT语句时,它们将在指定的数据库(test_db)中进行操作。