sql server中批量插入与更新两种解决方案分享(存储过程)

2014-02-11  来源:本站原创  分类:MsSql  人气:2 

对于sql 来说操作集合类型(一行一行)是比较麻烦的一件事,而一般业务逻辑复杂的系统或项目都会涉及到集合遍历的问题,通常一些人就想到用游标,这里我列出了两种方案,供大家参考

1.游标方式

DECLARE @Data NVARCHAR(max)
SET @Data='1,tanw,2,keenboy' --Id,Name
DECLARE @dataItem NVARCHAR(100)
DECLARE data_cursor CURSOR FOR (SELECT * FROM split(@Data,';'))
OPEN data_cursor
FETCH NEXT FROM data_cursor INTO @dataItem
WHILE @@FETCH_STATUS=0
BEGIN
DECLARE @Id INT
DECLARE @Name NVARCHAR(50) 

DECLARE dataItem_cursor CURSOR FOR (SELECT * FROM split(@dataItem,','))
OPEN dataItem_cursor
FETCH NEXT FROM dataItem_cursor INTO @Id
FETCH NEXT FROM dataItem_cursor INTO @Name
CLOSE dataItem_cursor
DEALLOCATE dataItem_cursor 

/*
在这里做逻辑处理,插入或更新操作 ...
www.jb51.net
*/
END
CLOSE data_cursor
DEALLOCATE data_cursor

2.While方式

复制代码 代码如下:

DECLARE @Data NVARCHAR(max)
SET @Data='tanw,keenboy' --Id,Name 

DECLARE @Temp TABLE
(
Id INT IDENTITY(1,1),
Name NVARCHAR(50)
)
DECLARE @Id INT
DECLARE @Name NVARCHAR(50)
DECLARE @Results NVARCHAR(MAX) SET @Results=''
INSERT INTO @Temp SELECT (SELECT * FROM split(@Data,';')) 

WHILE EXISTS(SELECT * FROM @Temp)
BEGIN
SELECT TOP 1 @Id=Id,@Name=Name from @Temp
DELETE FROM @Temp where [id] = @Id
SET @[email protected][email protected]+','
www.jb51.net
/*
在这里做逻辑处理,插入或更新操作 ...
*/
END
SELECT @Results

如果是简单单表批量插入操作的,上面方法大可不必要

作者 keenboy

