這是一篇關於介紹SQLServer中表值型參數的文章,下面讓我們一起來學習一下吧。
表值型參數(Table-valued parameters)是SQL Server 2008中引入的一種新特性,它提供了一種內置的方式,讓客戶端應用可以只通過單獨的一條參化數SQL語句,就可以向SQL Server發送多行數據。
這一功能的基礎是SQL Server 2008中最新的用戶自定義表類型(User-Defined Table Types),它允許用戶將表的定義注冊為全局周知類型。注冊之後,這些表類型可以像本地變量一樣用於批處理中、以及存儲過程的函數體中,很像早期SQL Server版本中通用表變量的強類型化版本。但是,與通用表變量有所不同的是,用戶自定義表類型的變量可以作為參數在存儲過程和參數化TSQL中使用。
用戶自定義表類型的使用有許多限制:
一個用戶自定義表類型不允許用來定義表的列類型,也不能用來定義一個用戶自定義結構類型的字段。
不允許在一個用戶自定義表類型上創建一個非聚合索引,除非這個索引是基於此用戶自定義表類型創建的主鍵或唯一約束。
在用戶自定義表類型的定義中,不能指定缺省值。
一旦創建後,就不允許再對用戶自定義表類型的定義進行修改。
用戶自定義函數不能以用戶定義表類型中的計算列定義為參數來調用。
一個用戶自定義表類型不允許作為表值型參數來調用用戶自定義函數。
當用戶自定義表類型作為表值型參數時,還有更多限制,例如,在參數化語句或存儲過程中,它們是只讀的:
不允許更新多行表值型參數中的列值,也不允許插入或刪除行。如果想要修改那些已經傳入到存儲過程或參數化語句中的表值型參數中的數據,只能通過向臨時表或表變量中插入數據來實現。
在ADO.NET中,可以利用標准的SqlParameter類型來使用用戶自定義表類型:
TypeName參數必須設置為用戶自定義表類型的名稱,例如:dbo.PersonInfo
SqlDbType必須設置為SqldbType.Structured
Value參數的類型數據必須與用戶自定義表類型中的類型相匹配。System.Data.SqlClient中可以通過System.Data.DataTable或IList來支持表值型參數。此外,還可以通過System.Data.Common.DbDataReader及其派生類(如OracleDataReader)將多行數據轉為流,然後映射到表值型參數。
在表值型參數出現以前,開發者只能使用一些替代方案來模擬它的能力:
使用一連串的獨立參數來表示多列和多行數據的值。使用這一方法,可以被傳遞的數據總量受限於可用參數的個數。SQL Server的存儲過程最多可以使用2100個參數。在這種方法中,服務端邏輯必須將這些獨立的值組合到表變量中,或是臨時表中進行處理。
將多個數據值捆綁到帶限定符的字符串或是XML文檔中,然後再將文本值傳遞到一個存儲過程或語句中。這種方式要求存儲過程或語句中要有必要的數據結構驗證和數據松綁的邏輯。
為多行數據的修改創建一系列獨立的SQL語句,就像在一個SqlDataAdapter中調用Update方法時產生的那些一樣,這些更新可以被獨立地或是分組成批地提交到服務器。不過,盡管成批提交中含有多重語句,但這些語句在服務端都是被分開獨立執行的。
使用bcp實用程序或是使用SqlBulkCopy對象將多行數據載入一個表中,盡管這一技術效率很高,但它並不支持在服務端執行,除非數據是被載入到臨時表或是表變量中。
以上就是我們精品給大家帶來的關於介紹SQLServer中表值型參數的文章。