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中都有应用。作用也比较明显,在查询优化方面也是一个不错的选择。此外还有很多全局变量可以供我们在平时的开发中去使用,有兴趣的可以去探究一下其他全局变量的用法。

posted @ 2021-07-24 18:22  赵Gary  阅读(85)  评论(0)    收藏  举报