sql.表值类型

表值类型是在sql server 2008中新加入的功能,我个人觉得确实很有用,之前从没用过,自从来到现在的公司后学到很多东西,所以和大家分享一下。

------建表值类型语法--------------------------

CREATE TYPE tpTest  AS TABLE(

name NVARCHAR(50) NULL,

Age int NULL,

[Address] NVARCHAR(200) NULL

)

 

--------最普通的用法

DECLARE @table  dbo.tpTest

---------插入

INSERT INTO @table(name,age,address)

SELECT '小王',43,'清河'

---------查询

SELECT * FROM @table

 

--------------------------------------------------------我是华丽的分割线------------------------------------------------------------------------

还有一种用法就是C#调用存储过程时使用,这种方法大量用于导入之类的功能实现。


 ------建表--------------------------

CREATE TABLE TBTest (

id INT IDENTITY(1,1) PRIMARY KEY,

name NVARCHAR(50) NULL,

Age int NULL,

[Address] NVARCHAR(200) NULL

)

go

 

------建存储过程--------------------------

CREATE PROCEDURE sp_Test_insert 

@execelDT tpTest READONLY  

AS 

BEGIN

 

-------读取表类型的值并插入到数据表中

INSERT INTO dbo.TBTest(  name, Age, Address )

SELECT name,Age,Address from @execelDT

 

end

 

 

------------------------------------------------------C#后台代码-------------------------------------------------------------------

static void Main(string[] args)

        {

            string connectionString = "Server=.;initial catalog=Test;user id=sa;password=sa;Connect Timeout=30";

            SqlConnection connectionObj = new SqlConnection(connectionString);  //建立连接对象

            SqlCommand sqlcom =new SqlCommand("sp_Test_insert",connectionObj);

 

            DataTable dt = new DataTable();

            dt.Columns.Add("name",typeof(string));

            dt.Columns.Add("age", typeof(int));

            dt.Columns.Add("Address", typeof(string));

 

            DataRow dr = dt.NewRow();

            dr["name"] = "张三";

            dr["age"] = 22;

            dr["Address"] = "河北";

            dt.Rows.Add(dr);

            DataRow dr2 = dt.NewRow();

            dr2["name"] = "李四";

            dr2["age"] = 33;

            dr2["Address"] = "北京";

            dt.Rows.Add(dr2);

            try

            {

                connectionObj.Open(); //连接打开

                /*创建SqlCommand等进行数据库操作*/

                sqlcom.CommandType = CommandType.StoredProcedure;

 

                SqlParameter sp = new SqlParameter("@execelDT", SqlDbType.Structured);//表值类型要用Structured

                sp.Value = dt;

                sqlcom.Parameters.Add(sp); 

                int index=sqlcom.ExecuteNonQuery();

                if (index>0)

                {

                    Console.WriteLine("插入成功!");

                    

                }

                connectionObj.Close();//连接关闭

            }

            catch (Exception ex)

            {

                

                throw;

            }

            Console.ReadKey();

        }

 

--------------------------------------------总结---------------------------------------------------

表类型最大的方便是可以由DataTable直接以变量形式传入数据库。

简化了操作大量数据到数据时复杂的分布设计。

 

注意:表类型中的列名称和DataTable中的列名称可以不一致(但是不建议这样做),但是列的顺序和变量类别必须一致。

用sql server profiler监视请求会发现,他只是将dataTable中的数据转换成insert语句插入到表类型中,所以与名称无关。

 

 

转载于:https://www.cnblogs.com/stjwy/p/5922353.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值