关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL语言 »SQL循环语句的妙用

    SQL循环语句的妙用

    2010-09-08 16:26:00 出处:ITJS
    分享

    SQL中使用FOR语句和While语句都可以实现循环操作,接下来的SQL server内容就将为您介绍SQL循环语句的一些应用,供您参考,希望对您深入学习应用循环语句能够有所帮助。

    使用SQL的Agent可以执行计划任务,把写好的SQL语句放在计划任务里,可以达到奇妙的效果,如定时备份数据,定时执行特定操作等等,当涉及循环操作很多条数据时,这里就要使用游标了,当然SQL中也有循环语句,如使用While。不过while的功能只能实现一般的操作,游标的功能更为强大些,可在一个指定的一个集合内循环操作数据,实现动态操作,那就更牛了,呵呵,以下资料供存档用。

    WHILE

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

    语法

    WHILE Boolean_expression

          { sql_statement | statement_block }

          [ BREAK ]

          { sql_statement | statement_block }

          [ CONTINUE ]

    参数

    Boolean_expression

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

    {sql_statement | statement_block}

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

    BREAK

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

    CONTINUE

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

    注释

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

    示例

    declare @i int

    set @i=1

    while @i<30

    begin

    insert into test (userid) values(@i)

    set @i=@i+1

    end

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

    while 条件

    begin

    执行操作

    set @i=@i+1

    end

    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'

    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

    多变量循环

    CREATE      PROCEDURE my_FeeCount AS

    declare @到期时间      char(10)

    declare @片区          char(20)

    declare @缴费用户数 char(10)

    declare @sql   char(2000)

    declare cur_data cursor for

    select   convert(varchar(10),到期时间,120) as 到期时间 ,片区,count(distinct main_id) as 缴费用户数

    from V_aipu_fee where 提交时间>=convert(varchar(10),getdate()-90,120) and 提交时间<convert(varchar(10),getdate()+1-90,120)

    and 收费类型='续费收费'

    Group   by   convert(varchar(10),到期时间,120),片区

    order   by   convert(varchar(10),到期时间,120)

    open cur_data

    fetch next from cur_data into @到期时间,@片区,@缴费用户数

    while(@@fetch_status = 0)

    begin

            set @sql='update '+RTRIM(@片区)+'实收='+RTRIM(@片区)+'实收+'+RTRIM(@缴费用户数)+' where 收费日期='''+RTRIM(@到期时间)+''''

    print @sql

    fetch next from cur_data into @到期时间,@片区,@缴费用户数

    end

    close cur_data

    deallocate cur_data

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    SQL汉字转换为拼音的函数

    windows 7系统无法运行Photoshop CS3的解决方法

    巧用MySQL加密函数对Web网站敏感数据进行保护

    MySQL基础知识简介

    Windows7和WinXP下如何实现不输密码自动登录系统的设置方法介绍

    windows 7系统ip地址冲突怎么办?windows 7系统IP地址冲突问题的

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。