免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 23929 | 回复: 7
打印 上一主题 下一主题

SQL Server 2000中是否有FOR 循环语句??? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-07 15:32 |只看该作者 |倒序浏览
for i=0,i++,i<@num

select dateadd(DAY,GETDATE(),I)


请问上面的语句怎么改写才正确???

感谢!!!

etqxq@hotmail.com

论坛徽章:
0
2 [报告]
发表于 2004-03-07 18:37 |只看该作者
Transact-SQL 参考


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 将导致退出到下一个外层循环。首先运行内层循环结束之后的所有语句,然后下一个外层循环重新开始执行。

示例
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


请参见

ALTER TRIGGER

控制流语言

CREATE TRIGGER

游标

SELECT

&copy;1988-2000 Microsoft Corporation。保留所有权利。

论坛徽章:
0
3 [报告]
发表于 2004-03-08 08:34 |只看该作者
declare @i int,
        @num int
set @i=1
set @num=20
while @i<@num
begin
select dateadd(DAY,@i,GETDATE())
set @i=@i+1
end

论坛徽章:
0
4 [报告]
发表于 2004-03-08 15:09 |只看该作者

感谢大家的回复!

我已经搞定此问题,
祝大家工作顺利!!
          身体健康!!!

论坛徽章:
0
5 [报告]
发表于 2004-03-09 08:46 |只看该作者
我昨天也刚用过这语句,很好用。

论坛徽章:
0
6 [报告]
发表于 2006-11-23 14:06 |只看该作者
我怎麼沒起作用呢?
alter procedure time_by
as
Declare @Count Int
Set @Count=1099
While @Count>=4298
Begin
update Time_by_day set Time_ID=(@Count-109 where Time_ID=@Count
Set @Count=@Count+1
CONTINUE
End

execute time_by

论坛徽章:
0
7 [报告]
发表于 2006-11-24 10:01 |只看该作者
最初由 piaoye123 发布
[B]我怎麼沒起作用呢?
alter procedure time_by
as
Declare @Count Int
Set @Count=1099
While @Count>=4298
Begin
update Time_by_day set Time_ID=(@Count-109 where Time_ID=@Count
Set @Count=@Count+1
CONTINUE
End

execute time_by [/B]

初值1099就不满足@count>=4298当然不执行循环
另外continue在你的存储过程中没用……
那个是用在你要跳过循环内后面的语句继续循环才用的。

论坛徽章:
0
8 [报告]
发表于 2008-06-15 22:45 |只看该作者
感觉挺好用的
现在如果某字段中出现相同的值,如何用循环现实该字段相同字段值的操作?例如:
id      name
1         a
1         b
1         c
2          d
2          e
结果为:
id      name
1       abc
2         de
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP