MSSQLSERVER数据库- 变量和批处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | declare @ name nvarchar(50),@age int print @ name ; print @age; print '----------------' ; set @ name = 'Jack' set @age=18 print @ name ; print @age; print '----------------' ; --结果显示: ---------------- Jack 18 ---------------- |
可以看到在没有赋值前,他输出的是NULL。使用set关键字对变量的赋值一次只能赋值一个,那么怎么对多个变量进行赋值?这时可以使用select关键字
1 2 3 4 5 | declare @ name nvarchar(50),@age int select @ name = 'Jack' ,@age=18 print @ name ; print @age; print '----------------' ; |
我们也可以在查询语句里面对这个变量进行赋值例如: select @name=sName from student where sid=1;
SQL Server有30多个全局系统变量,但有几个是常用到的,如下SQL语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | select @@VERSION --查看版本号 select @@IDENTITY; --返回最后插入的标识值--例如 USE MySchool create table ideTest ( id int identity(1,1) primary key , idename nvarchar(50), ) insert into ideTest(idename) values ( 'test1' ); insert into ideTest(idename) values ( 'test2' ); insert into ideTest(idename) values ( 'test3' ); insert into ideTest(idename) values ( 'test4' ); insert into ideTest(idename) values ( 'test5' ); insert into ideTest(idename) values ( 'test6' ) select @@IDENTITY; select @@error --返回错误编号,当上一条SQL语句的错误,我猜想当他的值大于时候,表示有错误。没有错误那么用表示 select @@LANGUAGE; --返回版本的语言 select @@SERVERNAME --返回服务器的名称 select @@ROWCOUNT --返回上一个语句所受影响的行数 --例如结果显示 delete ideTest where id<=3 select @@ROWCOUNT |
SQL语句里的脚本
脚本提供了变量、分支、循环等控制语句,可以用来实现一些复杂的任务,SQL语句里的流程控制语句包括:
- IF…ELSE
- GOTO
- WHILE
- WAITFOR
- TRY/CATCH
- CASE
1、我们先来看一下IF...ELSE语句,语法的格式如下:
IF<Boolean Expression><SQL statement>|
BEGIN<code series>
END[ELSE<SQL statement> |
BEGIN <code series>
END]
注意,使用代码行时,别忘了BEGIN与END,这里的BENGIN...END 相当于C语言里的{ } 另外,对于IF判断有一个陷阱,就是 if @var = NULL.这样子写法是不对的,因为NULL不等于任何东西,甚至也不等于NULL,应该写成: if @var IS NULL。我们来看一下具体的实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | USE MySchool CREATE TABLE Score ( id int identity(1,1) primary key , sname nvarchar(50), english int , math int , computer int ) insert into Score(sname, english, math, computer) values ( 'Jack' ,50,60,90); insert into Score(sname, english, math, computer) values ( 'Lou' ,70,80,100); insert into Score(sname, english, math, computer) values ( 'Andy' ,72,77,66); insert into Score(sname, english, math, computer) values ( 'Am' ,42,60,55); insert into Score(sname, english, math, computer) values ( 'Jobs' ,34,61,44); insert into Score(sname, english, math, computer) values ( 'Bill' ,54,32,76); insert into Score(sname, english, math, computer) values ( 'Afs' ,47,43,72); --查看英语成绩,当英语的平均成绩小于分时最低的三个人的成绩,当成绩大于分取高的三个人的成绩 declare @ avg float select @ avg = avg (english) from Score IF (@ avg <60) begin select top 3 * from Score order by english asc end ELSE begin select top 3 * from Score order by english desc end |
在SQL里是没有if...elseif...else的,那么该怎么实现类型于if...elseif...else的作用呢? 可以下面这个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | USE MySchool CREATE TABLE Score ( id int identity(1,1) primary key , sname nvarchar(50), english int , math int , computer int ) insert into Score(sname, english, math, computer) values ( 'Jack' ,60,60,90); insert into Score(sname, english, math, computer) values ( 'Lou' ,70,80,100); insert into Score(sname, english, math, computer) values ( 'Andy' ,72,77,66); insert into Score(sname, english, math, computer) values ( 'Am' ,82,60,55); insert into Score(sname, english, math, computer) values ( 'Jobs' ,64,61,44); insert into Score(sname, english, math, computer) values ( 'Bill' ,74,32,76); insert into Score(sname, english, math, computer) values ( 'Afs' ,67,43,72); declare @ avg float select @ avg =english from Score IF (@ avg <60) begin select top 3 * from Score order by english asc end else begin if(@ avg >60 and @ avg <70) begin select * from Score where english>60 order by english end else begin select top 3 * from Score order by english desc end end |
2、While语句
看一下下面这个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | declare @i int set @i=0 WHILE(@i<1000) begin set @i=@i+1 insert into Score(sname,english,math,computer) values ( 'test' + CONVERT (nvarchar(10),@i),@i%60,@i%60,@i%60) end 做一个练习,如果不及格的人数超过半数,则给每个人增加2分。 select @ count = count (*) from score select @failCount = count (*) from score where english < 60 while(@failCount > @ count /2) begin update score set english = english + 2 --为了跳出循环,加了一次后,再过行检测看人数是否还达到超过一半了 --set @failCount=-1 select @failCount= count (*) from score where english < 60 end |
3.CASE...END
case...end的语法格式如下:
CASE EXPRESSION
--查找STUDENT表,当年龄是19岁时显示青年,18岁显示小伙,其他年龄显示少年 SELECT SAGE, CASE SAGE WHEN '19' THEN '青年' WHEN '18' THEN '小伙' ELSE '少年' END FROM student --CASE..END的用处很多,我们可以使用他在客户等级,管理员级别的时候用到。例如当客户等级值为1表示普通用户,当客户等级用2表示VIP用户 --其中一个CASE可以产生一个列,多个CASE就会产生多个列 --举一个踪合列子,显示员工姓名/年龄/工资 --工资级别在1-5K 那么初级,工资级别在5-10K 那么中级,工级级别在10K以上 那么是高级。 select fname,fage, ( case fsalary WHEN fsalary>1000 and fsalary<=5000 then '初级' WHEN fsalary>5000 and fsalary<=10000 then '中级' WHEN fsalary>10000 then '高级' else '未分级' ) as '工资级别' from table --有两张表如下,如何用SQL语句实现第二张表来显示第一张表的内容 --第一张表: name subject result 张三 语文 80 张三 数学 90 张三 英语 100 李四 语文 77 李四 数学 88 李四 英语 99 --第二张表: name 语文 数学 英语 李四 77 88 99 张三 80 90 100 --SQL语句如下 select [ name ] sum ( case subject when '语文' then result end ) as '语文' sum ( case subject when '数学' then result end ) as '数学' sum ( case subject when '英语' then result end ) as '英语' group by [ name ] |
DELAY参数指定等待的时间量,不能指定天数,只能指定小时,分钟,秒。最大的延迟时间是24小时,
TIME参数指定等到一天中某个特定时刻。同样也只能用24小时制: WAITFOR TIME ‘01:00’; 等到今天01:00时刻执行下面的语句
最后推荐两篇参考博文:
http://www.cnblogs.com/30ErLi/archive/2010/09/17/1829274.html
这篇文章有些是从这里COPY过来的。还有一篇在批处理上用到的关于SQLCMD的文章:
http://blog.163.com/llsh2010@126/blog/static/1691895692011615113838734/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具