设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1369|回复: 0

sqlserver 用户定义表类型

[复制链接]

30

主题

220

金钱

355

积分

入门用户

发表于 2019-9-17 16:31:14 | 显示全部楼层 |阅读模式

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

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

需求:现在内存中有个Datatable,数据库中有张表【TempUser】,需要在内存中取出 Datatable和【TempUser】相同ID的TempUser的信息
实现:
1、新建表
  1. CREATE TABLE TempUser(
  2. ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
  3. NAME NVARCHAR(100),
  4. Age INT
  5. )

  6. INSERT    TempUser VALUES('a',1)
  7. INSERT    TempUser VALUES('b',2)
  8. INSERT    TempUser VALUES('c',3)
复制代码


2、新建【用户表类型】
  1. CREATE TYPE temp_20190915 AS TABLE
  2. (
  3.     ID INT
  4. )
复制代码


3、新建存储过程
  1. CREATE PROC proc_test_20190915(@temp_20190915 temp_20190915 readonly)
  2. AS
  3. BEGIN
  4. SELECT b.* FROM @temp_20190915 a JOIN TempUser b ON a.ID=b.IDEND
复制代码

注意事项:存储过程的参数类型是刚刚新建的【用户表类型】并且是只读的
此时在存储过程中我们可以把【用户表类型】当作一张正常表的去处理需要的数据(注意是只读)

4、内存中构建我们的Datatable
  1. var data = new DataTable();
  2.             data.Columns.Add("id", typeof(int));var row1 = data.NewRow();
  3.             row1["id"] = 1;
  4.             data.Rows.Add(row1);

  5.             var row2 = data.NewRow();
  6.             row2["id"] = 2;
  7.             data.Rows.Add(row2);
复制代码


5、调用存储过程
  1. var p = new System.Data.SqlClient.SqlParameter[1];
  2. p[0] = new System.Data.SqlClient.SqlParameter("@temp_20190915", data);

  3. 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.         }

  15. ExecProcDataSet
复制代码


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

总结:【用户 定义表类型】的方便之处就是可以将内存中Datatable很好的很数据库中的表结合
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表