经典语句大全
sql循环语句篇一:SQL循环语句 的写法SQL循环语句 declare @i int set @i=1 while @i
sql循环语句

sql循环语句篇一:SQL循环语句 的写法


SQL循环语句 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 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
C.延伸:
--定义变量:declare @A1 INT,@A2 INT,@A3 INT--定义游标DECLARE my_Cur CURSOR FORSELECT A1,A2,A3 FROM A--打开游标OPEN  my_Cur --游标滚到下一行FETCH NEXT FROM  my_Cur INTO @A1,@A2,@A3--循环直到游标逐行读取完数据WHILE @@FETCH_STATUS = 0BEGIN   /*   --这里做你想做的事情   --请问   print  @A1+@A2+@A3   --怎么实现,谢谢   */   --游标滚到下一行   FETCH NEXT FROM  my_Cur INTO @A1,@A2,@A3END--关闭游标CLOSE my_Cur --释放资源DEALLOCATE my_Cur
如何在SQL中使用循环结构 解答 FOR,LOOP,WHILE,REPEAT是UDB/400的一种内部循环控制,用于遍历表中符合条件的每一行记录。
例如:目的:更新employee库,把所有北京籍员工的工资提高10%
例一:使用FOR循环--------------------------------------------CREATE PROCEDURE QGPL/TEST_FORLANGUAGE SQLBEGINFOR each_record AS---cur01 CURSOR FOR------SELECT * FROM code,salary,city from employee where city="Beijing"---------DO------------UPDATE employee------------SET salary=salary * 1.1------------WHERE CURRENT OF cur01;ENDFOR;END;
例二:使用LOOP循环----------------------------------------CREATE PROCEDURE QGPL/TEST_LOOPLANGUAGE SQLBEGINDECLARE code_v char(10);DECLARE salary_v integer;DECLARE city_v char(20);
DECLARE C1 CURSOR FOR---SELECT code,salary,city FROM employee WHERE city="Beijing";OPEN C1;loop_label:LOOP- FETCH C1 INTO code_v,salary_v,city_v;--IF SQLCODE=0 THEN ------SET salary_v=salary_v*1.1;------UPDATE employee SET salary=salary_v---------WHERE CURRENT OF C1;--ELSE------LEAVE loop_label;--END IF;END LOOP loop_label;CLOSE C1;END;
例三:使用WHILE循环---------------------------------------CREATE PROCEDURE QGPL/TEST_WHILELANGUAGE SQLBEGINDECLARE code_v char(10);DECLARE salary_v integer;DECLARE city_v char(20);DECLARE at_end integer;
DECLARE C1 CURSOR FOR---SELECT code,salary,city FROM employee WHERE city="Beijing";OPEN C1;
SET at_end=0;WHILE at_end = 0 DO--FETCH C1 INTO code_v,salary_v,city_v;--IF SQLCODE=0 THEN ------SET salary_v=salary_v*1.1;------UPDATE employee SET salary=salary_v---------WHERE CURRENT OF C1;--ELSE------SET at_end=1;--END IF;END WHILE;CLOSE C1;END;
例四:使用REPEAT循环------------------------------------------------CREATE PROCEDURE QGPL/TEST_REPEATLANGUAGE SQLBEGINDECLARE code_v char(10);DECLARE salary_v integer;DECLARE city_v char(20);
DECLARE C1 CURSOR FOR---SELECT code,salary,city FROM employee WHERE city="Beijing";OPEN C1;
repeat_label:REPEAT--FETCH C1 INTO code_v,salary_v,city_v;--IF SQLCODE=0 THEN ------SET salary_v=salary_v*1.1;------UPDATE employee SET salary=salary_v---------WHERE CURRENT OF C1;--END IF;--UNTIL SQLCODE<>0;END REPEAT repeat_loop;CLOSE C1;END;
总结:四种循环结构实现的功能基本相同,用户可以根据自己的习惯选择使用。

sql循环语句篇二:SQL SERVER数据库中存储过程使用循环语句


