注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

sql大数据量插入的问题之二使用自定义表类型  

2013-01-07 18:46:10|  分类: NET(C#) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

sql大数据量插入的问题之二使用自定义表类型

前面的大数据量插入使用了BULK,这里再使用一个自定义表类型的方法,首先在数据库中创建自定义表类型:

CREATE TYPE [dbo].[DepartType] AS TABLE(

    [depart_id] [int] NULL,

    [company_sn] [char](32) NULL,

    [depart_name] [nvarchar](32) NULL,

    [parent_depart_id] [int] NULL,

    [depart_auth] [varchar](20) NULL,

    [depart_director] [varchar](20) NULL,

    [depart_function_id] [int] NULL,

    [depart_work_place_id] [int] NULL,

    [contact_phone] [char](16) NULL,

    [delete_time] [datetime] NULL,

    [create_time] [datetime] NULL,

    [update_time] [datetime] NULL,

    [memo] [nvarchar](30) NULL,

    [is_mine] [bit] NULL,

    [parent_depart_name] [nchar](32) NULL

)

如果创建成功的话,你可以在“你的数据库---可编程性---类型---用户自定义类型”下看到定义的表类型。然后再创建一个存储过程:

USE [YaoJieDB]

GO

 

/****** Object:  StoredProcedure [dbo].[DepartInsertData]    Script Date: 01/07/2013 18:35:01 ******/

SET ANSI_NULLS ON

GO

 

SET QUOTED_IDENTIFIER ON

GO

 

-- =============================================

-- Author:    <Author,,Name>

-- Create date: <Create Date,,>

-- Description:   <Description,,>

-- =============================================

CREATE PROCEDURE [dbo].[DepartInsertData]

    -- Add the parameters for the stored procedure here

    @TbData DepartType readonly

AS

BEGIN

    -- SET NOCOUNT ON added to prevent extra result sets from

    -- interfering with SELECT statements.

    SET NOCOUNT ON;

 

    -- Insert statements for procedure here

    insert into Department

    (

    [depart_id]  ,

    [company_sn]  ,

    [depart_name]  ,

    [parent_depart_id]  ,

    [depart_auth]  ,

    [depart_director]  ,

    [depart_function_id]  ,

    [depart_work_place_id]  ,

    [contact_phone]  ,

    [delete_time]  ,

    [create_time]  ,

    [update_time]  ,

    [memo]  ,

    [is_mine]  ,

    [parent_depart_name]

    )

    select * from @TbData

END

 

GO

这样就创建好了应用的基本环境,前台的使用方法仍然和上一个一样,创建一个内存的datatable变量,然后直接调用存储过程就可以了:

  //调用存储过程

 SqlParameter[] sqlparams = { new SqlParameter("@TbData", dtSave) };

 DbAccess.SQLSERVER.ExecuteProc("DepartInsertData", sqlparams);

 

不过这么应用因为是在CLR平台上使用的,所以对数据库的设计有一定的要求,具体大家可以看MSDN,另外,网上还有资料称最好将SqlParameter的参数设置成Structured,如果上文就是:

  SqlParameter  sqlparams = { new SqlParameter("@TbData", SqlDbType.Structured) };

另外,它还有一些限制:

用户定义表类型具有下列限制:

用户定义表类型不能用作表中的列或结构化用户定义类型中的字段。

基于用户定义表类型的别名类型

[NOT FOR REPLICATION] 选项是不允许的。

CHECK 约束要求保留计算列。

计算列的主键必须是 PERSISTED 和 NOT NULL。

无法对用户定义表类型创建非聚集索引,除非该索引是对用户定义表类型创建 PRIMARY KEY 或 UNIQUE 约束的结果。(SQL Server 使用索引强制实施任何 UNIQUE 或 PRIMARY KEY 约束。)

不能在用户定义表类型的定义中指定 DEFAULT 值。

在创建用户定义表类型定义后不能对其进行修改。

不能在用户定义表类型的计算列的定义中调用用户定义函数。

做技术要从点滴做起,不要好高骛远。

非有点滴无以成江海。重要的是,贵在坚持。

  评论这张
 
阅读(963)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017