天天看點

SQLSERVER 存儲過程 文法

SQLSERVER存儲過程的寫法格式規格 *****************************************************

***  author:Susan

***  date: 2005 / 08 / 05

***  expliation:如何寫存儲過程的格式及例子,有遊標的用法!

***  本版:SQL SERVER 版!

******************************************************/

在存儲過程中的格式規格:

CREATE   PROCEDURE  XXX

參數1,

參數2……………

As

Declare

參數1,

參數2……………

Set參數1的初始值

Set參數2的初始值…………

Begin  trascation

Commit  trascation

Return

下面是一個例子

CREATE   PROCEDURE  TEST_2

@strTO   VARCHAR ( 3 )

AS

DECLARE

  @strUNIT_NAME   VARCHAR ( 800 ),

  @strSQL   VARCHAR ( 8000 ),

  @Link   VARCHAR ( 1 ),

  @Link1   VARCHAR ( 1 )

SET   @strUNIT_NAME = ''

SET   @strSQL = ''

SET   @Link = ''

SET   @Link1 = ''

BEGIN   TRANSACTION                                        

          IF   @strTO <> ''

         BEGIN

                 UPDATE  UNIT  SET  UNIT_NAME = REPLACE (UNIT_NAME, ' * ' , '' )  WHERE  UNIT_CODE = @strTO

         END

              ELSE

         BEGIN

                 UPDATE  UNIT  SET  UNIT_NAME = UNIT_NAME + ' * '   WHERE  UNIT_CODE = ' 011 '

         END

         IF     @strTO <> ''

             BEGIN

                         declare  db  cursor   for                                                  -- 必需聲明在查詢的前面

                 SELECT  UNIT_NAME  FROM  UNIT  WHERE   LEFT (UNIT_CODE, 2 ) = LEFT ( @strTO , 2 ) -- -取到相關資訊

             END

         ELSE

             BEGIN

                      declare  db  cursor   for                                                -- 必需聲明在查詢的前面

                      SELECT  UNIT_NAME  FROM  UNIT  WHERE   LEFT (UNIT_CODE, 2 ) = LEFT ( ' 011 ' , 2 ) -- -取到相關資訊

             END

         open  db                                                     -- -開起取到的資訊

         fetch   next   from  db  into   @strUNIT_NAME          -- -把第一筆放入@strUNIT_NAME中

         while   @@fetch_status   =   0                                             -- -表示存在本筆資料

         BEGIN                                                      -- --開始循環

                 set   @strSQL   = @strSQL + @Link1 + @Link +   @strUNIT_NAME   -- --設定儲存的值

                 fetch   next   from  db  into   @strUNIT_NAME                         -- --進行下次循環

                 SET   @Link = CHAR ( 13 )  + CHAR ( 10 )

                 SET   @Link1 = ' , '

         END                                                          -- --結束循環

         close  db                                                    -- -關閉資訊

         deallocate  db                                             -- -移除資料指標參考

SELECT   @strSQL

COMMIT   TRANSACTION

RETURN 如果循環insert的例子

DECLARE   @strLoginID   VARCHAR ( 16 )

BEGIN

declare  db  cursor   for

SELECT  LoginID  FROM  dbo.s_Users  WHERE   len (UnitCoding)  in ( 9 , 12 )

END

open  db

fetch   next   from  db  into   @strLoginID

while   @@fetch_status   =   0   BEGIN

insert   into  s_P_User

select   @strLoginID ,LevelID  from  s_P_User  where  LoginID  =   ' aa '

fetch   next   from  db  into   @strLoginID

END

close  db

deallocate  db 一、TRUNCATE

二、Select INTO 建表

    把一個表中的資料複制到另外一個表中。

三、Insert INTO Select

四、補充:臨時表

    臨時表存儲在系統資料庫tempdb中

    臨時表會被系統隐式地丢棄

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

五、存儲過程(**)

    一、簡介:

   存儲過程(Stored Procedure), 是一組為了完成特定功能的SQL 語句,集經編譯後

    存儲在資料庫中,使用者通過指定存儲過程的名字并給出參數,如果該存儲過程帶有參數來執行

它,

    在SQL Server 的系列版本中,存儲過程分為兩類:系統提供的存儲過程和使用者自定義存儲過程

    系統SP,主要存儲master 資料庫中,并以sp_為字首并且系統存儲過程主要是從系統表中擷取

    資訊,進而為系統管理者管理SQL Server。 使用者自定義存儲過程是由使用者建立,并能完成

    某一特定功能,如:查詢使用者所需資料資訊的存儲過程。

      存儲過程具有以下優點

    1.存儲過程允許标準元件式程式設計(子產品化設計)

    存儲過程在被建立以後,可以在程式中被多次調用,而不必重新編寫該存儲過程的SQL語句,而

且數

    據庫專業人員可随時對存儲過程進行修改,但對應用程式源代碼毫無影響。因為應用程式源代

碼隻包含存

    儲過程的調用語句,進而極大地提高了程式的可移植性。

    2.存儲過程能夠實作快速的執行速度

   如果某一操作包含大量的Transaction-SQL 代碼,,或分别被多次執行,那麼存儲過程要比批處理

    執行速度快很多,因為存儲過程是預編譯的,在首次運作一個存儲過程時,查詢優化器對其進

