SQL循環(huán)語句的妙用
SQL中使用FOR語句和While語句都可以實現(xiàn)循環(huán)操作,下面就將為您介紹SQL循環(huán)語句的一些應(yīng)用,供您參考,希望對您深入學(xué)習應(yīng)用循環(huán)語句能夠有所幫助。
使用SQL的Agent可以執(zhí)行計劃任務(wù),把寫好的SQL語句放在計劃任務(wù)里,可以達到奇妙的效果,如定時備份數(shù)據(jù),定時執(zhí)行特定操作等等,當涉及循環(huán)操作很多條數(shù)據(jù)時,這里就要使用游標了,當然SQL中也有循環(huán)語句,如使用While。不過while的功能只能實現(xiàn)一般的操作,游標的功能更為強大些,可在一個指定的一個集合內(nèi)循環(huán)操作數(shù)據(jù),實現(xiàn)動態(tài)操作,那就更牛了,呵呵,以下資料供存檔用。
WHILE
設(shè)置重復(fù)執(zhí)行 SQL 語句或語句塊的條件。只要指定的條件為真,就重復(fù)執(zhí)行語句??梢允褂?BREAK 和 CONTINUE 關(guān)鍵字在循環(huán)內(nèi)部控制 WHILE 循環(huán)中語句的執(zhí)行。
語法
WHILE Boolean_expression
{ sql_statement | statement_block }
[ BREAK ]
{ sql_statement | statement_block }
[ CONTINUE ]
參數(shù)
Boolean_expression
返回 TRUE 或 FALSE 的表達式。如果布爾表達式中含有 SELECT 語句,必須用圓括號將 SELECT 語句括起來。
{sql_statement | statement_block}
Transact-SQL 語句或用語句塊定義的語句分組。若要定義語句塊,請使用控制流關(guān)鍵字 BEGIN 和 END。
BREAK
導(dǎo)致從最內(nèi)層的 WHILE 循環(huán)中退出。將執(zhí)行出現(xiàn)在 END 關(guān)鍵字后面的任何語句,END 關(guān)鍵字為循環(huán)結(jié)束標記。
CONTINUE
使 WHILE 循環(huán)重新開始執(zhí)行,忽略 CONTINUE 關(guān)鍵字后的任何語句。
注釋
如果嵌套了兩個或多個 WHILE 循環(huán),內(nèi)層的 BREAK 將導(dǎo)致退出到下一個外層循環(huán)。首先運行內(nèi)層循環(huán)結(jié)束之后的所有語句,然后下一個外層循環(huán)重新開始執(zhí)行。
示例
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end
------------------------------------------------------------
while 條件
begin
執(zhí)行操作
set @i=@i+1
end
A. 在嵌套的 IF...ELSE 和 WHILE 中使用 BREAK 和 CONTINUE
在下例中,如果平均價格少于 $30,WHILE 循環(huán)就將價格加倍,然后選擇最高價。如果最高價少于或等于 $50,WHILE 循環(huán)重新啟動并再次將價格加倍。該循環(huán)不斷地將價格加倍直到最高價格超過 $50,然后退出 WHILE 循環(huán)并打印一條消息。
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 結(jié)構(gòu)是名為 count_all_rows 過程中的一部分。下例中,該 WHILE 結(jié)構(gòu)測試用于游標的函數(shù) @@FETCH_STATUS 的返回值。因為 @@FETCH_STATUS 可能返回 –2、-1 或 0,所以,所有的情況都應(yīng)進行測試。如果某一行在開始執(zhí)行此存儲過程以后從游標結(jié)果中刪除,將跳過該行。成功提取 (0) 后將執(zhí)行 BEGIN...END 循環(huán)內(nèi)部的 SELECT 語句。
單變量循環(huán)
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
多變量循環(huán)
CREATE PROCEDURE my_FeeCount AS
declare @到期時間 char(10)
declare @片區(qū) char(20)
declare @繳費用戶數(shù) char(10)
declare @sql char(2000)
declare cur_data cursor for
select convert(varchar(10),到期時間,120) as 到期時間 ,片區(qū),count(distinct main_id) as 繳費用戶數(shù)
from V_aipu_fee where 提交時間>=convert(varchar(10),getdate()-90,120) and 提交時間<convert(varchar(10),getdate()+1-90,120)
and 收費類型='續(xù)費收費'
Group by convert(varchar(10),到期時間,120),片區(qū)
order by convert(varchar(10),到期時間,120)
open cur_data
fetch next from cur_data into @到期時間,@片區(qū),@繳費用戶數(shù)
while(@@fetch_status = 0)
begin
set @sql='update '+RTRIM(@片區(qū))+'實收='+RTRIM(@片區(qū))+'實收+'+RTRIM(@繳費用戶數(shù))+' where 收費日期='''+RTRIM(@到期時間)+''''
print @sql
fetch next from cur_data into @到期時間,@片區(qū),@繳費用戶數(shù)
end
close cur_data
deallocate cur_data
【編輯推薦】