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很好的很数据库中的表结合

        相关文章
        相关标签/搜索
        黄大仙选黄大仙一码一肖