41 变量
41.1 变量的定义
SQL Server中的变量就是一个参数,可以对这个参数进行赋值。
41.2 变量的分类
变量分为局部变量和全局变量,局部变量用@来标识,全局变量用@@来标识(常用的全局变量一般都是已经定义好的)。
41.3 声明变量
变量在使用前必须先声明才能够使用。
声明局部变量语法:
DELCARE @变量名 数据类型;
例如,声明一个整数型变量@A
DECARE @A INT;
41.4 局部变量赋值
声明完了就可以给变量赋值,变量赋值有两种方式:SET或SELECT
语法:
SET 变量名=值; SELECT 变量名1=值1,变量名2=值2,...
从上面的语法可以看出这两种赋值方式的区别了,SET只能给一个变量赋值,SELECT可以给多个变量赋值。
例如,
SET @A=3 SELECT @A=字段名1,@B=字段名2 FROM TABLE
41.5 变量常用场景
变量一般用作参数去给字段赋值,即将变量的值反过来赋值给字段。
以Customers表作为示例表,
DECLARE @ID INT DECLARE @NAME VARCHAR(50) DECLARE @ADDRESS VARCHAR(50) --用SET方法给变量赋值,此方法一次只能给一个变量赋值 SET @ID=1 --将部门ID为1的客户姓名和地址,赋值给@NAME和@ADDRESS变量,此方法能一次给多个变量赋值 SELECT @NAME=姓名,@ADDRESS=地址 FROM Customers WHERE 客户ID=@ID --查询变量里的结果 SELECT @NAME,@ADDRESS
结果如下:
如果我们想查询其他ID的姓名和地址,只需要更改一下@ID值即可。
可能会有人问,直接把值写在客户ID后面不就可以了吗?为什么写这么长一段内容来要使用变量呢?
主要有两个原因:
1、使用简单
当一个查询里同一个字段需要修改的地方较多的时候,我们只需要修改这个字段对应的变量内容,那么所有的字段对应的值都会一起跟着修改。
例如,要查询老师们对应的不同学生的信息:
SELECT @ID INT SET @ID=1 SELECT * FROM TEST WHERE Teacher=@ID AND Student='张三' UNION ALL SELECT * FROM TEST WHERE Teacher=@ID AND Student='李四' UNION ALL SELECT * FROM TEST WHERE Teacher=@ID AND Student='王五' UNION ALL SELECT * FROM TEST WHERE Teacher=@ID AND Student='马六' UNION ALL SELECT * FROM TEST WHERE Teacher=@ID AND Student='赵七'
我们只需要修改@ID的值,下面的所有查询的ID都会变更。
2、可以提高查询效率
当我们使用查询的时候,数据库在执行这个查询语句的时候,如果不使用变量来修改值,实际上是两个查询。
例如:
SELECT * FROM TEST WHERE Student='张三' SELECT * FROM TEST WHERE Student='李四'
执行这两个查询,数据库会制定两个执行计划,而制定执行计划是需要消耗系统资源的。
而我么如果改成:
DECLARE @NAME VARCHAR(20) SET @NAME='张三' SELECT * FROM TEST WHERE Student=@Name
当我们修改@NAME的值为'李四'的时候,数据库还是会使用之前的执行计划。这样就节省了时间。
41.6 全局变量
全局变量使用@@来表示,一般是系统预定义的一些全局变量。常用的全局变量有:
@@ERROR 最后一个SQL错误的错误号
@@IDENTITY 最后一次插入的标识值
@@LANGUAGE 当前使用的语言的名称
@@MAX_CONNECTIONS 可以创建的同时连接的最大数目
@@ROWCOUNT 受上一个SQL语句影响的行数
@@SERVERNAME 本地服务器的名称
@@TRANSCOUNT 当前连接打开的事务数
@@VERSION SQLServer的版本信息
例如查询数据库的版本号:
PRINT @@VERSION
查询本地服务器的名称:
PRINT @@SERVERNAME
这些信息都存储在全局变量中,当发生改变时,全局变量的值也会跟着改变。
41.7 批注
变量的应用范围比较广,特别是在存储过程,游标还有动态SQL中都有应用。作用也比较明显,在查询优化方面也是一个不错的选择。此外还有很多全局变量可以供我们在平时的开发中去使用,有兴趣的可以去探究一下其他全局变量的用法。