欢迎光临
我们一直在努力

T-SQL 变量赋值 + 全局变量 + 流程控制 + CASE + 游标 + While循环

一、T-SQL 局部变量(@自定义变量)

1. 变量定义

— 一次性定义多个局部变量
declare @age int,@stuId int;

2. SET 与 SELECT 赋值核心区别(必考)

基础赋值用法

— SET 单次单变量赋值
–set @age = 10

— SELECT 支持多变量同时赋值(查询结果赋值)
–select @age=Age,@stuId=StudentId from Students where StudentId = 1001

— 打印变量值
–print @age
–print @stuId

3. 多行数据赋值规则(高频考点)

— 1. SELECT 匹配多条数据:自动截取【最后一条数据】赋值
–select @stuId=StudentId from Students where ClassId =2

— 2. SET 子查询返回多条数据:直接报错(不支持)
–set @stuId= (select StudentId from Students where ClassId =3)

4. 无数据匹配赋值规则(易错点)

set @stuId=100

— SET 无匹配数据:变量变为 NULL
–set @stuId= (select StudentId from Students where ClassId =100)

— SELECT 无匹配数据:【保留变量原有值,不覆盖】
select @stuId=StudentId from Students where ClassId =100
print @stuId — 输出结果:100

5. 赋值语法终极总结

  • SET:仅支持单个变量赋值、不支持多行子查询、无数据则变量置空

  • SELECT:支持多变量同时赋值、多行数据取最后一条、无数据保留原值


二、SQL 全局变量(@@系统内置变量)

局部变量:单@开头(自定义)   全局变量:双@@开头(系统自带)

— @@ERROR:获取上一条SQL语句的错误编码,无错误返回0
print @@error

— @@IDENTITY:获取上一条【自增列插入】的主键ID
insert into Students values('1',29,'1','1','1','2020-10-1')
print @@identity

— @@ROWCOUNT:获取上一条SQL语句【受影响的行数】
select * from Students
print @@rowcount

— @@Max_connections:当前数据库最大允许连接数
print @@Max_connections

— @@servicename:获取当前数据库服务器实例名称
print '当前服务器实例' + @@servicename

— @@FETCH_STATUS:游标抓取数据状态(0=成功,-1=结束,-2=数据不存在)


三、T-SQL 流程控制 IF…ELSE

用于条件逻辑判断,多语句必须包裹 BEGIN…END 代码块

— 定义变量接收班级平均分
declare @c# int;
— 查询2班平均分
select @c# = AVG(Score) from ScoreList
inner join Students on ScoreList.StudentId=Students.StudentId
where ClassId = 2

— 展示平均分
select @c# as 平均分

— 多分支条件判断
if @c# is Null
begin
print '该班无成绩'
end
else if(@c#>80)
print '该班成绩良好'
else
begin print '该班成绩稍差'
end


四、CASE 多条件分支查询(数据库专属评级)

作用:查询语句中动态生成新字段,替代多层IF判断,从上至下匹配,匹配即终止,无匹配走ELSE

select
Students.StudentId,
Name,
case
when (Score+DB)/2 >= 90 then 'A'
when (Score+DB)/2 between 80 and 90 then 'B'
when (Score+DB)/2 between 70 and 80 then 'C'
when (Score+DB)/2 between 60 and 70 then 'D'
else '不及格' — 默认兜底(相当于switch的default)
end as '成绩评级'
from ScoreList
inner join Students on ScoreList.StudentId=Students.StudentId


五、游标 Cursor 逐行遍历数据

普通变量仅能读取最后一行数据,游标可遍历结果集所有行,适合逐行处理、打印数据

— 定义接收数据的变量
declare @a int; — 成绩
declare @b nvarchar(10);– 姓名
declare @c int; — 学号

— 1.定义游标:绑定需要遍历的结果集
declare Curesor_my cursor for
select Score , Name ,Students.StudentId
from Students
inner join ScoreList on ScoreList.StudentId=Students.StudentId

— 2.打开游标
open Curesor_my

— 3.抓取第一行数据,存入变量
fetch next From Curesor_my into @a,@b,@c

— 4.循环遍历所有数据(抓取成功则循环)
while @@FETCH_STATUS = 0
begin — 分数大于50打印学生信息
if(@a>50)
print '学号:'+ convert(varchar(10),@c)+ '姓名:'+@b+'成绩:'+convert(varchar(10),@a)

— 抓取下一行数据(必须放在循环末尾,否则死循环)
fetch next From Curesor_my into @a,@b,@c
end

— 5.关闭游标、释放资源(必须操作)
close Curesor_my
deallocate Curesor_my

游标固定六步:定义→打开→抓取首行→循环遍历→关闭→释放


六、WHILE 循环语句

案例1:循环批量插入测试数据

— 创建测试表(自增主键+默认值)
create table S2
(
id int not null primary key identity(1,1),
name nvarchar(10) not null default(' ')
)

— 循环插入10条数据
declare @count int
set @count = 0
while(@count<10)
begin
set @count = @count +1
insert into S2(name) values('亚马尔'+ CONVERT(nvarchar(10),@count)+'号' )
end

— 查询所有数据
select * from S2

案例2:死循环批量修改数据(低分统一提分)

逻辑:逐行抓取低分数据,修改完毕,无低分则退出循环

declare @stuId int,@score int

— 死循环,内部通过break退出
while(1=1)
begin
— 只抓取第一条低于70分的数据
select top 1 @stuId = StudentId,@score=Score from ScoreList where Score<70

— 判断是否存在低分数据
if((select count(*) from ScoreList where Score <70)>0)
ScoreList set Score = 70 where StudentId=@stuId — 低分改为70
lse
break — 无低分数据,跳出死循环
end

— 查看修改后结果
select * from ScoreList
e update


七、考前终极必背总结

  • 变量赋值:SET单值、无数据置空;SELECT多值、多行取末、无数据保原值

  • 全局变量:@@ERROR错误码、@@IDENTITY自增ID、@@ROWCOUNT影响行数、@@FETCH_STATUS游标状态

  • 流程控制:IF适合逻辑判断,CASE适合查询字段分级,WHILE适合批量增删改

  • 游标作用:解决多行数据逐行处理、逐行打印的问题,普通变量无法实现

  • 循环要点:WHILE循环必须设置退出条件,避免死循环

  • 赞(0)
    未经允许不得转载:171主机测评 » T-SQL 变量赋值 + 全局变量 + 流程控制 + CASE + 游标 + While循环
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址