行分析優

    化,并給出最終被存在系統表中的執行計劃,而批處理的Transaction-SQL 語句在每次運作時

都要進行

    編譯和優化,是以速度相對要慢一些。

    3.存儲過程能夠減少網絡流量

   對于同一個針對資料資料庫對象的操作,如查詢修改,如果這一操作所涉及到的Transaction-SQL

    語句被組織成一存儲過程,那麼當在客戶計算機上調用該存儲過程時,網絡中傳送的隻是該調

用語句,否

    則将是多條SQL 語句進而大大增加了網絡流量降低網絡負載。

    4.存儲過程可被作為一種安全機制來充分利用

   系統管理者通過,對執行某一存儲過程的權限進行限制,進而能夠實作對相應的資料通路權限的

    制。

    二、變量

    @I

    三、流程控制語句(if else | select case | while )

    Select ... CASE 執行個體

    DECLARE @iRet INT, @PKDisp VARCHAR(20)

    SET @iRet = '1'

    Select @iRet =

    CASE

        WHEN @PKDisp = '一' THEN 1

        WHEN @PKDisp = '二' THEN 2

        WHEN @PKDisp = '三' THEN 3

        WHEN @PKDisp = '四' THEN 4

        WHEN @PKDisp = '五' THEN 5

        ELSE 100

    END

    四、存儲過程格式

    建立存儲過程

    Create Proc dbo.存儲過程名

    存儲過程參數

    AS

    執行語句

    RETURN

    執行存儲過程

    GO

*********************************************************/

--  變量的聲明,sql裡面聲明變量時必須在變量前加@符号

     DECLARE   @I   INT

--  變量的指派,變量指派時變量前必須加set

     SET   @I   =   30

--  聲明多個變量

     DECLARE   @s   varchar ( 10 ), @a   INT

--  Sql 裡if語句

     IF  條件  BEGIN

        執行語句

     END

     ELSE   BEGIN

        執行語句

     END

     DECLARE   @d   INT

     set   @d   =   1

     IF   @d   =   1   BEGIN

     --  列印

         PRINT   ' 正确 '

     END

     ELSE   BEGIN

         PRINT   ' 錯誤 '

     END

--  Sql 裡的多條件選擇語句.

     DECLARE   @iRet   INT ,  @PKDisp   VARCHAR ( 20 )

     SET   @iRet   =   1

     Select   @iRet   =

     CASE

         WHEN   @PKDisp   =   ' 一 '   THEN   1

         WHEN   @PKDisp   =   ' 二 '   THEN   2

         WHEN   @PKDisp   =   ' 三 '   THEN   3

         WHEN   @PKDisp   =   ' 四 '   THEN   4

         WHEN   @PKDisp   =   ' 五 '   THEN   5

         ELSE   100

     END

--  循環語句

     WHILE  條件  BEGIN     

        執行語句

     END

     DECLARE   @i   INT

     SET   @i   =   1

     WHILE   @i < 1000000   BEGIN

         set   @i = @i + 1

     END

     --  列印

     PRINT   @i

--  TRUNCATE 删除表中的所有行,而不記錄單個行删除操作,不能帶條件

         TRUNCATE   TABLE  authors

--  Select INTO 從一個查詢的計算結果中建立一個新表。 資料并不傳回給用戶端,這一點和普通的

--  Select 不同。 新表的字段具有和 Select 的輸出字段相關聯(相同)的名字和資料類型。

         select   *   into  NewTable

             from  Uname

--  Insert INTO Select

         --  表ABC必須存在

         --  把表Uname裡面的字段Username複制到表ABC

         Insert   INTO  ABC  Select  Username  FROM  Uname

--  建立臨時表

         Create   TABLE  # temp (

            UID  int   identity ( 1 ,  1 )  PRIMARY   KEY ,

            UserName  varchar ( 16 ),

            Pwd  varchar ( 50 ),

            Age  smallint ,

            Sex  varchar ( 6 )

        )

         --  打開臨時表

         Select   *   from  # temp

--  存儲過程

         --  要建立存儲過程的資料庫

         Use  Test

         --  判斷要建立的存儲過程名是否存在

             if   Exists ( Select  name  From  sysobjects  Where  name = ' csp_AddInfo '   And

type = ' P ' )

             --  删除存儲過程

             Drop   Procedure  dbo.csp_AddInfo

         Go

         --  建立存儲過程

         Create   Proc  dbo.csp_AddInfo

         --  存儲過程參數

         @UserName   varchar ( 16 ),

         @Pwd   varchar ( 50 ),

         @Age   smallint ,

         @Sex   varchar ( 6 )

         AS

         --  存儲過程語句體

         insert   into  Uname (UserName,Pwd,Age,Sex)

             values  ( @UserName , @Pwd , @Age , @Sex )

         RETURN

         --  執行

         GO

         --  執行存儲過程

         EXEC  csp_AddInfo  ' Junn.A ' , ' 123456 ' , 20 , ' 男 '