Mssql數據庫教程之--SQL Server 2008:傳遞表值參數_Mssql數據庫教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:淺談選擇SQL Server恢復模型確保正確備份
      問題 在管理SQL Server時首先要做的一件事是建立一個合適的備份計劃以便將失敗事件中任何數據的丟失可能最小化。建立備份計劃之后當然要做些數據庫配置,這些配置是建立以確保你可

      為什么要傳遞表值參數?

      用戶常常會碰到許多需要把數值容器而非單個數值放到存儲過程里的情況。對于大部分的編程語言而言,把容器數據結構傳遞到例程里或傳遞出來是很常見而且很必要的功能。TSQL也不例外。

      SQL Server 2000通過OPENXML可以實現這個功能,用戶可以把數據存儲為VARCHAR數據類型然后進行傳遞。到了SQL Server 2005,隨著 XML數據類型以及XQuery的出現,這個功能變得容易一點。但用戶仍然需要對XML數據進行組建和粉碎才能夠使用它,因此這個功能使用起來并不簡單。SQL Server 2008則能夠把表值數據類型傳遞到存儲過程和功能中,從而大大地簡化了編程的工作,因為程序員無需再花心思去組建和解析XML數據了。該功能還可以讓客戶方開發員傳遞客戶方數據表格到數據庫中。

      如何傳遞表格參數?

      以銷售為例,首先建立一個 my SalesHistory表格,里面包含了產品銷售的信息。寫以下腳本就可以在數據庫里創建你選擇的表格:

      以下為引用的內容:

        IFOBJECT_ID('SalesHistory')>0
        DROPTABLESalesHistory;
        GO
        CREATETABLE[dbo].[SalesHistory]
        (
        [SaleID][int]IDENTITY(1,1)NOTNULLPRIMARYKEY,
        [Product][varchar](10)NULL,
        [SaleDate][datetime]NULL,
        [SalePrice][money]NULL
        )
        GO

      建立表值參數第一步是創建確切的表格類型,這一步非常重要,因為這樣你就可以在數據庫引擎里定義表格的結構,讓你可以在需要的時候在過程代碼里使用該表格。下面的代碼創建 SalesHistoryTableType 表格類型定義:

      以下為引用的內容:

       CREATETYPESalesHistoryTableTypeASTABLE
        (
        [Product][varchar](10)NULL,
        [SaleDate][datetime]NULL,
        [SalePrice][money]NULL
        )
        GO

      如果想要查看系統里其他類型的表格類型定義,你可以執行下面這個查詢命令,查看系統目錄:

        SELECT * FROM sys.table_types

      我們需要定義用來處理表值參數的存儲過程。下面這個程序能夠接受指定SalesHistoryTableType類型的表值參數,并加載到SalesHistory中,表值參數在Product列中的值為“BigScreen”:

      以下為引用的內容:

        CREATEPROCEDUREusp_InsertBigScreenProducts
        (
        @TableVariableSalesHistoryTableTypeREADONLY
        )
        AS
        BEGIN
        INSERTINTOSalesHistory
        (
        Product,SaleDate,SalePrice
        )
        SELECT
        Product,SaleDate,SalePrice
        FROM
        @TableVariable
        WHERE
        Product='BigScreen'
        END
        GO

      傳遞的表格變量還可以用做任何其他表格的查詢數據。

      傳遞表值參數功能的局限性

      在傳遞表值變量到程序中時必須使用 READONLY從句。表格變量里的數據不能做修改——除了修改你可以把數據用于任何其他的操作。另外,你也不能把表格變量用做OUTPUT參數——只能用做input參數。

      使用自己的新表格變量類型

      首先,要聲明一個變量類型SalesHistoryTableType,不需要再一次定義表格結構,因為在創建這個表格類型的時候已經定義過了。

      以下為引用的內容:

        DECLARE@DataTableASSalesHistoryTableType
        Thefollowingscriptadds1,000recordsintomy@DataTabletablevariable:
        DECLARE@iSMALLINT
        SET@i=1
        WHILE(@i<=1000)
        BEGIN
        INSERTINTO@DataTable(Product,SaleDate,SalePrice)
        VALUES('Computer',DATEADD(mm,@i,'3/11/1919'),DATEPART(ms,GETDATE()) (@i 57))
        INSERTINTO@DataTable(Product,SaleDate,SalePrice)
        VALUES('BigScreen',DATEADD(mm,@i,'3/11/1927'),DATEPART(ms,GETDATE()) (@i 13))
        INSERTINTO@DataTable(Product,SaleDate,SalePrice)
        VALUES('PoolTable',DATEADD(mm,@i,'3/11/1908'),DATEPART(ms,GETDATE()) (@i 29))
        SET@i=@i 1
        END


      只要把數據加載到表格變量里,就可以把結構傳遞到存儲過程中。

      注意:當表格變量作為參數傳遞后,表格會在存儲在tempdb系統數據庫里,而不是傳遞整個數據集在內存里。因為這樣保證高效處理大批量數據。所有服務器方的表格變量參數傳遞都是通過使用reference調用tempdb中的表格。

      以下為引用的內容:

        EXECUTEusp_InsertBigScreenProducts
        @TableVariable=@DataTable

      想要查詢程序是否和預想效果一樣,可以執行以下查詢來看記錄是否已經插入到 SalesHistory表格中:

      以下為引用的內容:

        SELECT * FROM SalesHistory

      總結:

      雖然SQL Server 2008的參數傳遞功能的使用還有一些小小的局限性,比如不能修改參數中的數據和把變量用于output,但是它大大提高了程序性能,它可以減少server往返旅程數、利用表格限制并擴展編程在數據庫引擎中的功能。

      分享:關于避免在 PL/SQL 中使用嵌套游標查詢
      考慮下面的 PL/SQL 代碼,這段代碼生成一個 XML 格式的矩陣樣式的報表: 以下為引用的內容:   declare   l_count   intege

      來源:模板無憂//所屬分類:Mssql數據庫教程/更新時間:2009-09-02
      相關Mssql數據庫教程