目錄
- 0. 說明
- 1. 最簡示例
- 2. 使用場景
- 3. 關於C#中呼叫表值引數的儲存過程
0. 說明
- SQL Server 2008中引入了對錶型別的支援。透過建立表型別,可以把表的定義儲存到資料庫中,以後在定義表變數、儲存過程和使用者定義的輸入引數時,可以將表型別作為表的定義而重用。
1. 最簡示例
--判斷自定義表是否存在
IF TYPE_ID('CustomerTableType') IS NOT NULL
--刪除使用者自定義的表型別
EXEC SP_DROPTYPE CustomerTableType
----建立表型別
CREATE TYPE dbo.CustomerTableType AS TABLE(Id INT NOT NULL, Name NVARCHAR(10) NULL, Age INT NULL);
----使用表型別建立一個表變數
DECLARE @myTable CustomerTableType;
INSERT INTO @myTable(Id, Name, Age)VALUES(1, 'Tom', 30);
SELECT * FROM @myTable;
2. 使用場景
如何將一個表值作為儲存過程的引數?
在2008之前如果我們想要將表作為輸入引數傳遞給SQL Server儲存過程使比較困難的,可能需要很多的邏輯處理將這些表資料作為字串或者XML傳入。
在2008中提供了表值引數。使用表值引數,可以不必建立臨時表或許多引數,即可向 Transact-SQL 語句或例程(如儲存過程或函式)傳送多行資料,這樣可以省去很多自定義的程式碼。這樣的操作對於儲存過程內基於表函式的操作變得非常容易操作。
注意,表值引數是使用使用者定義的表型別來宣告的。所以使用之前要先定義表型別。
實現方式可以有多種,
常見的場景:
- 參考:https://blog.csdn.net/yenange/article/details/121261115
--判斷自定義表是否存在
IF TYPE_ID('CustomerTableType') IS NULL
----建立表型別
CREATE TYPE dbo.CustomerTableType AS TABLE(Id INT NOT NULL, Name NVARCHAR(10) NULL, Age INT NULL);
--建立一個儲存過程,使用自定義表型別作為引數型別
CREATE PROC proc_TestTableType
@c CustomerTableType READONLY
AS BEGIN
--業務邏輯
END;
3. 關於C#中呼叫表值引數的儲存過程
using (SqlCommand cmd = new SqlCommand("儲存過程名", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter parameter = new SqlParameter("@ProcParam", SqlDbType.Structured); //注意引數型別是:SqlDbType.Structured
parameter.TypeName = "dbo.CustomerTableType"; //必須指定自定義的表型別名
parameter.Value = dataTable; //賦值,引數就是C#中的Datatable物件
cmd.Parameters.Add(parameter);
cmd.ExecuteNonQuery();
}