sqlserver存储过程批量插入数据
在系统中经常会遇到向数据库中批量插入数据情况,存储过程中没有数组,只有通过字符串分割循环插入,下面是一个本人研究的一个例子:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
create proc [dbo].[Proc_TestBatchMainDetailIns]@mainName nvarchar(50),@detailNameStr nvarchar(max),@detailAgeStr nvarchar(max),@detailRowCount int=1,@tmpFlag int=1,@newMainId int=0asbegininsert into TestProBatch_Main(MainName) values(@mainName) select @newMainId=@@IDENTITYset @detailRowCount=len(@detailNameStr)-len(replace(@detailNameStr,'|',''))+1set @detailNameStr=@detailNameStr+'|'set @detailAgeStr=@detailAgeStr+'|'while(@tmpFlag<=@detailRowCount)begininsert into TestProcBatch_Detail(MainId,DetailName,DetailAge) values(@newMainId,dbo.F_RtnStrBySplitIndex(@detailNameStr,@tmpFlag),dbo.F_RtnStrBySplitIndex(@detailAgeStr,@tmpFlag))set @tmpFlag=@tmpFlag+1endend |
这个例子是插入一条主单信息和对应的多条子信息,下面是两张表
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
--主表CREATE TABLE [dbo].[TestProBatch_Main]( [ID] [int] IDENTITY(1,1) NOT NULL primary key, [MainName] [nvarchar](50) NOT NULL, [CreateTime] [datetime] NOT NULL );--子表CREATE TABLE [dbo].[TestProcBatch_Detail]( [ID] [int] IDENTITY(1,1) NOT NULL primary key, [MainId] [int] NOT NULL, [DetailName] [nvarchar](50) NOT NULL, [DetailAge] [int] NOT NULL, [CreateTime] [datetime] NOT NULL ); |
dbo.F_RtnStrBySplitIndex是自定义的标量值函数,用于返回第几个分割符对应的字符串,如dbo.F_RtnStrBySplitIndex('jack|lilei|tom|nike',3) 则返回tom
下面是函数的创建
|
1
2
3
4
5
6
7
8
9
10
11
12
|
create function [dbo].[F_RtnStrBySplitIndex](@procStr nvarchar(max),@splitStrIdx int)returns nvarchar(250)asbegindeclare @rtnStr nvarchar(250)declare @currentSplitIdx intdeclare @preSplitIdx intset @currentSplitIdx=dbo.F_RtnSomeCharIdxInStrByNo('|',@procStr,@splitStrIdx)set @preSplitIdx=dbo.F_RtnSomeCharIdxInStrByNo('|',@procStr,@splitStrIdx-1)set @rtnStr=SUBSTRING(@procStr,@preSplitIdx+1,@currentSplitIdx-@preSplitIdx-1)return @rtnStrend |
这个函数当中又用到了另一个函数dbo.F_RtnSomeCharIdxInStrByNo,用于返回某个字符在一个字符串的位置,下面是该函数的定义:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
ALTER function [dbo].[F_RtnSomeCharIdxInStrByNo](@findSplitStr varchar(250), @procStr varchar(8000), @n smallint) returns intasbegin if @n < 1 return (0) declare @start smallint, @count smallint, @index smallint, @len smallint set @index = charindex(@findSplitStr, @procStr) if @index = 0 return (0) else select @count = 1, @len = len(@findSplitStr) while @index > 0 and @count < @n begin set @start = @index + @len select @index = charindex(@findSplitStr, @procStr, @start), @count = @count + 1 end if @count < @n set @index = 0 return (@index)end |
调用存储过程:exec Proc_TestBatchMainDetailIns 'mainName1','jack|lilei|tom|nike','20|18|22|17'
下面是成功插入后查询到的结果:

sqlserver存储过程批量插入数据的更多相关文章
- PG数据库创建并执行存储过程批量插入数据
记录一下PG数据库创建并执行存储过程批量插入数据的SQL: create or replace function addId() returns boolean AS $BODY$ declare i ...
- mysql应用存储过程批量插入数据
--批量插入数据的sql语句 delimiter $$ DROP PROCEDURE IF EXISTS `test.sp_insert_batch` $$ CREATE DEFINER =`root ...
- Oracle 存储过程批量插入数据
oracle 存储过程批量插入大量数据 declare numCount number; userName varchar2(512); email varchar2(512); markCommen ...
- mysql利用存储过程批量插入数据
最近需要测试一下mysql单表数据达到1000W条以上时增删改查的性能.由于没有现成的数据,因此自己构造,本文只是实例,以及简单的介绍. 首先当然是建表: [sql]view plaincopy CR ...
- 使用Oracle的存储过程批量插入数据
原文地址:http://www.cnblogs.com/liaoyu/p/oracle-procedure-batch-insert.html 作者:L君还在说之乎者也 最近在工作中,需要使用生成一些 ...
- mysql存储过程批量插入数据
DROP TABLE IF EXISTS TeachersInfo; CREATE TABLE TeachersInfo ( id INT NOT NULL AUTO_INCREMENT, teach ...
- postgres 使用存储过程批量插入数据
參考资料(pl/pgsql 官方文档): http://www.postgresql.org/docs/9.3/static/plpgsql.html create or replace functi ...
- C#批量插入数据到Sqlserver中的四种方式
我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...
- C#批量插入数据到Sqlserver中的三种方式
本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...
随机推荐
- android 绘图之Path与Paint详解
/** * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体上可以分 ...
- paper 95:《模式识别和机器学习》资源
Bishop的<模式识别和机器学习>是该领域的经典教材,本文搜罗了有关的教程和读书笔记,供对比学习之用,主要搜索的资源包括CSDN:http://download.csdn.net/sea ...
- Windows消息机制概述
消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程 ...
- Qt之qt4.7 和qt 4.8.4 交叉实践
开发机环境搭建: 测试环境:CentOs7.1 Ubuntu 12.0.4 操作流程: 一.编译Qt4.7.0 1)CentOS上实践 1.tar xzvf qt-everywhere-openso ...
- VMWare安装Solaris虚拟机的网络设置
虚拟机的网卡使用Host-only. 在VMWare取消Host-only的DHCP. 在虚拟机的Solaris系统里ipadm命令配置ip.
- oracle 查看某session的历史执行sql情况
1. 查看性能最差的前100sql SELECT * FROM ( SELECT PARSING_USER_ID EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sq ...
- 微信开发那点事(No.001)
MXS&Vincene ─╄OvЁ &0000024─╄OvЁ MXS&Vincene MXS&Vincene ─╄OvЁ:今天很残酷,明天更残酷,后天很美好, ...
- InnoDB Spin rounds per wait在>32位机器上可能为负
今天发现一个系统innodb的spin rounds per wait为负,感觉很奇怪,原来是个bug: For example (output from PS but we have no patc ...
- ReentrantReadWriteLock类和ReentrantLock类的区别
Java.util.concurrent.locks包定义了两个锁类,ReentrantLock和ReentrantReadWriteLock类. 当有很多线程都从某个数据结构中读取数据而很少有线程对 ...
- JSP页面嵌套
项目中审批过程需要将业务表单嵌套在审批的页面中.由于业务表单很多,前台已经axjx到了本次选择的表单的地址.本来做的就是把这个链接放在审批页面上,但现在需求的就是直接把这个biz表单嵌套在审批的页面中 ...