首页 > 数据库 >sql server 循环 有那几种 sql实现循环

sql server 循环 有那几种 sql实现循环

时间:2023-11-16 18:45:26浏览次数:34  
标签:语句 -- 游标 server WHILE 循环 sql SELECT

SQL循环语句 

 

declare @i int 
set @i=1 
while @i<30 
begin 
insert into test (userid) values(@i) 
set @i=@i+1 
end
1.
2.
3.
4.
5.
6.
7.

 


--------------- 

while 条件 
begin 
执行操作 
set @i=@i+1 
end 

WHILE 
设置重复执行 SQL 语句或语句块的条件。只要指定的条件为真,就重复执行语句。可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。 

+语法 

 

 

WHILE Boolean_expression 
      { sql_statement | statement_block } 
      [ BREAK ] 
      { sql_statement | statement_block } 
      [ CONTINUE ]
1.
2.
3.
4.
5.


  

参数 
Boolean_expression 

返回 TRUE 或 FALSE 的表达式。如果布尔表达式中含有 SELECT 语句,必须用圆括号将 SELECT 语句括起来。 

{sql_statement | statement_block} 

Transact-SQL 语句或用语句块定义的语句分组。若要定义语句块,请使用控制流关键字 BEGIN 和 END。 

BREAK 

导致从最内层的 WHILE 循环中退出。将执行出现在 END 关键字后面的任何语句,END 关键字为循环结束标记。 

CONTINUE 

使 WHILE 循环重新开始执行,忽略 CONTINUE 关键字后的任何语句。 

注释 

如果嵌套了两个或多个 WHILE 循环,内层的 BREAK 将导致退出到下一个外层循环。首先运行内层循环结束之后的所有语句,然后下一个外层循环重新开始执行。 

+示例 

·······································
A. 在嵌套的 IF...ELSE 和 WHILE 中使用 BREAK 和 CONTINUE 

在下例中,如果平均价格少于 $30,WHILE 循环就将价格加倍,然后选择最高价。如果最高价少于或等于 $50,WHILE 循环重新启动并再次将价格加倍。该循环不断地将价格加倍直到最高价格超过 $50,然后退出 WHILE 循环并打印一条消息。 


USE pubs 
GO 
WHILE (SELECT AVG(price) FROM titles) < $30 
BEGIN 
     UPDATE titles 
        SET price = price * 2 
     SELECT MAX(price) FROM titles 
     IF (SELECT MAX(price) FROM titles) > $50 
        BREAK 
     ELSE 
        CONTINUE 
END 
PRINT 'Too much for the market to bear'
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
·······································
B. 在带有游标的过程中使用 WHILE 


以下的 WHILE 结构是名为 count_all_rows 过程中的一部分。下例中,该 WHILE 结构测试用于游标的函数 @@FETCH_STATUS 的返回值。因为 @@FETCH_STATUS 可能返回 –2、-1 或 0,所以,所有的情况都应进行测试。如果某一行在开始执行此存储过程以后从游标结果中删除,将跳过该行。成功提取 (0) 后将执行 BEGIN...END 循环内部的 SELECT 语句。 


USE pubs 
DECLARE tnames_cursor CURSOR 
FOR 
     SELECT TABLE_NAME 
     FROM INFORMATION_SCHEMA.TABLES 
OPEN tnames_cursor 
DECLARE @tablename sysname 
--SET @tablename = 'authors' 
FETCH NEXT FROM tnames_cursor INTO @tablename 
WHILE (@@FETCH_STATUS <> -1) 
BEGIN 
     IF (@@FETCH_STATUS <> -2) 
     BEGIN    
        SELECT @tablename = RTRIM(@tablename) 
        EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM ' 
              + @tablename ) 
        PRINT ' ' 
    END 
     FETCH NEXT FROM tnames_cursor INTO @tablename 
END 
CLOSE tnames_cursor 
DEALLOCATE tnames_cursor
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
·······································

C.延伸:

--定义变量:
declare @A1 INT,@A2 INT,@A3 INT
--定义游标
DECLARE my_Cur CURSOR FOR
SELECT A1,A2,A3 FROM A
--打开游标
OPEN  my_Cur 
--游标滚到下一行
FETCH NEXT FROM  my_Cur INTO @A1,@A2,@A3
--循环直到游标逐行读取完数据
WHILE @@FETCH_STATUS = 0
BEGIN
   /*
   --这里做你想做的事情
   --请问
   print  @A1+@A2+@A3
   --怎么实现,谢谢
   */
   --游标滚到下一行
   FETCH NEXT FROM  my_Cur INTO @A1,@A2,@A3
