sqlserver一次插入多条数据的sql相关专题.docx
- 文档编号:10182930
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:29
- 大小:24.32KB
sqlserver一次插入多条数据的sql相关专题.docx
《sqlserver一次插入多条数据的sql相关专题.docx》由会员分享,可在线阅读,更多相关《sqlserver一次插入多条数据的sql相关专题.docx(29页珍藏版)》请在冰豆网上搜索。
sqlserver一次插入多条数据的sql相关专题
Sqlserver一次插入多条语句的操作
如何一次将多条数据插入,如何使用数据库的“数组”
关键是charindex注意了,少用循环,效率死慢
2010
Ssc
第1章
一条SQL语句插入多条数据
1.1从数据库中取值法
从表2中取一些数据插入表1中方法如下
insertintotable1(colum1,colum2)select'admin',colum2fromtable2
在表2中colum1字段不存在可以用'admin'替代则插入的记录中colum1字段值全为'admin'
查找前3条记录的SQL语句为
selecttop3*fromtable1
一次插多条还有一种写法(对新表好用)
selectcolum1,colum2intotable1fromtable2
如果表1中要插入的字段在表2中全存在则写法如下
insertintotable1(colum1,colum2)selectcolum1,colum2fromtable2(区别不大)
1.2替换法利用Replace和union函数
insertintonews(newsid)
select'a'union
select'b'
declare@strvarchar(200)
declare@resultvarchar(1000)
set@str='aaa,bb,c,d,e,ffffff'
set@result='insertintonews(newsid)select'''+replace(@str,',','''unionselect''')+''''
exec(@result)
第2章SQLcharindex的用法
select*fromtable_awherecharindex('a',id)>0orcharindex('b',id)>0
table_a表中id字段中含有"a"或者"b"的记录.
---------------------------------------------------
CHARINDEX
返回字符串中指定表达式的起始位置。
语法
CHARINDEX(expression1,expression2[,start_location])
参数
expression1
一个表达式,其中包含要寻找的字符的次序。
expression1是一个短字符数据类型分类的表达式。
expression2
一个表达式,通常是一个用于搜索指定序列的列。
expression2属于字符串数据类型分类。
start_location
在expression2中搜索expression1时的起始字符位置。
如果没有给定start_location,而是一个负数或零,则将从expression2的起始位置开始搜索。
返回类型
int
注释
如果expression1或expression2之一属于Unicode数据类型(nvarchar或nchar)而另一个不属于,则将另一个转换为Unicode数据类型。
如果expression1或expression2之一为NULL值,则当数据库兼容级别为70或更大时,CHARINDEX返回NULL值。
当数据库兼容级别为65或更小时,CHARINDEX仅在expression1和expression2都为NULL时返回NULL值。
如果在expression2内没有找到expression1,则CHARINDEX返回0。
示例
第一个代码示例返回序列"wonderful"在titles表的notes列中开始的位置。
第二个示例使用可选的start_location参数从notes列的第五个字符开始寻找"wonderful"。
第三个示例显示了当expression2内找不到expression1时的结果集。
USEpubs
GO
SELECTCHARINDEX(’wonderful’,notes)
FROMtitles
WHEREtitle_id=’TC3218’
GO
--Usetheoptionalstart_locationparametertostartsearching
--forwonderfulstartingwiththefifthcharacterinthenotes
--column.
USEpubs
GO
SELECTCHARINDEX(’wonderful’,notes,5)
FROMtitles
WHEREtitle_id=’TC3218’
GO
下面是第一个查询和第二个查询的结果集:
-----------
46
(1row(s)affected)
USEpubs
GO
SELECTCHARINDEX(’wondrous’,notes)
FROMtitles
WHEREtitle_id=’TC3218’
GO
下面是结果集。
-----------
0
(1row(s)affected)
第3章Sqlserver"数组"使用
在Sqlserver中执行批量操作时,可同时处理多个数据,由于sql不支持数组,可以变相有如下的方法实现:
3.1利用replace
createtable#temp
(
ssvarchar(200)notnull
)
declare@strvarchar(200)
declare@resultvarchar(1000)
set@str='aaa,bb,c,d,e,ffffff'
set@result='insertinto#temp(ss)select'''+replace(@str,',','''unionselect''')+''''
exec(@result)
select*from#temp
droptable#temp
3.2利用charindex和substring
createtable#temp
(
ssvarchar(200)notnull
)
declare@strvarchar(200)
declare@currint
declare@prevint
set@str='aaa,bb,c,d,e,ffffff'
set@curr=1
set@prev=1
while@prev begin set@curr=charindex(',',@str,@prev) if@curr>@prev insert#tempselectsubstring(@str,@prev,@curr-@prev) else begin insert#tempselectsubstring(@str,@prev,len(@str)-@prev+1) break end set@prev=@curr+1 end select*from#temp droptable#temp 第4章SQL字符串数组操作 4.1一、按指定符号分割字符串返回元素个数 返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。 --AlterfunctionGet_StrArrayLength createfunctionGet_StrArrayLength ( @strvarchar(5000),--要分割的字符串 @splitvarchar(10)--分隔符号 ) returnsint as begin declare@locationint declare@startint declare@lengthint set@str=ltrim(rtrim(@str)) set@location=charindex(@split,@str) set@length=1 while@location<>0 begin set@start=@location+1 set@location=charindex(@split,@str,@start) set@length=@length+1 end return@length end 调用示例: selectdbo.Get_StrArrayLength('1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48',',') 返回值: 4 4.2二、按指定符号分割字符串返回元素 返回分割后指定索引的第几个元素,象数组一样方便 --alterfunctionGet_StrArrayStrOfIndex createfunctionGet_StrArrayStrOfIndex ( @strvarchar(5000),--要分割的字符串 @splitvarchar(10),--分隔符号 @indexint--取第几个元素 ) returnsvarchar(5000) as begin declare@locationint declare@startint declare@nextint declare@seedint set@str=ltrim(rtrim(@str)) set@start=1 set@next=1 set@seed=len(@split) set@location=charindex(@split,@str) while@location<>0and@index>@next begin set@start=@location+@seed set@location=charindex(@split,@str,@start) set@next=@next+1 end if@location=0select@location=len(@str)+1 --这儿存在两种情况: 1、字符串不存在分隔符号2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。 returnsubstring(@str,@start,@location-@start) end 调用示例: selectdbo.Get_StrArrayStrOfIndex('8,9,4',',',2) 返回值: 9 4.3三、结合上边两个函数,象数组一样遍历字符串中的元素 declare@strvarchar(5000) set@str='1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48' printdbo.Get_StrArrayLength(@str,',') declare@nextint set@next=1 while@next<=dbo.Get_StrArrayLength(@str,',') begin printdbo.Get_StrArrayStrOfIndex(@str,',',@next) set@next=@next+1 end printdbo.CheckStrInArr('21',@str) 调用结果: 1 2 3 4 5 4.4四、检查一个元素是否在数组中 AlterfunctionCheckStrInArr(@sasvarchar(50),@sArrasvarchar(5000))returnsint as begin declare@strvarchar(5000) set@str=@sArr declare@nextint declare@retint set@ret=0 set@next=1 while@next<=dbo.Get_StrArrayLength(@str,',') begin ifdbo.Get_StrArrayStrOfIndex(@str,',',@next)=@s begin set@ret=1; end set@next=@next+1 end return@ret end 第5章SQLServer(replace函数) REPLACE 用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。 语法 REPLACE('string_expression1','string_expression2','string_expression3') 参数 'string_expression1' 待搜索的字符串表达式。 string_expression1可以是字符数据或二进制数据。 'string_expression2' 待查找的字符串表达式。 string_expression2考试.大提示可以是字符数据或二进制数据。 'string_expression3' 替换用的字符串表达式。 string_expression3可以是字符数据或二进制数据。 返回类型 如果string_expression(1、2或3)是支持的字符数据类型之一,则返回字符数据。 如果string_expression(1、2或3)是支持的binary数据类型之一,则返回二进制数据。 示例 下例用xxx替换abcdefghi中的字符串cde。 SELECTREPLACE('abcdefghicde','cde','xxx')GO 下面是结果集: ------------abxxxfghixxx(1row(s)affected) ssql="updateshopdictsetcontent=replace(content,'х','×')" sql="Updatexh_skArticleSettitle=replace(title,'广广','广告')whereid="&id 第6章SQL中CAST和CONVERT的区别是什么? 如果SQLServer程序员想将表达式从一种换为另一种,他可以从SQLServer7和2000中自带的两种功能中做出选择。 在存储过程或其他情况下,我们常常需要将数据从datetime型转化成varchar型;CONVERT和CAST就可以用于这种情况。 由于SQLServer提供两种功能,因此应该选择哪种功能或应该在哪种情况下使用该功能就很容易让人困惑了。 CONVERT是专对SQLServer使用的,使日期与时间值,小数之间转换具有更宽的灵活性。 CAST是两种功能中更具ANSI标准的功能,即虽然更具便携性(比如,使用CAST的函数能更容易的被其它数据库软件使用),但功能相对弱一些。 不过,当小数转化为数值,并保留原始表达式中的小数数值时,仍然需要使用CAST。 因此,我建议首先使用CAST,如果遇到必须使用CONVERT的情况时再使用CONVERT。 CAST和CONVERT还能联合使用,达到特殊的效果。 比如,在currentdate下生成char变量一般使用以下方法: SELECTCONVERT(CHAR(10),CURRENT_TIMESTAMP,102) (102表明使用了ANSI日期模式,即yy.mm.dd型) 然而,如果你希望将这个变量明确生成为datetime或smalldatetime变量,以此在特定的数据库栏中兼容,那么你可以使用以下语句: SELECTCAST(CONVERT(CHAR(10),CURRENT_TIMESTAMP,102)ASDATETIME 返回值将是yy.mm.dd00: 00: 00(如12: 00AM作为时间戳; 第7章总结-血的教训 有兴趣的比较一下下面这个存储过程,表我就不给出了,每个优化都在下面放置了为优化前的原语句。 我要说的就是,优化前,我执行此存储过程,系统就死了,优化后,我再执行,3秒内结束。 天上人间啊。 。 。 setANSI_NULLSON setQUOTED_IDENTIFIERON go /*********************************************************************** 功能: 保存用户选择的所有的出版社、教育类型、年级、学科、册、章、节 参数: @publishingHouseArray--无重复出版社(以","号分隔) 参数: @subjectArray--重复的学科(以","号分隔) 参数: @gradeArray--重复的年级(以","号分隔) 参数: @teachTypeArray--无重复教育类型(以","号分隔) 参数: @tempGradeArray--不重复的年级(以","号分隔) 参数: @UID--用户ID execTheDataBase_DeleteAllConcernsUserU'13,18,20,','语文,语文,语文,语文,语文,语文,音乐,数学,数学,数学,数学,英语,物理,英语,英语,', '37,38,39,40,41,42,39,38,40,41,42,38,55,79,40,','48,47,57,61,','37,38,39,40,41,42,55,79,',9999 ************************************************************************/ ALTERPROCEDURE[dbo].[TheDataBase_DeleteAllConcernsUserU] @publishingHouseArrayVARCHAR(MAX), @subjectArrayNVARCHAR(MAX), @gradeArrayVARCHAR(MAX), @teachTypeArrayVARCHAR(MAX), @tempGradeArrayVARCHAR(MAX), @UIDINT AS DECLARE@PointerPrevINT DECLARE@PointerCurrINT DECLARE@TIdINT DECLARE@TempFlagINT SET@PointerPrev=0 SET@PointerCurr=1 BEGIN BEGINTRANSACTIONTran_MSG BEGIN --删除某用户所有的出版社-------------------------------------------------------------------------------- DELETETheDataBase_ConcernsUWHEREUID=@UID --删除某用户所有的教育类型 DELETETheDataBase_TeachTypeAndConcernUWHEREUID=@UID --删除某用户所有的年级 DELETETheDataBase_GradeAndTeachTypeUWHEREUID=@UID --删除某用户所有的学科 DELETETheDataBase_SubjectAndGradeUWHEREUID=@UID --删除某用户所有的册、章、节 DELETETheDataBase_ChapterUWHEREUID=@UID --保存用户选择的所有的出版社--------------------------------------------------------------------- DECLARE@STR_PublishingHouseVARCHAR(MAX) SET@STR_PublishingHouse=(Substring(@publishingHouseArray,0,Len(@publishingHouseArray))) DECLARE@STR_SQLVARCHAR(MAX) SET@STR_SQL='INSERTINTOTheDataBase_ConcernsU(ConcernsID,UID)SELECTConcernID,'+CAST(@UIDASVARCHAR)+ 'FROMTheDataBase_ConcernsWHEREConcernIDIN('+@STR_PublishingHouse+')' EXEC(@STR_SQL) --WHILE(@PointerPrev+1 --BEGIN --SET@PointerCurr=CHARINDEX(',',@publishingHouseArray,@PointerPrev+1) -- --IF(@PointerCurr>0) --BEGIN --SET@TId=CAST(SUBSTRING(@publishingHouseArray,@PointerPrev+1,@PointerCurr-@PointerPrev-1)ASINT) ----INSERT每个出版社 --INSERTINTOTheDataBase_ConcernsU(ConcernsID,UID)VALUES(@TId,@UID) --SET@PointerPrev=@PointerCurr --END --ELSE --BEGIN --BREAK --END --END --SET@PointerPrev=0 --SET@PointerCurr=1 --保存用户选择的所有的教育类型--------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sqlserver 一次 插入 数据 sql 相关 专题
![提示](https://static.bdocx.com/images/bang_tan.gif)