<thead id="xjx1f"></thead>
      <sub id="xjx1f"></sub>

        <address id="xjx1f"></address>

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

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