表值類型是在sql server 2008中新加入的功能,我個人覺得確實很有用,之前從沒用過,自從來到現在的公司后學到很多東西,所以和大家分享一下。
------建表值類型語法--------------------------
CREATE TYPE tpTest AS TABLE(
name NVARCHAR(50) NULL,
Age int NULL,
[Address] NVARCHAR(200) NULL
)
--------最普通的用法
DECLARE @table dbo.tpTest
---------插入
INSERT INTO @table(name,age,address)
SELECT '小王',43,'清河'
---------查詢
SELECT * FROM @table
--------------------------------------------------------我是華麗的分割線------------------------------------------------------------------------
還有一種用法就是C#調用存儲過程時使用,這種方法大量用于導入之類的功能實現。
------建表--------------------------
CREATE TABLE TBTest (
id INT IDENTITY(1,1) PRIMARY KEY,
name NVARCHAR(50) NULL,
Age int NULL,
[Address] NVARCHAR(200) NULL
)
go
------建存儲過程--------------------------
CREATE PROCEDURE sp_Test_insert
@execelDT tpTest READONLY
AS
BEGIN
-------讀取表類型的值并插入到數據表中
INSERT INTO dbo.TBTest( name, Age, Address )
SELECT name,Age,Address from @execelDT
end
------------------------------------------------------C#后臺代碼-------------------------------------------------------------------
static void Main(string[] args)
{
string connectionString = "Server=.;initial catalog=Test;user id=sa;password=sa;Connect Timeout=30";
SqlConnection connectionObj = new SqlConnection(connectionString); //建立連接對象
SqlCommand sqlcom =new SqlCommand("sp_Test_insert",connectionObj);
DataTable dt = new DataTable();
dt.Columns.Add("name",typeof(string));
dt.Columns.Add("age", typeof(int));
dt.Columns.Add("Address", typeof(string));
DataRow dr = dt.NewRow();
dr["name"] = "張三";
dr["age"] = 22;
dr["Address"] = "河北";
dt.Rows.Add(dr);
DataRow dr2 = dt.NewRow();
dr2["name"] = "李四";
dr2["age"] = 33;
dr2["Address"] = "北京";
dt.Rows.Add(dr2);
try
{
connectionObj.Open(); //連接打開
/*創建SqlCommand等進行數據庫操作*/
sqlcom.CommandType = CommandType.StoredProcedure;
SqlParameter sp = new SqlParameter("@execelDT", SqlDbType.Structured);//表值類型要用Structured
sp.Value = dt;
sqlcom.Parameters.Add(sp);
int index=sqlcom.ExecuteNonQuery();
if (index>0)
{
Console.WriteLine("插入成功!");
}
connectionObj.Close();//連接關閉
}
catch (Exception ex)
{
throw;
}
Console.ReadKey();
}
--------------------------------------------總結---------------------------------------------------
表類型最大的方便是可以由DataTable直接以變量形式傳入數據庫。
簡化了操作大量數據到數據時復雜的分布設計。
注意:表類型中的列名稱和DataTable中的列名稱可以不一致(但是不建議這樣做),但是列的順序和變量類別必須一致。
用sql server profiler監視請求會發現,他只是將dataTable中的數據轉換成insert語句插入到表類型中,所以與名稱無關。
文章列表