• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            山寨:不是最好的,是最適合我們的!歡迎體驗山寨 中文版MSDN

            Blog @ Blog

            當華美的葉片落盡,生命的脈絡才歷歷可見。 -- 聶魯達

            常用鏈接

            統計

            積分與排名

            BBS

            Blog

            Web

            最新評論

            SQL Server存儲過程入門案例詳解[轉]

            SQL Server存儲過程入門案例詳解

            存儲過程是存儲于數據庫中的一組T-SQL語句。有了存儲過程之后,與數據庫的交互就沒有必要在程序中寫一堆的SQL語句,而只需用一條語句調用適當的存儲過程來完成就可以了。另外,由于代碼是存儲在數據庫中,我們也可以在不同的應用程序或查詢窗口中不斷的重復利用那些代碼。下面將講述一些簡單的例子,它們將說明如何構造和使用存儲過程。

              下面的例子將簡單的說明如何創建存儲過程。以下所有例子均使用AdventureWorks數據庫。其它的數據庫和應用程序可以依此類推。

               1 – 簡單的存儲過程

            這個簡單的存儲過程將實現如下功能:從Person.Contact表中取出第一條記錄。

            CREATE PROCEDURE uspGetContact 
              AS 
              SELECT TOP 1 ContactID, FirstName, LastName 
              FROM Person.Contact

            創建完上面的語句后,使用下面的命令可以執行該存儲過程。

            EXEC uspGetContact

              查詢的結果如下:

              例 2 – 帶參數的存儲過程

            這個例子在上個例子的基礎上做了一點修改:傳入了一個參數,根據傳入的參數來查詢相應的記錄。為了更好地利用上面的例子,這次我們就不用重新再創建一個存儲過程了,而是使用ALTER PROCEDURE(注意:不是CREATE PROCEDURE)來修改例1中已經創建好的存儲過程。代碼如下:

            ALTER PROCEDURE uspGetContact @LastName NVARCHAR(50
              AS 
              SELECT TOP 1 ContactID, FirstName, LastName 
              FROM Person.Contact 
              WHERE LastName = @LastName

            下面顯示了運行存儲過程的2種不同方法。第一種方法僅僅傳入了我們想要的參數值。而第二種方法包含了參數名和參數值。任意一種方法都可以運行該例中的存儲過程。

            EXEC uspGetContact 'Alberts' 
            EXEC uspGetContact @LastName='Alberts'

            查詢結果如下:

              例 3 – 帶輸入和輸出參數的存儲過程

              這個例子中既有輸入參數也有輸出參數。在存儲過程中查詢后得到的ContactID可以利用輸出參數進行回傳。回傳參數用戶查詢人員表中的其他字段,如ContactIDFirstNameLastName以及這個人的任何地址記錄。

            首先,我們按如下方式修改存儲過程uspGetContact。其次,運行下面代碼執行該存儲過程。最后,基于傳回的值可以查詢人員的姓名和地址等信息。

            ALTER PROCEDURE uspGetContact @LastName NVARCHAR(50), @ContactID INT output 
              AS 
              SELECT TOP 1 @ContactID = c.ContactID 
              FROM HumanResources.Employee a 
              INNER JOIN HumanResources.EmployeeAddress b ON a.EmployeeID = b.EmployeeID 
              INNER JOIN Person.Contact c ON a.ContactID = c.ContactID 
              INNER JOIN Person.Address d ON b.AddressID = d.AddressID 
              WHERE c.LastName = @LastName

            存儲過程修改后,運行如下代碼將執行該存儲過程。如果ContactID有值,就會返回人員和地址信息。

            DECLARE @ContactID INT 
              SET @ContactID = 0 
              EXEC uspGetContact @LastName='Smith'@ContactID=@ContactID OUTPUT 
              IF @ContactID <> 0 
              BEGIN 
              SELECT ContactID, FirstName, LastName 
              FROM Person.Contact 
              WHERE ContactID = @ContactID 
              SELECT d.AddressLine1, d.City, d.PostalCode 
              FROM HumanResources.Employee a 
              INNER JOIN HumanResources.EmployeeAddress b ON a.EmployeeID = b.EmployeeID 
              INNER JOIN Person.Contact c ON a.ContactID = c.ContactID 
              INNER JOIN Person.Address d ON b.AddressID = d.AddressID 
              WHERE c.ContactID = @ContactID 
              END

            查詢結果如下:

               4 – 使用RAISERROR 語句的存儲過程

              在這個例子中,將把例3中的2個步驟整合到一個存儲過程中。存儲過程的第一步是取得ContactID,第二步是查詢人員的姓名和地址信息。然后添加RAISERROR語句,如果查詢不到記錄則返回錯誤信息。

            RAISERROR語句可以用來控制應用程序處理無數據或其它錯誤的方式。將該存儲過程執行2次,看看能找到數據和不能找到數據的情況下各返回什么。

            ALTER PROCEDURE uspGetContact @LastName NVARCHAR(50
              AS 
              DECLARE @ContactID INT 
              SELECT TOP 1 @ContactID = c.ContactID 
              FROM HumanResources.Employee a 
              INNER JOIN HumanResources.EmployeeAddress b ON a.EmployeeID = b.EmployeeID 
              INNER JOIN Person.Contact c ON a.ContactID = c.ContactID 
              INNER JOIN Person.Address d ON b.AddressID = d.AddressID 
              WHERE c.LastName = @LastName 
              IF @@ROWCOUNT > 0 
              BEGIN 
              SELECT ContactID, FirstName, LastName 
              FROM Person.Contact 
              WHERE ContactID = @ContactID 
              SELECT d.AddressLine1, d.City, d.PostalCode 
              FROM HumanResources.Employee a 
              INNER JOIN HumanResources.EmployeeAddress b ON a.EmployeeID = b.EmployeeID 
              INNER JOIN Person.Contact c ON a.ContactID = c.ContactID 
              INNER JOIN Person.Address d ON b.AddressID = d.AddressID 
              WHERE c.ContactID = @ContactID 
              END 
              ELSE 
              BEGIN 
              RAISERROR ('No record found',10,1
              END 
              EXEC uspGetContact @LastName='Walters'

              查詢結果如下:

            EXEC uspGetContact @LastName='Job'

            當第一步查詢無數據時,整個存儲過程的執行結果如下:

               5 -調用存儲過程的存儲過程

            這個例子中有2個存儲過程。第一個存儲過程uspFindContact查找第一條帶有地址信息的記錄并將ContactID返回給調用它的存儲過程,然后顯示人員和地址信息。

            CREATE PROCEDURE uspFindContact @LastName NVARCHAR(50), @ContactID INT output 
              AS 
              SELECT TOP 1 @ContactID = c.ContactID 
              FROM HumanResources.Employee a 
              INNER JOIN HumanResources.EmployeeAddress b ON a.EmployeeID = b.EmployeeID 
              INNER JOIN Person.Contact c ON a.ContactID = c.ContactID 
              INNER JOIN Person.Address d ON b.AddressID = d.AddressID 
              WHERE c.LastName = @LastName

            下面的代碼對uspGetContact做了一點修改:調用uspFindContact并返回結果集。


            ALTER
             PROCEDURE uspGetContact @LastName NVARCHAR(50
              AS 
              DECLARE @ContactID INT 
              SET @ContactID = 0 
              EXEC uspFindContact @LastName=@LastName@ContactID=@ContactID OUTPUT 
              IF @ContactID <> 0 
              BEGIN 
              SELECT ContactID, FirstName, LastName 
              FROM Person.Contact 
              WHERE ContactID = @ContactID 
              SELECT d.AddressLine1, d.City, d.PostalCode 
              FROM HumanResources.Employee a 
              INNER JOIN HumanResources.EmployeeAddress b ON a.EmployeeID = b.EmployeeID 
              INNER JOIN Person.Contact c ON a.ContactID = c.ContactID 
              INNER JOIN Person.Address d ON b.AddressID = d.AddressID 
              WHERE c.ContactID = @ContactID 
              END 
              ELSE 
              BEGIN 
              RAISERROR ('No record found',10,1
              END 
              EXEC uspGetContact @LastName='Walters'

               第一步查詢結果如下:

            EXEC uspGetContact @LastName='Job'

              第一步查詢結果如下:

               6 -帶評論的存儲過程

              最后這個例子基于存儲過程uspGetContact,并增加了評論功能。展示了如何在一個存儲過程中使用評論。存儲過程中的評論有2種實現方式:1.使用-- 2.使用/*來作為評論的開始,以*/作為結束。其余部分和上面的例子一樣。

            ALTER PROCEDURE uspGetContact @LastName NVARCHAR(50
              AS 
              /* This is a sample stored procedure to show how comments work within a stored procedure */ 
              -- declare variable 
              DECLARE @ContactID INT 
              -- set variable value 
              SET @ContactID = 0 
              -- execute stored proc and return ContactID value 
              EXEC uspFindContact @LastName=@LastName@ContactID=@ContactID OUTPUT 
              -- if ContactID does not equal 0 then return data else return error 
              IF @ContactID <> 0 
              BEGIN 
              SELECT ContactID, FirstName, LastName 
              FROM Person.Contact 
              WHERE ContactID = @ContactID 
              SELECT d.AddressLine1, d.City, d.PostalCode 
              FROM HumanResources.Employee a 
              INNER JOIN HumanResources.EmployeeAddress b ON a.EmployeeID = b.EmployeeID 
              INNER JOIN Person.Contact c ON a.ContactID = c.ContactID 
              INNER JOIN Person.Address d ON b.AddressID = d.AddressID 
              WHERE c.ContactID = @ContactID 
              END 
              ELSE 
              BEGIN 
              RAISERROR ('No record found',10,1
              END

              這些都是非常簡單的例子,通過這些例子,希望能讓大家知道:創建一個SQL Server的存儲過程并不難。如果能夠在查詢窗口或者應用程序中得心應手的使用查詢語句,那么按照上面的例子,也就能夠非常容易的掌握存儲過程的使用。

             

            posted on 2008-10-28 17:06 isabc 閱讀(864) 評論(0)  編輯 收藏 引用 所屬分類: 數據庫

            廣告信息(免費廣告聯系)

            中文版MSDN:
            歡迎體驗

            九九久久自然熟的香蕉图片| 91超碰碰碰碰久久久久久综合| Xx性欧美肥妇精品久久久久久| 久久99精品久久久久久噜噜| 日韩一区二区三区视频久久| 一级做a爰片久久毛片毛片| 精品国产乱码久久久久软件| av无码久久久久不卡免费网站| 久久精品夜色噜噜亚洲A∨| 久久久久久国产精品美女| 99久久久国产精品免费无卡顿 | 伊人久久精品无码av一区| 久久婷婷五月综合97色一本一本| 97精品国产97久久久久久免费| 亚洲中文字幕伊人久久无码| AV色综合久久天堂AV色综合在| 热久久最新网站获取| 国产精品免费久久久久影院| 国产麻豆精品久久一二三| 久久精品国产色蜜蜜麻豆| 久久人人爽人人爽人人片AV麻豆| 蜜臀久久99精品久久久久久小说 | 久久伊人五月丁香狠狠色| 国内精品伊人久久久久| 人妻少妇久久中文字幕一区二区| 久久精品18| 久久久受www免费人成| 91精品国产91久久久久久青草| 久久精品国产清高在天天线| 中文字幕人妻色偷偷久久| 国产99久久久国产精品小说| 日韩十八禁一区二区久久| 亚洲精品97久久中文字幕无码| 国产香蕉97碰碰久久人人| 91久久九九无码成人网站| 亚洲国产精品久久久久婷婷软件| 久久久久久午夜成人影院| 久久久久成人精品无码中文字幕 | 久久综合九色综合久99| 精品熟女少妇aⅴ免费久久| 久久99精品久久久久久水蜜桃|