END
--关闭游标
CLOSE my_Cur 
--释放资源
DEALLOCATE my_Cur  

 
-----------------------------------
sql server 循环 有那几种 sql实现循环
https://blog.51cto.com/u_12219/7615065

标签:语句,--,游标,server,WHILE,循环,sql,SELECT
From: https://www.cnblogs.com/csjoz/p/17837004.html

相关文章

  • Ubuntu 22.04 LTS 安装最新稳定版本nginx、mysql5.7和php7.2
    Ubuntu22.04LTS安装最新稳定版本nginx、mysql5.7和php7.2全部apt-get安装,就是快,迅速。前提是需要在有网络环境的情况下哈!!操作系统版本:Ubuntu22.04LTS一、安装最新稳定版本的nginxapt-getupdate#查看默认安装的nginx版本(默认为1.18。有点老,我们安装最新稳定版本)apt......
  • Navicat设置MySQL某用户只可访问特定数据库或表
    概述项目中需要将数据库中某些表对其他系统开放,故需设置数据库的访问权限,使得某用户只能访问指定的表。MySQL提供了相关的SQL语句,但本次使用Navicat以可视化方式进行配置。方法1、新建用户2、设置权限(1)服务器权限全不勾选(2)权限权限用于设置该用户可操作哪些数据库或表,且可设置操作......
  • 源码安装MySQL
    本文使用的Linux发行版本为AnolisOS8.864位。最后更新时间2023年11月16日本文安装的MySQL版本为8.1.0,其他版本方法类似。准备工作更新系统。yum-yupdate安装依赖。yuminstall-ygccgcc-c++cmakecmake3ncursesncurses-develbisonopensslopenssl-develg......
  • MySQL5.7双主安装
    214、215 两台服务器1.下载MySQL安装包https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz2.上传至服务器并解压./bin/mysqld--initialize--user=mysql--basedir=/usr/local/mysql--datadir=/data/mysql/data3.配置文件/etc/my......
  • SQL_SERVER CAST 和 CONVERT
    语法CAST(expressionASdata_type[(length)])CONVERT(data_type[(length)],expression[,style]) 日期和时间样式转换日期和时间数据类型--转换日期和时间数据类型DECLARE@d1DATE,@t1TIME,@dt1DATETIME;SET@d1=GETDATE();SET@t1......
  • Java登陆第八天——SQL之DCL
    SQL语句SQL概括起来可以分为以下四组。(都是SQL,因为功能的不同,为了更好学习划分了类别)DDL——数据定义语言。用于定义数据的结构。指的是增,删,改数据库DML——数据操作语言。用于检索或修改数据。指的是增,删,改数据DQL——数据查询语言。用于查询各种形式的数据。指的是查询......
  • mysql单点多实例部署方式
    一、清理环境清理方式与mysql-部署相同二、部署1.创建mysql目录mkdir/root/softcd/root/soft2.下载安装包并解压wgethttps://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gztar-xfmysql-5.7.28-linux-glibc2.12-x86_64.tar.gz-C/o......
  • sql只根据某一字段去重,并保留其他字段
    SQL只根据某一个字段去重并保留其他字段,要实现此需求的关键是用到两个函数,分别为:groupby与max()groupby的目的是分组从而达到去重的效果,max()的目的是取分组重复的字段中取出随机的一条数据(比如说这里用的max()意思是取某一字段最大的,或者也可以用其他只能获取一条数据的函数......
  • window下mysql更换端口号
    我的情况是:本机原来安装了5版本,现在需要用8版本,因此机器同时存在了两个sql版本,一个占用了3306端口,一个占用了3307端口,但是后端默认配置的是3306端口,需要灵活更改版本和端口号。开始吧,安全的更换mysql的端口号,5和8版本都是一样的操作。停止mysql的服务在对应盘符找到Progra......
  • 吉特日化MES & SQL Server中的数据类型
    一、整数数据类型1、bitbit数据类型是整型,其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如Yes或No、True或False、On或Off.注意:很省空间的一种数据类型,如果能够满足需求应该尽量多用。每个TINYINT类型的数据占用1个字节的存储空间。bit值保存为1、0或......