sqlserver 用户定义表类型

有时须要将内存中的表与数据库中的表比较,好比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         }
ExecProcDataSet

 

六、调试能够看到data就是咱们须要的数据

 

总结:【用户 定义表类型】的方便之处就是能够将内存中Datatable很好的很数据库中的表结合

相关文章
相关标签/搜索