1. 程式人生 > >MSSQL儲存過程詳解

MSSQL儲存過程詳解


用TSQL語句編寫儲存過程

一、變數和引數
           DECLARE 語句通過以下操作初始化 Transact-SQL 變數:
           指定名稱。名稱的第一個字元必須為一個 @。
           指定系統提供的或使用者定義的資料型別和長度。對於數值變數還指定精度和小數位數。對於 XML 型別的變數,可以指定一個可選的架構集合。
           將值設定為 NULL。
           如:DECLARE @MyCounter int
           第一次宣告變數時,其值設定為 NULL。若要為變數賦值,請使用 SET 語句。這是為變數賦值的首選方法。也可以通過 SELECT 語句的選擇列表中當前所引用值為變數賦值。
           引數用於在儲存過程和函式以及呼叫儲存過程或函式的應用程式或工具之間交換資料:
           輸入引數允許呼叫方將資料值傳遞到儲存過程或函式。
           輸出引數允許儲存過程將資料值或遊標變數傳遞迴呼叫方。使用者定義函式不能指定輸出引數。
           每個儲存過程向呼叫方返回一個整數返回程式碼。如果儲存過程沒有顯式設定返回程式碼的值,則返回程式碼為 0。

二、流程控制語句

           1、BEGIN 和 END 語句
               BEGIN 和 END 語句用於將多個 Transact-SQL 語句組合為一個邏輯塊。在控制流語句必須執行包含兩條或多條 Transact-SQL 語句的語句塊的任何地方,都可以使用 BEGIN 和 END 語句。
如:
IF (@@ERROR <> 0)
BEGIN
      SET @ErrorSaveVariable = @@ERROR
      PRINT 'Error encountered, ' +
     CAST(@ErrorSaveVariable AS VARCHAR(10))
END
           2、GOTO 語句
               GOTO 語句使 Transact-SQL 批處理的執行跳至標籤。不執行 GOTO 語句和標籤之間的語句。
       IF(1=1)
    GOTO calculate_salary
    print 'go on' --條件成立則跳過此句。
       calculate_salary:
     print 'go to'
           3、IF...ELSE 語句
               IF 語句用於條件的測試。得到的控制流取決於是否指定了可選的 ELSE 語句:
    if(1=1)
     print 1
    else if(2=2)
     print 2
    else if(3=3)
     print 3
    else
     print 0
           4、RETURN 語句
                 RETURN 語句無條件終止查詢、儲存過程或批處理。儲存過程或批處理中 RETURN 語句後面的語句都不執行。當在儲存過程中使用 RETURN 語句時,此語句可以指定返回給呼叫應用程式、批處理或過程的整數值。如果 RETURN 未指定值,則儲存過程返回 0
           5、WAITFOR 語句
                 WAITFOR 語句掛起批處理、儲存過程或事務的執行,直到發生以下情況:
     已超過指定的時間間隔。
     到達一天中指定的時間。
     指定的 RECEIVE 語句至少修改一行或並將其返回到 Service Broker 佇列。
                 WAITFOR 語句由下列子句之一指定:
             DELAY 關鍵字後為 time_to_pass,是指完成 WAITFOR 語句之前等待的時間。完成 WAITFOR 語句之前等待的時間最多為 24 小時。
     如:
      WAITFOR DELAY '00:00:02'
      SELECT EmployeeID FROM    Employee;
             TIME 關鍵字後為 time_to_execute,指定 WAITFOR 語句完成所用的時間。
      GO
      BEGIN
          WAITFOR TIME '22:00';
          DBCC CHECKALLOC;
      END;
      GO
             RECEIVE 語句子句,從 Service Broker 佇列檢索一條或多條訊息。使用 RECEIVE 語句指定 WAITFOR 時,如果當前未顯示任何訊息,該語句將等待訊息到達佇列。
             TIMEOUT 關鍵字後為 timeout,指定 Service Broker 等待訊息到達佇列的時間長度(毫秒)。可以在 RECEIVE 語句或 GET CONVERSATION GROUP 語句中指定 TIMEOUT。
           6、WHILE...BREAK 或 CONTINUE 語句
                 只要指定的條件為 True 時,WHILE 語句就會重複語句或語句塊。REAK 或 CONTINUE語句通常和WHILE一起使用。BREAK 語句退出最內層的 WHILE 迴圈,CONTINUE 語句則重新開始 WHILE 迴圈。
go
  
declare@Numint
  
declare@IDint
  
declare@iint
  
set@i=1
  
while(exists(select*from T where Num<5    )) --獲取數量小於5的記錄
begin
   
select@Num=Num,@ID=ID from T where Num<5orderby ID desc
   
printStr(@i)+'編號:'+Str(@ID)+''+str(@Num)
   
update T set Num=Num*2where ID=@ID
   
set@i=@i+1
   
if(@i>3)
     
break
--退出迴圈
   
  
end
           7、CASE 語句
            CASE 函式用於計算多個條件併為每個條件返回單個值。CASE 函式通常的用途是將程式碼或縮寫替換為可讀性更強的值