变量的种类:
在T-SQL中,变量按生存范围可以分为全局变量(Global Variable)和局部变量(Local Variable)
1、全局变量是由系统定义的,在整个SQL Server实例内都能访问到的变量,全部变量以@@开头,用户只能访问,不能赋值。
2、局部变量由用户定义,生命周期只在一个批处理内有效。局部变量以@作为第一个字符,由用户自己定义和复制。
示例:
DECLARE @i int --声明一个int类型局部变量 SET @i = 10 --通过SET对局部变量进行赋值 DECLARE @Name nvarchar(20) --声明一个nvarchar(20)类型变量 SET @Name = '张飞' PRINT @@VERSION --全部变量,只能读取,不能赋值 SET @@VERSION = '123' --此行代码报错
局部变量的用途:
- 在循环中记录循环次数
- 储存存储过程或者函数的返回值
局部变量的声明:
局部变量的声明必须以"DECLARE"作为关键字,变量的命名必须以"@"作为变量名的第一个字符.必须为所声明的变量提供一个数据类型和数据长度。
如:
DECLARE @Name nvarchar(20)
注意:局部变量的数据类型不能为Text,ntext,和Image类型,当对于字符型变量只提供数据类型没有提供数据长度时,数据长度默认为1.
设置变量中的值:
1、使用SET设置变量
有两种设置变量值方法。可以使用SELECE语句或者SET语句。从功能上看,它们的作用几乎是相同的,不同的是SELECT语句允许元数据值来自SELECT语句中的某一列。
DECLARE @i int,@j int set @i = 10; set @j = 20; select @i + @j
用查询到的值设置变量:
DECLARE @i int SET @i = (select MAX(Age) from Person) --当使用SET时如果返回结果有多行也会报错。同时如果返回多条记录也报错 SELECT @i
2、使用SELECT设置变量:
当变量中存储的信息来源于查询时,经常使用SELECT给变量赋值,语法比较简便。
DECLARE @i int SELECT @i = 100 SELECT @i
查询的信息为变量赋值:
DECLARE @i int SELECT @i = Age from Person_1 order by Id desc --当返回多个值时用最后一个赋值 PRINT @i
SELECT同时设置多个值:
DECLARE @Name varchar(20) DECLARE @i int SELECT @i = 10, @Name = '张飞'
3、当表达式未返回值时
- 使用SET对局部变量赋值时,如果赋值表达式未返回值,则局部变量变为NULL,而SELECT对表达式赋值时,如果表达式未返回值,则局部变量保持原值。
- 一切只声明没有赋值的局部变量的初始值都为”NULL”。
例如:
DECLARE @Name nvarchar(50) SET @Name = '黄飞鸿' select @Name = Name from Person_1 where Id = 100 --100不存在记录,此处如果改为一个Id存在的,且Name列不为null的值,则@Name变量的值就变了 PRINT @Name --依然打印的是黄飞鸿
可见,当SELECT表达式赋值时,如果为返回值,则保持原值。
局部表变量:
局部表变量是一个特殊的局部变量.和临时表不同,局部表变量具有一切局部变量的特点.在查询中,因为局部表变量是存在内存中,而不是硬盘中,所以速度会远远快于临时表或是实际表,局部表变量最多的使用时在查询中充当多个表做连接时的中间表。
DECLARE @TempTable TABLE --声明一个局部表变量 ( Id int, Name nvarchar(50) ) INSERT INTO @TempTable --用查询到的作为数据插入到局部表变量 SELECT Id,Name FROM Person_1 SELECT * FROM @TempTable --和普通表一样用,可以各种join,子查询等等。