文章出處

表值類型是在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語句插入到表類型中,所以與名稱無關。

 

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()