有時須要將內存中的表與數據庫中的表比較,好比Datatable中有100行數據,須要判斷在數據庫中是否存在,這個時候咱們就能夠使用sqlserver中的【用戶 定義表類型】sql
這裏最最最重要的思路是把【用戶 定義表類型】看成一張虛擬的正常表去處理數據庫
需求:如今內存中有個Datatable,數據庫中有張表【TempUser】,須要在內存中取出 Datatable和【TempUser】相同ID的TempUser的信息ide
實現:sqlserver
一、新建表spa
CREATE TABLE TempUser( ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, NAME NVARCHAR(100), Age INT ) INSERT TempUser VALUES('a',1) INSERT TempUser VALUES('b',2) INSERT TempUser VALUES('c',3)
二、新建【用戶表類型】調試
CREATE TYPE temp_20190915 AS TABLE ( ID INT )
三、新建存儲過程code
CREATE PROC proc_test_20190915(@temp_20190915 temp_20190915 readonly) AS BEGIN SELECT b.* FROM @temp_20190915 a JOIN TempUser b ON a.ID=b.IDEND
注意事項:存儲過程的參數類型是剛剛新建的【用戶表類型】而且是隻讀的server
此時在存儲過程當中咱們能夠把【用戶表類型】看成一張正常表的去處理須要的數據(注意是隻讀)blog
四、內存中構建咱們的Datatable內存
var data = new DataTable(); data.Columns.Add("id", typeof(int));var row1 = data.NewRow(); row1["id"] = 1; data.Rows.Add(row1); var row2 = data.NewRow(); row2["id"] = 2; data.Rows.Add(row2);
五、調用存儲過程
var p = new System.Data.SqlClient.SqlParameter[1]; p[0] = new System.Data.SqlClient.SqlParameter("@temp_20190915", data); var data= Comm.Tool.DbHelper.ExecProcDataSet("proc_test_20190915", p, "數據庫鏈接").Tables[0];
1 public static DataSet ExecProcDataSet(string procName, SqlParameter[] parameters, string connStr) 2 { 3 using (SqlConnection conn = new SqlConnection(connStr)) 4 { 5 conn.Open(); 6 SqlCommand cmd = GetSqlCommand(conn, procName, CommandType.StoredProcedure, parameters); 7 cmd.CommandTimeout = 0; 8 SqlDataAdapter da = new SqlDataAdapter(cmd); 9 DataSet ds = new DataSet(); 10 da.Fill(ds); 11 cmd.Dispose(); 12 return ds; 13 } 14 }
六、調試能夠看到data就是咱們須要的數據
總結:【用戶 定義表類型】的方便之處就是能夠將內存中Datatable很好的很數據庫中的表結合