sqlserver 用戶定義表類型


有時需要將內存中的表與數據庫中的表比較,比如Datatable中有100行數據,需要判斷在數據庫中是否存在,這個時候我們就可以使用sqlserver中的【用戶 定義表類型】

這里最最最重要的思路是把【用戶 定義表類型】當作一張虛擬的正常表去處理

 

 

 

需求:現在內存中有個Datatable,數據庫中有張表【TempUser】,需要在內存中取出 Datatable和【TempUser】相同ID的TempUser的信息

實現:

1、新建表

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)

2、新建【用戶表類型】

 

CREATE TYPE temp_20190915 AS TABLE 
(
    ID INT
)

 

3、新建存儲過程

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

注意事項:存儲過程的參數類型是剛剛新建的【用戶表類型】並且是只讀的

此時在存儲過程中我們可以把【用戶表類型】當作一張正常表的去處理需要的數據(注意是只讀)

4、內存中構建我們的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);

 

5、調用存儲過程

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         }
ExecProcDataSet

 

6、調試可以看到data就是我們需要的數據

 

總結:【用戶 定義表類型】的方便之處就是可以將內存中Datatable很好的很數據庫中的表結合

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM