T-SQL——關於表型別

shanzm發表於2024-09-10

目錄
  • 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();
 }

相關文章