首页 > 数据库 >SQL 循环语句几种写法

SQL 循环语句几种写法

时间:2023-04-07 19:11:17浏览次数:40  
标签:语句 temp -- 游标 int SQL 写法 declare select

摘自:https://www.cnblogs.com/guorongtao/p/11939751.html

1、正常循环语句

复制代码
declare @orderNum varchar(255)
create table #ttableName(id int identity(1,1),Orders varchar(255))
declare @n int,@rows int
insert #ttableName(orders) select orderNum from pe_Orders where orderId<50
--select @rows=count(1) from pe_Orders
select @rows =@@rowcount
set @n=1
while @n<=@rows
begin
  select @orderNum=OrderNum from PE_Orders where OrderNum=(select Orders from #ttableName where id=@n)
  print (@OrderNum)
  select @n=@n+1
end
drop table #ttableName
复制代码

2、不带事务的游标循环

复制代码
declare @orderN varchar(50)  --临时变量,用来保存游标值
declare y_curr cursor for   --申明游标 为orderNum
select orderNum from pe_Orders where orderId<50
open y_curr   --打开游标
fetch next from Y_curr into @orderN   ----开始循环游标变量
while(@@fetch_status=0)  ---返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
begin
  print (@orderN)
  update pe_Orders set Functionary+@orderN where orderNum=@orderN   --操作数据库
  fetch next from y_curr into @orderN   --开始循环游标变量
end
close y_curr  --关闭游标
deallocate y_curr   --释放游标
复制代码

3、带事务的游标循环

复制代码
select orderNum,userName,MoneyTotal into #t from pe_Orders po
DECLARE @n int,@error int
--set @n=1
set @error=0
BEGIN TRAN   --申明 开始事务
declare @orderN varchar(50),@userN varchar(50)   --临时变量,用来保存游标值
declare y_curr cursor for    --申明游标 为orderNum,userName
select orderNum,userName from PE_Orders where Orderid<50
open y_curr
fetch next from y_curr into @orderN,@userN
while @@fetch_status = 0
BEGIN
  select isnull(sum(MoneyTotal),0),orderNum from #t where username=@userN
  -- set @n=@n+1
  set @error=@error+@@error  --记录每次运行sql后 是否正确 0正确
  fetch next from y_curr into @orderN,@userN
END
IF @error=0
BEGIN
  commit tran   ---事务提交
END
ELSE
BEGIN
  ROLLBACK TRAN   ---事务回滚
END
close y_curr
deallocate y_curr
DROP TABLE #t
复制代码

4、if语句使用示例

复制代码
declare @a int
set @a=12
if @a>100
begin
  print @a
end
else
begin
  print 'no'
end
复制代码

5、while语句使用示例

复制代码
declare @i int
set @i=1
while @i<30
begin
  insert into test (userid) values(@i)
set @i=@i+1
end
-- 设置重复执行 SQL 语句或语句块的条件。只要指定的条件为真,就重复执行语句。可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。 本条为以前从网上查找获取!
复制代码

6、临时表和try

复制代码
-- 增加临时表
select * into #csj_temp from csj
-- 删除临时表 用到try
begin try -- 检测代码开始
  drop table #csj_temp
end try
begin catch -- 错误开始
end catch
复制代码

7、游标循环读记录

复制代码
declare @temp_temp int
--declare @Cur_Name
--@Cur_Name="aaa"
--------------------------------- 创建游标 --Local(本地游标)
DECLARE aaa CURSOR for select House_Id from House_House where Deleted=0 or deleted is null
----------------------------------- 打开游标
Open aaa
----------------------------------- 遍历和获取游标
fetch next from aaa into @temp_temp
--print @temp_temp
while @@fetch_status=0
begin
  --做你要做的事
  select * from House_monthEnd where House_Id=@temp_temp
  fetch next from aaa into @temp_temp -- 取值赋给变量
-- 
end
----------------------------------- 关闭游标
Close aaa
----------------------------------- 删除游标
Deallocate aaa

标签:语句,temp,--,游标,int,SQL,写法,declare,select
From: https://www.cnblogs.com/golandhome/p/17297132.html

相关文章

  • SQL去重的3种实用方法总结
    1.distinct去重注意的点:distinct只能一列去重,当distinct后跟大于1个参数时,他们之间的关系是&&(逻辑与)关系,只有全部条件相同才会去重弊端:当查询的字段比较多时,distinct会作用多个字段,导致去重条件增多selectdistinctUserResultfromTable12.groupby去重去重原理:将重......
  • 基于SqlSugar的开发框架循序渐进介绍(25)-- 基于SignalR实现多端的消息通讯
    基于ASP.NETCoreSignalR可以实现客户端和服务器之间进行即时通信。本篇随笔介绍一些SignalR的基础知识,以及结合对SqlSugar的开发框架的支持,实现SignalR的多端处理整合,从而实现Winform客户端,基于Vue3+ElementPlus的BS端整合,后面也可以实现对移动端的SignalR的整合通讯。适合Si......
  • mysqldump 命令导出数据,解决中文乱码问题
      https://www.cnblogs.com/LoveBB/p/16941639.html mysqldump-uroot-ppassword--add-drop-table--default-character-set=utf8--hex-blobdbname--result-file=F:\backup.sql......
  • mysql 求分组中位数、环比、同比、中位数的环比、同比
    说明中位数、环比、同比概念请自行百度,本文求 字段A中位数、根据字段B分组后字段A中位数、字段A环比、字段A同比、字段A中位数的环比、字段A中位数的同比。一、表结构如下图 查询条件为 capital_namein('金融机构1','金融机构2'),以下查询的中位数、环比等都基于此条件;......
  • oracle, mysql, clickhouse创建表的DDL语句参考
    这里展示的oracle,mysql,clickhouse下面如何创建一个表的DDL语句。请注意这里的数据类型,在不同的表,表示形式不一样。   Oracle的DDL语句 --UPCENTER.PUB_PLATE_INFOdefinitionCREATETABLE"UPCENTER"."PUB_PLATE_INFO"("ISVALID"NUMBER(1,0)NO......
  • MySQL新身份验证插件caching_sha2_password
     用sequelpro工具登录,连接失败~!“Authenticationplugin'caching_sha2_password'cannotbeloaded”失败原因:mysql8之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password解决办法:把mysql用户登录密码加密规则还原成mysql_nati......
  • 查询mysql的数据库容量
    查看所有数据库容量大小SELECT table_schemaAS'数据库', sum(table_rows)AS'记录数', sum( TRUNCATE(data_length/1024/1024/1024,2))AS'数据容量(G)', sum( TRUNCATE(index_length/1024/1024/1024,2))AS'索引容量(G)'FRO......
  • 基于keepalived双vip的MySQL高可用集群
    一、机器准备及IP地址规划ansible2.9.27ip:192.168.1.124prometheus192.168.1.103MySQLRouter8.0.32mysql集群master192.168.1.150slave192.168.1.151slave192.168.1.152延迟备份backup192.168.1.153keepalived集群192.168.1.148192.168.1.149项目名称:基......
  • 记一次达梦数据库虚拟表SQL优化记录分享
    前言:遇到问题不要怕,先看一看。语句看懂了,创建个索引,优化个处理方式,30S变0.3秒,速度提升90倍。 背景:达梦数据库、督办定制功能的一个查询列表慢(虚拟表)。语句:selectidasdbrw,hzrwnr,createdate,BB,whbh01,whbh02,whbh03,zkh,ykh,sfyrq,qtkckry,(selectcount(wfrb.requestid)from......
  • sql 逐行累加
    sql逐行累加,包括当前行selectname,sl,sum(sl)over(partitionbynameorderbynamerowsbetweenunboundedprecedingandcurrentrow)asaccumulatefromtest;    可以实现在窗口中进行逐行累加selectuid,month,amount,sum(amount)over(partitionbyuid......