SQL SERVER数据库中存储过程使用循环语句
http://database.51cto.com  2010-09-06 11:05  佚名  互联网  我要评论(0)
摘要:SQL SERVER数据库建立存储过程时,可以使用循环语句,下面就将为您介绍这种SQL SERVER数据库中存储过程使用循环语句的方法,供您参考。
标签:SQL SERVER  语句
SQL SERVER数据库建立存储过程时,可以使用循环语句,下面就将为您介绍这种SQL SERVER数据库中存储过程使用循环语句的方法,供您参考。
CREAT PROCEDURE tester   ASBEGIN    SET NOCOUNT ON;    DECLARE @userId varchar(50)    DECLARE @count int    SET @count = 0    SELECT @count = count(*) FROM   UserService_User WHERE Account like "%111%"   WHILE @count > 0    BEGIN        SELECT @userId = Id FROM   UserService_User WHERE Account like "%111%"        exec UserService_RemoveUserByUserId @userId        SET @count = @count -1    END END
说明:
1、此存储过程在SQL SERVER 2005上测试通过,值得注意的是,循环体中,语句是使用BEGIN……END包括的,而不是网络上常说的WHILE ……END WHILE结构,其他的循环语句,如LOOP ……UNTIL……END LOOP也不能通过编译,也许是版本的问题,但在SQL SERVER2005中,循环体使用BEGIN……END就可以,而不能使用网络上常说的WHILE ……END WHILE结构。
2、循环体中 UserService_RemoveUserByUserId 是一个存储过程的名称,@userId为该存储过程的参数,如果有多个参数,使用“,”分开就可以了,这也是存储过程调用另一个存储过程的一种方法。
 
 
SQL Server中存储过程慢于SQL语句直接执行的原因
http://database.51cto.com  2010-09-06 11:24  佚名  互联网  我要评论(0)
摘要:SQL Server数据库中,存储过程的执行总是要比SQL语句直接执行要慢,这究竟是为什么呢?本文将带您寻找答案。
标签:SQL Server  语句
SQL Server数据库中,存储过程的执行总是要比SQL语句直接执行要慢,这究竟是为什么呢?本文将带您寻找答案。
在SQL Server中有一个叫做 “Parameter sniffing”的特性。SQL Server在存储过程执行之前都会制定一个执行计划。在上面的例子中,SQL在编译的时候并不知道@thedate的值是多少,所以它在执行执行计划的时候就要进行大量的猜测。假设传递给@thedate的参数大部分都是非空字符串,而FACT表中有40%的thedate字段都是null,那么SQL Server就会选择全表扫描而不是索引扫描来对参数@thedate制定执行计划。全表扫描是在参数为空或为0的时候最好的执行计划。但是全表扫描严重影响了性能。
假设你第一次使用了Exec pro_ImAnalysis_daily @thedate=’20080312’那么SQL Server就会使用20080312这个值作为下次参数@thedate的执行计划的参考值,而不会进行全表扫描了,但是如果使用@thedate=null,则下次执行计划就要根据全表扫描进行了。
有两种方式能够避免出现“Parameter sniffing”问题:<!--(1)通过使用declare声明的变量来代替参数:使用set @variable=@thedate的方式,将出现@thedate的sql语句全部用@variable来代替。<!--(2) 将受影响的sql语句隐藏起来,比如:<!-- a)      将受影响的sql语句放到某个子存储过程中,比如我们在@thedate设置成为今天后再调用一个字存储过程将@thedate作为参数传入就可以了。<!-- b)      使用sp_executesql来执行受影响的sql。执行计划不会被执行,除非sp_executesql语句执行完。<!-- c)      使用动态sql(”EXEC(@sql)”来执行受影响的sql。采用(1)的方法改造例子中的存储过程,如下:
代码:
ALTER PROCEDURE [dbo].[pro_ImAnalysis_daily]@var_thedate VARCHAR(30) ASBEGIN    declare @THEDATE VARCHAR(30)    IF @var_thedate IS NULL    BEGIN       SET @var_thedate=CONVERT(VARCHAR(30),GETDATE()-1,112);    END      SET @THEDATE=@var_thedate;    DELETE FROM RPT_IM_USERINFO_DAILY WHERE THEDATE=@THEDATE;    INSERT RPT_IM_USERINFO_DAILY (THEDATE,ALLUSER,NEWUSER)    SELECT AA.THEDATE,ALLUSER,NEWUSER    FROM    ( ( SELECT THEDATE,COUNT(DISTINCT USERID) ALLUSER       FROM FACT       WHERE THEDATE=@THEDATE        GROUP BY THEDATE       ) AA       LEFT JOIN       (SELECT THEDATE,COUNT(DISTINCT USERID) NEWUSER        FROM FACT T1        WHERE NOT EXISTS(                         SELECT 1                         FROM FACT T2                         WHERE T2.THEDATE<@THEDATE                             AND T1.USERID=T2.USERID)              AND T1.THEDATE=@THEDATE        GROUP BY THEDATE        ) BB       ON AA.THEDATE=BB.THEDATE);GO 

sql循环语句篇三:SQLSERVER游标及循环语句


SQLSERVER游标及循环语句
整理一下,关于游标,MSDN有:
过 Transact-SQL 服务器游标检索特定行。
Transact-SQL 语法约定
 参数
NEXT
紧跟当前行返回结果行,并且当前行递增为返回行。如果 FETCH NEXT 为对游标的第一次提取操作,则返回结果集中的第一行。NEXT 为默认的游标提取选项。 PRIOR
返回紧邻当前行前面的结果行,并且当前行递减为返回行。如果 FETCH PRIOR 为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。 FIRST
返回游标中的第一行并将其作为当前行。 LAST
返回游标中的最后一行并将其作为当前行。 ABSOLUTE { n | @nvar}
如果 n 或 @nvar 为正,则返回从游标头开始向后的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为负,则返回从游标末尾开始向前的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为 0,则不返回行。n 必须是整数常量,并且 @nvar 的数据类型必须为 smallint、tinyint 或 int。 RELATIVE { n | @nvar}
如果 n 或 @nvar 为正,则返回从当前行开始向后的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为负,则返回从当前行开始向前的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为 0,则返回当前行。在对游标进行第一次提取时,如果在将 n 或 @nvar 设置为负数或 0 的情况下指定 FETCH RELATIVE,则不返回行。n 必须是整数常量,@nvar 的数据类型必须为 smallint、tinyint 或 int。 GLOBAL
指定 cursor_name 是指全局游标。 cursor_name
要从中进行提取的打开的游标的名称。如果全局游标和局部游标都使用 cursor_name 作为它们的名称,那么指定 GLOBAL 时,cursor_name 指的是全局游标;未指定 GLOBAL 时,cursor_name 指的是局部游标。
@ cursor_variable_name
游标变量名,引用要从中进行提取操作的打开的游标。 INTO @variable_name[ ,...n]
允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果集列的数据类型匹配,或是结果集列数据类型所支持的隐式转换。变量的数目必须与游标选择列表中的列数一致。  注释
如果 SCROLL 选项未在 ISO 样式的 DECLARE CURSOR 语句中指定,则 NEXT 是唯一支持的 FETCH 选项。如果在 ISO 样式的 DECLARE CURSOR 语句中指定了 SCROLL 选项,则支持所有 FETCH 选项。
如果使用 Transact-SQL DECLARE 游标扩展插件,则应用下列规则:
如果指定了 FORWARD_ONLY 或 FAST_FORWARD,则 NEXT 是唯一受支持的 FETCH 选项。
如果未指定 DYNAMIC、FORWARD_ONLY 或 FAST_FORWARD 选项,并且指定了 KEYSET、STATIC 或 SCROLL 中的某一个,则支持所有 FETCH 选项。
DYNAMIC SCROLL 游标支持除 ABSOLUTE 以外的所有 FETCH 选项。
@@FETCH_STATUS 函数报告上一个 FETCH 语句的状态。相同的信息记录在由 sp_describe_cursor 返回的游标中的 fetch_status 列中。这些状态信息应该用于在对由 FETCH 语句返回的数据进行任何操作之前,以确定这些数据的有效性。有关详细信息,请参阅 @@FETCH_STATUS (Transact-SQL)。
 权限
FETCH 权限默认授予任何有效的用户。  
 示例 A. 在简单的游标中使用 FETCH
以下示例为 Person.Contact 表中姓氏以字母 B 开头的行声明了一个简单的游标,并使用 FETCH NEXT 逐个提取这些行。FETCH 语句以单行结果集形式返回在 DECLARE CURSOR 中指定的列的值。 复制代码
USE AdventureWorks
GO
DECLARE contact_cursor CURSOR FOR
SELECT LastName FROM Person.Contact
WHERE LastName LIKE "B%"
ORDER BY LastName
OPEN contact_cursor
-- Perform the first fetch.
FETCH NEXT FROM contact_cursor
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
-- This is executed as long as the previous fetch succeeds.
FETCH NEXT FROM contact_cursor
END
CLOSE contact_cursor
DEALLOCATE contact_cursor
GO
B. 使用 FETCH 将值存入变量
以下示例与示例 A 相似,但 FETCH 语句的输出存储于局部变量而不是直接返回到客户端。PRINT 语句将变量组合成单一字符串并将其返回到客户端。 复制代码
USE AdventureWorks
GO
-- Declare the variables to store the values returned by FETCH.
DECLARE @LastName varchar(50), @FirstName varchar(50)
DECLARE contact_cursor CURSOR FOR
SELECT LastName, FirstName FROM Person.Contact
WHERE LastName LIKE "B%"
ORDER BY LastName, FirstName
OPEN contact_cursor
-- Perform the first fetch and store the values in variables.
-- Note: The variables are in the same order as the columns
-- in the SELECT statement.
FETCH NEXT FROM contact_cursor
INTO @LastName, @FirstName
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
-- Concatenate and display the current values in the variables.
PRINT "Contact Name: " + @FirstName + " " +@LastName
-- This is executed as long as the previous fetch succeeds.
FETCH NEXT FROM contact_cursor
INTO @LastName, @FirstName
END
CLOSE contact_cursor
DEALLOCATE contact_cursor
GO
C. 声明 SCROLL 游标并使用其他 FETCH 选项
以下示例创建一个 SCROLL 游标,使其通过 LAST、PRIOR、RELATIVE 和 ABSOLUTE 选项支持全部滚动功能。

另外,再举一个简单的例子:
Declare @Id varchar(20) Declare @Name varchar(20) Declare Cur Cursor For select substring(id,0,7) as id,name from temp1 Open Cur Fetch next From Cur Into @Id,@Name While @@fetch_status=0 Begin Update temp Set [c3]=@Name where [id] like @Id+"%" Fetch Next From Cur Into @Id,@Name End Close Cur Deallocate Cur
简单的FOR循环等:
declare   @i   int     set   @i=0     while   @i<10     begin         set   @i   =   @i+1     end         SQL   SERVER不支持FOR循环
USE AdventureWorks
GO
-- Execute the SELECT statement alone to show the
-- full result set that is used by the cursor.
SELECT LastName, FirstName FROM Person.Contact
ORDER BY LastName, FirstName
-- Declare the cursor.
DECLARE contact_cursor SCROLL CURSOR FOR
SELECT LastName, FirstName FROM Person.Contact
ORDER BY LastName, FirstName
OPEN contact_cursor
-- Fetch the last row in the cursor.
FETCH LAST FROM contact_cursor
-- Fetch the row immediately prior to the current row in the cursor.
FETCH PRIOR FROM contact_cursor
-- Fetch the second row in the cursor.
FETCH ABSOLUTE 2 FROM contact_cursor
-- Fetch the row that is three rows after the current row.
FETCH RELATIVE 3 FROM contact_cursor
-- Fetch the row that is two rows prior to the current row.
FETCH RELATIVE -2 FROM contact_cursor
CLOSE contact_cursor
DEALLOCATE contact_cursor
GO  语法
FETCH
          [ [ NEXT | PRIOR | FIRST | LAST
                    | ABSOLUTE { n | @nvar }
                    | RELATIVE { n | @nvar }
               ]
               FROM
          ]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]

sql循环语句

https://m.shanpow.com/mrmy/447983/

推荐访问:sql循环查询语句
《sql循环语句.doc》
将本文的Word文档下载,方便收藏和打印
推荐:
下载文档
下一篇: oracle创建表
相关阅读经典语句大全 
热点推荐