相关文章
  • sql server中批量插入与更新两种解决方案分享(存储过程) 2014-02-11

    对于sql 来说操作集合类型(一行一行)是比较麻烦的一件事,而一般业务逻辑复杂的系统或项目都会涉及到集合遍历的问题,通常一些人就想到用游标,这里我列出了两种方案,供大家参考 1.游标方式 DECLARE @Data NVARCHAR(max) SET @Data='1,tanw,2,keenboy' --Id,Name DECLARE @dataItem NVARCHAR(100) DECLARE data_cursor CURSOR FOR (SELECT * FROM split(@Data

  • sql server中批量插入与更新两种解决方案分享(asp.net) 2013-10-25

    xml和表值函数的相对复杂些这里简单贴一下bcp和SqlDataAdapter进行批量跟新插入方法,未经整理还望见谅 若只是需要大批量插入数据使用bcp是最好的,若同时需要插入.删除.更新建议使用SqlDataAdapter我测试过有很高的效率,一般情况下这两种就满足需求了 bcp方式 /// <summary> /// 大批量插入数据(2000每批次) /// 已采用整体事物控制 /// </summary> /// <param name="connString

  • MSSQL批量替换语句 在SQL SERVER中批量替换字符串的方法 2014-03-11

    在SQL SERVER中批量替换字符串的方法 方法一:(这种是最常用的,因为很多大段的内容都使用text ntext等数据类型,而我们通常也是替换里面的内容) varchar和nvarchar类型是支持replace,所以如果你的text不超过8000可以先转换成前面两种类型再使用replace 替换 text ntext 数据类型字段的语句 update 表名 set 字段名=replace(cast(与前面一样的字段名 as varchar(8000)) ,'原本内容','想要替换成什么')

  • PHP中实现MySQL嵌套事务的两种解决方案 2014-10-16

    这篇文章主要介绍了PHP中实现MySQL嵌套事务的两种解决方案,本文分析了doctrine和laravel的实现方式,并提取出来分析和总结,需要的朋友可以参考下 一.问题起源 在MySQL的官方文档中有明确的说明不支持嵌套事务: Transactions cannot be nested. This is a consequence of the implicit commit performed for any current transaction when you issue a STAR

  • SQLServer 批量插入数据的两种方法 2013-10-26

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters). 运行下面的脚本,建立测试数据库和表值参数. --Create DataBase create database BulkTestDB; go use BulkTestDB; go --Create Table Cr

  • Json返回时间的格式中出现乱码问题的两种解决方案 2013-12-27

    使用Json返回数据的时候时间的格式一般都会变了,变成我们不认识的一些字符,那么当我们遇到这些问题的时候我们该怎么解决呢,今天我就来小说一下这个的解决方法 前言:这段时间一直没有写博客,首先是我正在实现权限系列的绝色和操作的实现,因为这些东西在前面我们都已经说过了,所以我们就不重复的说这些了,那么我们知道,在我们使用Json返回数据的时候时间的格式一般都会变了,变成我们不认识的一些字符,那么当我们遇到这些问题的时候我们该怎么解决呢,今天我就来小说一下这个的解决方法. .发现问题 (1).正如我们

  • sql server中如何连接表更新数据 2013-09-06

    假设a,b两表有外键关联,想要从b表中取出相应字段的值更新a表字段,可以有如下几种写法: 1.update a set a.name=b.name from a,b where a.id=b.id 2.update a inner join b on a.id=b.id set a.name=b.name where - 3.update table1 set a.name = b.name from table1 a inner join table2 b on a.id =b.id wher

  • T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他 2012-08-20

    简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能.但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索引的概念,需要了解大量原理性的知识,包括B树,堆,数据库页,区,填充因子,碎片,文件组等等一系列相关知识,这些知识写一本小书也不为过.所以本文并不会深入讨论这些主题. 索引是什么 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 精简来说,索引是一种结构.

  • SQL Server数据库中批量导入数据的四种方法总结 2014-03-04

    数据导入一直是项目人员比较头疼的问题.其实,在SQL Server中集成了很多成批导入数据的方法,接下来为大家介绍下常用的四种批量导入数据的方法,感兴趣的各位可以参考下哈 在软件项目实施的时候,数据导入一直是项目人员比较头疼的问题.其实,在SQL Server中集成了很多成批导入数据的方法.有些项目实施顾问头疼的问题,在我们数据库管理员眼中,是小菜一碟.现在的重点就是,如何让用户了解这些方法,让数据导入变得轻松一些. 第一:使用Select Into语句 若企业数据库都采用的是SQL Serve

  • 基于SQL Server中如何比较两个表的各组数据 图解说明 2014-04-09

    本篇文章小编为大家介绍,基于SQL Server中如何比较两个表的各组数据 图解说明.需要的朋友参考下 开始 前一阵子,在项目中碰到这样一个SQL查询需求,有两个相同结构的表(table_left & table_right),如下: 图1. 检查表table_left的各组(groupId),是否在表table_right中存在有一组(groupId)数据(data)与它的数据(data)完全相等. 如图1. 可以看出表table_left和table_right存在两组数据完整相等: 图2.

  • 十步优化SQL Server中的数据访问 2012-09-18

    [IT168 技术文档]故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有 些表甚至有上千万行数据,测试团队开始在生产数据库上测试,发现订单提交过程需要花5分钟时间,但在网站上

  • 如何捕获和记录SQL Server中发生的死锁 2014-02-27

    本篇文章是对如何捕获和记录SQL Server中发生的死锁进行了详细的分析介绍,需要的朋友参考下 方法一:利用SQL Server代理(Alert+Job)具体步骤如下: 1.首先使用下面的命令,将有关的跟踪标志启用.SQL code DBCC TRACEON (3605,1204,1222,-1) 说明:3605 将DBCC的结果输出到错误日志. 1204 返回参与死锁的锁的资源和类型,以及受影响的当前命令. 1222 返回参与死锁的锁的资源和类型,以及使用了不符合任何 XSD 架构的 XML

  • 理解Sql Server中的聚集索引 2014-03-29

    这篇文章主要介绍了理解Sql Server中的聚集索引,本文讲解了聚集索引的作用.聚集索引的运行原理等内容,需要的朋友可以参考下 说到聚集索引,我想每个码农都明白,但是也有很多像我这样的猥程序员,只能用死记硬背来解决这个问题,什么表中只能建一个聚集索引,然后又扯到了目录查找来帮助读者记忆....问题就在这里,我们不是学文科,,,不需要去死记硬背,,,我们需要的就是能看到在眼里面的真实东西.....我们都喜欢聚集索引,因为它能够把无序的堆表记录变成有序,还玩起了B树...这样就把复杂度从N降低到了

  • SQL Server中的Forwarded Record计数器影响IO性能的解决方法 2014-04-03

    这篇文章主要介绍了SQL Server中的Forwarded Record计数器影响IO性能的解决方法,需要的朋友可以参考下 一.简介 最近在一个客户那里注意到一个计数器很高(Forwarded Records/Sec),伴随着间歇性的磁盘等待队列的波动.本篇文章分享什么是forwarded record,并从原理上谈一谈为什么Forwarded record会造成额外的IO. 二.存放原理 在SQL Server中,当数据是以堆的形式存放时,数据是无序的,所有非聚集索引的指针存放指向物理地址的

  • SQL Server中的数据复制到的Access中的函数 2014-04-20

    SQL Server中的数据复制到的Access中,表的结构相同 不要提用openrowset,因为Access文件和SQL Server不在一台机器上 初步的想法是用两个recordset,一个从SQL取数据,一个往Access里面插入数据 因为表的字段比较多,所以只好用一个循环 while (!m_pRecordset_sql->adoEOF) { m_pRecordset_access->AddNew(); for (int i = 0; i < m_pRecordset_sql-

  • Sql Server中的非聚集索引详细介 2014-06-05

    这篇文章主要介绍了Sql Server中的非聚集索引详细介,本文讲解了非聚集索引为什么能提速这么快.什么是RID.非聚集索引的运行原理等内容,需要的朋友可以参考下 非聚集索引,这个是大家都非常熟悉的一个东西,有时候我们由于业务原因,sql写的非常复杂,需要join很多张表,然后就泪流满面了...这时候就有DBA或者资深的开发给你看这个猥琐的sql,通过执行计划一分析...或许就看出了不该有的表扫描...万恶之源...然后给你在关键的字段加上非聚集索引后...才发现提速比阿斯顿马丁还要快...那么

  • 浅析Sql server锁,独占锁,共享锁,更新锁,乐观锁,悲观锁 2014-06-06

    以下是对Sql server锁,独占锁,共享锁,更新锁,乐观锁,悲观锁进行了详细的介绍,需要的朋友可以过来参考下 锁有两种分类方法.(1) 从数据库系统的角度来看 锁分为以下三种类型: •独占锁(Exclusive Lock)独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受.执行数据更新命令,即INSERT. UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁.但当对象上有其它锁存在时,无法对其加独占锁.独占锁一直到事务结束才能被释放. •共

  • Oracle 实现类似SQL Server中自增字段的一个办法 2014-09-16

    由于Oracle中没有类似SQL Server中的自增字段,所以我们如果想要通过设定类似ID性质的唯一列的话,需要借助Oracle的sequence,先建立一个序列,然后在每次插入数据的时候,通过前触发器来更新ID值,并将序列的序号加1,这样的迂回方式来实现. 相关代码如下: 1. 创建sequence: CREATE SEQUENCE SEQU_DATA_DATAINFO INCREMENT BY 1 START WITH 1 NOCYCLE NOCACHE NOORDER; 2. 创建触发器

  • 深入理解Sql Server中的表扫描 2014-12-08

    这篇文章主要介绍了深入理解Sql Server中的表扫描,本文讲解了表扫描的相关知识.表扫描的运行原理等内容,需要的朋友可以参考下 很久以前我们在写sql的时候,最怕的一件事情就是sql莫名奇妙的超级慢,慢的是撸一管子回来,那个小球还在一直转...这个着急也只有当事人才明白,后来听说有个什么"评估执行计划",后来的后来才明白应该避免表扫描... 一:表扫描 1.现象 "表扫描"听起来很简单,不就是一行一行的扫嘛,你要说"执行计划"的话,我也会玩,

  • 在SQL Server中迁移数据的几种方法 2015-02-19

    这篇文章主要介绍了在SQL Server中迁移数据的几种方法,本文给出了6种方法来移动.迁移SQL Server中的数据,需要的朋友可以参考下 1.通过工具"DTS"的设计器进行导入或者导出 DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一般不 多,如果只是进行SQL Server数据库中部分表的移动,用这种方法最好,当然,也可以进行全部表的移动.在SQL Server Enterprise Manager中,展开服务器左边的+,选择数据库,右击,选择All