欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

sqlserver 用户定义表类型

程序员文章站 2022-05-18 21:13:53
有时需要将内存中的表与数据库中的表比较,比如Datatable中有100行数据,需要判断在数据库中是否存在,这个时候我们就可以使用sqlserver中的【用户 定义表类型】 这里最最最重要的思路是把【用户 定义表类型】当作一张虚拟的正常表去处理 需求:现在内存中有个Datatable,数据库中有张表 ......

有时需要将内存中的表与数据库中的表比较,比如datatable中有100行数据,需要判断在数据库中是否存在,这个时候我们就可以使用sqlserver中的【用户 定义表类型】

这里最最最重要的思路是把【用户 定义表类型】当作一张虚拟的正常表去处理

 

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         }

 

6、调试可以看到data就是我们需要的数据

 

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