SQL Server 2008:傳遞表值引數

iSQlServer發表於2009-02-24
許多人一直希望能夠實現把表格變數傳遞到儲存過程中,如果變數可以被宣告,那麼它就應該能夠被傳遞。而最新的SQL Server 2008則有這項功能!想知道如何才能把表格變數(包括內含的資料)傳遞到儲存過程和功能中去嗎?

  為什麼要傳遞表值引數?

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

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

  如何傳遞表格引數?

  以銷售為例,首先建立一個 my SalesHistory表格,裡面包含了產品銷售的資訊。寫以下指令碼就可以在資料庫裡建立你選擇的表格:

  IF OBJECT_ID('SalesHistory')>0
  DROP TABLE SalesHistory;
  GO
  CREATE TABLE [dbo].[SalesHistory]
  (
  [SaleID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
  [Product] [varchar](10) NULL,
  [SaleDate] [datetime] NULL,
  [SalePrice] [money] NULL
  )
  GO

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

  CREATE TYPE SalesHistoryTableType AS TABLE
  (
  [Product] [varchar](10) NULL,
  [SaleDate] [datetime] NULL,
  [SalePrice] [money] NULL
  )
  GO

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

  SELECT * FROM sys.table_types

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

  CREATE PROCEDURE usp_InsertBigScreenProducts
  (
  @TableVariable SalesHistoryTableType READONLY
  )
  AS
  BEGIN
  INSERT INTO SalesHistory
  (
  Product, SaleDate, SalePrice
  )
  SELECT
  Product, SaleDate, SalePrice
  FROM
  @TableVariable
  WHERE
  Product = 'BigScreen'
  END
  GO

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-557588/,如需轉載,請註明出處,否則將追究法律責任。

相關文章