为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

sqlserver一次插入多条数据的sql相关专题

2017-09-30 33页 doc 74KB 19阅读

用户头像

is_601191

暂无简介

举报
sqlserver一次插入多条数据的sql相关专题sqlserver一次插入多条数据的sql相关专题 Sqlserver一次插入多条语句的操作 如何一次将多条数据插入,如何使用数据库的“数组” 关键是charindex注意了,少用循环,效率死慢 2010 Ssc 目录 第1章 一条SQL语句 插入多条数据 ......................................................................... 3 1.1 从数据库中取值法 ............................................
sqlserver一次插入多条数据的sql相关专题
sqlserver一次插入多条数据的sql相关专题 Sqlserver一次插入多条语句的操作 如何一次将多条数据插入,如何使用数据库的“数组” 关键是charindex注意了,少用循环,效率死慢 2010 Ssc 目录 第1章 一条SQL语句 插入多条数据 ......................................................................... 3 1.1 从数据库中取值法 ........................................................................................... 3 1.2 替换法利用Replace和union函数 ................................................................. 3 第2章 SQL charindex的用法 ....................................................................................... 4 第3章 Sqlserver "数组"使用 ........................................................................................ 5 3.1 利用replace ...................................................................................................... 6 3.2 利用charindex和substring ............................................................................. 6 第4章 SQL字符串数组操作 ........................................................................................ 7 4.1 一、按指定符号分割字符串返回元素个数 ................................................... 7 4.2 二、按指定符号分割字符串返回元素 ........................................................... 8 4.3 三、结合上边两个函数,象数组一样遍历字符串中的元素 ....................... 9 4.4 四、检查一个元素是否在数组中 ................................................................... 9 第5章 SQLServer(replace函数) ................................................................................. 10 第6章 SQL中CAST和CONVERT的区别是什么, .................................................. 10 第7章 -血的教训................................................................................................ 11 第1章 一条SQL语句 插入多条数据 1.1 从数据库中取值法 从2中取一些数据插入表1中 方法如下 insert into table1 (colum1,colum2) select 'admin', colum2 from table2 在表2中 colum1 字段不存在 可以用'admin' 替代 则插入的记录中 colum1 字段值全为 'admin' 查找前3条记录的SQL语句为 select top 3 * from table1 一次插多条还有一种写法(对新表好用) select colum1,colum2 into table1 from table2 如果表 1 中要插入的字段在表 2 中全存在 则写法如下 insert into table1(colum1,colum2) select colum1,colum2 from table2 (区别不大) 1.2 替换法利用Replace和union函数 insert into news (newsid) select 'a ' union select 'b ' declare @str varchar(200) declare @result varchar(1000) set @str='aaa,bb,c,d,e,ffffff' set @result =' insert into news(newsid) select '''+replace(@str,',','''union select''')+'''' exec(@result) 第2章 SQL charindex的用法 select * from table_a where charindex('a',id)>0 or charindex('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 时的结果集。 USE pubs GO SELECT CHARINDEX(’wonderful’, notes) FROM titles WHERE title_id = ’TC3218’ GO -- Use the optional start_location parameter to start searching -- for wonderful starting with the fifth character in the notes -- column. USE pubs GO SELECT CHARINDEX(’wonderful’, notes, 5) FROM titles WHERE title_id = ’TC3218’ GO 下面是第一个查询和第二个查询的结果集: ----------- 46 (1 row(s) affected) USE pubs GO SELECT CHARINDEX(’wondrous’, notes) FROM titles WHERE title_id=’TC3218’ GO 下面是结果集。 ----------- 0 (1 row(s) affected) 第3章 Sqlserver "数组"使用 在Sqlserver中执行批量操作时,可同时处理多个数据,由于sql不支持数组,可以变相 有如下的方法实现: 3.1 利用replace create table #temp ( ss varchar(200) not null ) declare @str varchar(200) declare @result varchar(1000) set @str='aaa,bb,c,d,e,ffffff' set @result =' insert into #temp(ss) select '''+replace(@str,',','''union select''')+'''' exec(@result) select * from #temp drop table #temp 3.2 利用charindex和substring create table #temp ( ss varchar(200) not null ) declare @str varchar(200) declare @curr int declare @prev int set @str='aaa,bb,c,d,e,ffffff' set @curr=1 set @prev=1 while @prev < len(@str) begin set @curr=charindex(',',@str,@prev) if @curr>@prev insert #temp select substring(@str,@prev,@curr-@prev) else begin insert #temp select substring(@str,@prev,len(@str)-@prev+1) break end set @prev=@curr+1 end select * from #temp drop table #temp 第4章 SQL字符串数组操作 4.1 一、按指定符号分割字符串返回元素个数 返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。 --Alter function Get_StrArrayLength create function Get_StrArrayLength ( @str varchar(5000), --要分割的字符串 @split varchar(10) --分隔符号 ) returns int as begin declare @location int declare @start int declare @length int 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 调用示例: select dbo.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,2 7,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48',',') 返回值:4 4.2 二、按指定符号分割字符串返回元素 返回分割后指定索引的第几个元素,象数组一样方便 --alter function Get_StrArrayStrOfIndex create function Get_StrArrayStrOfIndex ( @str varchar(5000), --要分割的字符串 @split varchar(10), --分隔符号 @index int --取第几个元素 ) returns varchar(5000) as begin declare @location int declare @start int declare @next int declare @seed int set @str=ltrim(rtrim(@str)) set @start=1 set @next=1 set @seed=len(@split) set @location=charindex(@split,@str) while @location<>0 and @index>@next begin set @start=@location+@seed set @location=charindex(@split,@str,@start) set @next=@next+1 end if @location =0 select @location =len(@str)+1 --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。 return substring(@str,@start,@location-@start) end 调用示例:select dbo.Get_StrArrayStrOfIndex('8,9,4',',',2) 返回值:9 4.3 三、结合上边两个函数,象数组一样遍历字符串中的元 素 declare @str varchar(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' print dbo.Get_StrArrayLength(@str,',') declare @next int set @next=1 while @next<=dbo.Get_StrArrayLength(@str,',') begin print dbo.Get_StrArrayStrOfIndex(@str,',',@next) set @next=@next+1 end print dbo.CheckStrInArr('21',@str) 调用结果: 1 2 3 4 5 4.4 四、检查一个元素是否在数组中 Alter function CheckStrInArr(@s as varchar(50),@sArr as varchar(5000)) returns int as begin declare @str varchar(5000) set @str=@sArr declare @next int declare @ret int set @ret=0 set @next=1 while @next<=dbo.Get_StrArrayLength(@str,',') begin if dbo.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。 SELECT REPLACE('abcdefghicde','cde','xxx') GO 下面是结果集: ------------ abxxxfghixxx (1 row(s) affected) ssql="update shopdict set content =replace(content,'х','×')" sql="Update xh_skArticle Set title = replace(title,'广广','广告') where id="&id 第6章 SQL中CAST和CONVERT的区别是什 么, 如果SQL Server程序员想将表达式从一种换为另一种,他可以从SQL Server 7和2000中自带的两种功能中做出选择。在存储过程或其他情况下,我们常常需要将数据从datetime 型转化成varchar型;CONVERT和CAST就可以用于这种情况。 由于SQL Server提供两种功能,因此应该选择哪种功能或应该在哪种情况下使用该功能就很容易让人困惑了。CONVERT是专对SQL Server使用的,使日期与时间值,小数之间转换具有更宽的灵活性。 CAST是两种功能中更具ANSI的功能,即虽然更具便携性(比如,使用CAST的函数能更容易的被其它数据库软件使用),但功能相对弱一些。不过,当小数转化为数值,并保留原始表达式中的小数数值时,仍然需要使用CAST。因此,我建议首先使用CAST,如果遇到必须使用CONVERT的情况时再使用CONVERT。 CAST和CONVERT还能联合使用,达到特殊的效果。比如,在current date下生成char变量一般使用以下方法: SELECT CONVERT(CHAR(10), CURRENT_TIMESTAMP, 102) (102表明使用了ANSI日期模式,即yy.mm.dd型) 然而,如果你希望将这个变量明确生成为datetime或smalldatetime变量,以此在特定的数据库栏中兼容,那么你可以使用以下语句: SELECT CAST(CONVERT(CHAR(10),CURRENT_TIMESTAMP,102) AS DATETIME 返回值将是 yy.mm.dd 00:00:00(如12:00AM作为时间戳; 第7章 总结-血的教训 有兴趣的比较一下下面这个存储过程,表我就不给出了,每个优化都在下面放置了为优化前的原语句。我要说的就是,优化前,我执行此存储过程,系统就死了,优化后,我再执行,3秒内结束。天上人间啊。。。 set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go /******************************************************************** *** 功能:保存用户选择的所有的出版社、教育类型、、学科、册、章、节 参数:@publishingHouseArray --无重复出版社(以","号分隔) 参数:@subjectArray --重复的学科(以","号分隔) 参数:@gradeArray --重复的年级(以","号分隔) 参数:@teachTypeArray --无重复教育类型(以","号分隔) 参数:@tempGradeArray --不重复的年级(以","号分隔) 参数:@UID --用户ID exec TheDataBase_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 ********************************************************************* ***/ ALTER PROCEDURE [dbo].[TheDataBase_DeleteAllConcernsUserU] @publishingHouseArray VARCHAR(MAX), @subjectArray NVARCHAR(MAX), @gradeArray VARCHAR(MAX), @teachTypeArray VARCHAR(MAX), @tempGradeArray VARCHAR(MAX), @UID INT AS DECLARE @PointerPrev INT DECLARE @PointerCurr INT DECLARE @TId INT DECLARE @TempFlag INT SET @PointerPrev = 0 SET @PointerCurr = 1 BEGIN BEGIN TRANSACTION Tran_MSG BEGIN -- 删除某用户所有的出版社 --------------------------------------------------------------------- ----------- DELETE TheDataBase_ConcernsU WHERE UID = @UID -- 删除某用户所有的教育类型 DELETE TheDataBase_TeachTypeAndConcernU WHERE UID = @UID -- 删除某用户所有的年级 DELETE TheDataBase_GradeAndTeachTypeU WHERE UID = @UID -- 删除某用户所有的学科 DELETE TheDataBase_SubjectAndGradeU WHERE UID = @UID -- 删除某用户所有的册、章、节 DELETE TheDataBase_ChapterU WHERE UID = @UID -- 保存用户选择的所有的出版社 --------------------------------------------------------------------- DECLARE @STR_PublishingHouse VARCHAR(MAX) SET @STR_PublishingHouse = (Substring(@publishingHouseArray, 0, Len(@publishingHouseArray))) DECLARE @STR_SQL VARCHAR(MAX) SET @STR_SQL = 'INSERT INTO TheDataBase_ConcernsU(ConcernsID, UID) SELECT ConcernID, ' + CAST(@UID AS VARCHAR) + ' FROM TheDataBase_Concerns WHERE ConcernID IN(' + @STR_PublishingHouse + ')' EXEC(@STR_SQL) -- WHILE (@PointerPrev + 1 < LEN(@publishingHouseArray)) -- BEGIN -- SET @PointerCurr = CHARINDEX(',', @publishingHouseArray, @PointerPrev + 1) -- -- IF (@PointerCurr > 0) -- BEGIN -- SET @TId = CAST(SUBSTRING(@publishingHouseArray, @PointerPrev + 1, @PointerCurr - @PointerPrev - 1) AS INT) -- -- INSERT每个出版社 -- INSERT INTO TheDataBase_ConcernsU(ConcernsID, UID) VALUES(@TId, @UID) -- SET @PointerPrev = @PointerCurr -- END -- ELSE -- BEGIN -- BREAK -- END -- END -- SET @PointerPrev = 0 -- SET @PointerCurr = 1 -- 保存用户选择的所有的教育类型 --------------------------------------------------------------------- DECLARE @STR_TeachType VARCHAR(MAX) SET @STR_TeachType = (Substring(@teachTypeArray, 0, Len(@teachTypeArray))) DECLARE @STR_TeachTypeSQL VARCHAR(MAX) SET @STR_TeachTypeSQL = 'INSERT INTO TheDataBase_TeachTypeAndConcernU(TeachTypeAndConcernID, UID) SELECT TeachTypeAndConcernID, ' + CAST(@UID AS VARCHAR) + ' FROM TheDataBase_TeachTypeAndConcern WHERE TeachTypeAndConcernID IN(' + @STR_TeachType + ')' EXEC(@STR_TeachTypeSQL) -- WHILE (@PointerPrev + 1 < LEN(@teachTypeArray)) -- BEGIN -- SET @PointerCurr = CHARINDEX(',', @teachTypeArray, @PointerPrev + 1) -- -- IF (@PointerCurr > 0) -- BEGIN -- SET @TId = CAST(SUBSTRING(@teachTypeArray, @PointerPrev + 1, @PointerCurr - @PointerPrev - 1) AS INT) -- -- INSERT每个教育类型 -- INSERT INTO TheDataBase_TeachTypeAndConcernU(TeachTypeAndConcernID, UID) VALUES(@TId, @UID) -- SET @PointerPrev = @PointerCurr -- END -- ELSE -- BEGIN -- BREAK -- END -- END -- -- SET @PointerPrev = 0 -- SET @PointerCurr = 1 -- 保存用户选择的所有的年级 --------------------------------------------------------------------- ----------- DECLARE @STR_Grade VARCHAR(MAX) SET @STR_Grade = (Substring(@tempGradeArray, 0, Len(@tempGradeArray))) DECLARE @STR_GradeSQL VARCHAR(MAX) SET @STR_GradeSQL = 'INSERT INTO TheDataBase_GradeAndTeachTypeU(GradeAndTeachTypeID, UID) SELECT GradeAndTeachTypeID, ' + CAST(@UID AS VARCHAR) + ' FROM TheDataBase_GradeAndTeachType WHERE GradeAndTeachTypeID IN(' + @STR_Grade + ')' EXEC(@STR_GradeSQL) -- WHILE (@PointerPrev + 1 < LEN(@tempGradeArray)) -- BEGIN -- SET @PointerCurr = CHARINDEX(',', @tempGradeArray, @PointerPrev + 1) -- -- IF (@PointerCurr > 0) -- BEGIN -- SET @TId = CAST(SUBSTRING(@tempGradeArray, @PointerPrev + 1, @PointerCurr - @PointerPrev - 1) AS INT) -- -- INSERT每个年级 -- INSERT INTO TheDataBase_GradeAndTeachTypeU(GradeAndTeachTypeID, UID) VALUES(@TId, @UID) -- SET @PointerPrev = @PointerCurr -- END -- ELSE -- BEGIN -- BREAK -- END -- END DECLARE @SubjectName NVARCHAR(100) SET @SubjectName = '' SET @PointerPrev = 0 SET @PointerCurr = 1 -- 保存用户选择的所有的学科 --------------------------------------------------------------------- ----------- -- 创建临时表 IF OBJECT_ID('tempdb..#MyTempTable') IS NOT NULL BEGIN DROP TABLE #MyTempTable END CREATE TABLE #MyTempTable(SubjectNameID INT IDENTITY(1,1), SubjectName NVARCHAR(100)) -- 将传进来的学科名插入临时表 WHILE (@PointerPrev + 1 < LEN(@subjectArray)) BEGIN SET @PointerCurr = CHARINDEX(',', @subjectArray, @PointerPrev + 1) IF (@PointerCurr > 0) BEGIN SET @SubjectName = CAST(SUBSTRING(@subjectArray, @PointerPrev + 1, @PointerCurr - @PointerPrev - 1) AS NVARCHAR) -- 向#MyTempTable表中INSERT每个学科名 INSERT INTO #MyTempTable(SubjectName) VALUES(@SubjectName) SET @PointerPrev = @PointerCurr END ELSE BEGIN BREAK END END -- 保存学科 SET @PointerPrev = 0 SET @PointerCurr = 1 WHILE (@PointerPrev + 1 < LEN(@gradeArray)) BEGIN SET @PointerCurr = CHARINDEX(',', @gradeArray, @PointerPrev + 1) IF (@PointerCurr > 0) BEGIN SET @TId = CAST(SUBSTRING(@gradeArray, @PointerPrev + 1, @PointerCurr - @PointerPrev - 1) AS INT) -- 向TheDataBase_SubjectAndGradeU表中INSERT每个学科 INSERT INTO TheDataBase_SubjectAndGradeU(SubjectAndGradeID, UID) (SELECT SubjectAndGradeID, @UID FROM TheDataBase_SubjectAndGrade WHERE GradeAndTeachTypeID = @TId AND IsShowEnable = 1 AND IsDelete = 0 AND SubjectName = (select top 1 SubjectName from #MyTempTable)) -- 删除临时表的第一行记录 DELETE #MyTempTable WHERE SubjectNameID = (select top 1 SubjectNameID from #MyTempTable) SET @PointerPrev = @PointerCurr END ELSE BEGIN BREAK END END -- 根据用户的选择保存相应的【册】 --------------------------------------------------------------------- ----------- INSERT INTO TheDataBase_ChapterU(ChapterID, UID) (SELECT a.ChapterID, b.UID FROM TheDataBase_Chapter a, TheDataBase_SubjectAndGradeU b WHERE a.SubjectAndGradeID = b.SubjectAndGradeID AND a.IsShowEnable = 1 AND a.IsDelete = 0 AND b.UID = @UID AND a.parentid = -1) -- 创建【册】临时表 -- IF OBJECT_ID('tempdb..#MyTempTable1') IS NOT NULL -- BEGIN -- DROP TABLE #MyTempTable1 -- END -- CREATE TABLE #MyTempTable1(ChapterID VARCHAR(100), UID INT) -- 通过用户选择的学科查出【册ID】,INSERT到#MyTempTable1表中 -- INSERT INTO #MyTempTable1(ChapterID, UID) -- (SELECT a.ChapterID, b.UID -- FROM TheDataBase_Chapter a, TheDataBase_SubjectAndGradeU b -- WHERE a.SubjectAndGradeID = b.SubjectAndGradeID -- AND a.IsShowEnable = 1 AND a.IsDelete = 0 -- AND b.UID = @UID AND a.parentid = -1) -- 通过用户选择的学科查出【册ID】,INSERT到TheDataBase_ChapterU表中 -- INSERT INTO TheDataBase_ChapterU(ChapterID, UID)(SELECT ChapterID, UID FROM #MyTempTable1) -- 根据用户的选择保存相应的【章】 --------------------------------------------------------------------- ----------- INSERT INTO TheDataBase_ChapterU(ChapterID, UID) (SELECT a.ChapterID, b.UID FROM TheDataBase_Chapter a, (SELECT a.ChapterID, b.UID FROM TheDataBase_Chapter a, TheDataBase_SubjectAndGradeU b WHERE a.SubjectAndGradeID = b.SubjectAndGradeID AND a.IsShowEnable = 1 AND a.IsDelete = 0 AND b.UID = @UID AND a.parentid = -1) b WHERE a.IsShowEnable = 1 AND a.IsDelete = 0 AND a.ParentID = b.ChapterID) -- 创建【章】临时表 -- IF OBJECT_ID('tempdb..#MyTempTable2') IS NOT NULL -- BEGIN -- DROP TABLE #MyTempTable2 -- END -- CREATE TABLE #MyTempTable2(ChapterID VARCHAR(100), UID INT) -- -- -- 通过用户选择的学科查出【章ID】,INSERT到#MyTempTable2表中 -- INSERT INTO #MyTempTable2(ChapterID, UID) -- (SELECT a.ChapterID, b.UID -- FROM TheDataBase_Chapter a, #MyTempTable1 b -- WHERE a.IsShowEnable = 1 AND a.IsDelete = 0 AND a.ParentID = b.ChapterID) -- -- -- 通过用户选择的学科查出【章ID】,INSERT到TheDataBase_ChapterU表中 -- INSERT INTO TheDataBase_ChapterU(ChapterID, UID)(SELECT ChapterID, UID FROM #MyTempTable2) -- 根据用户的选择保存相应的【节】 --------------------------------------------------------------------- ----------- INSERT INTO TheDataBase_ChapterU(ChapterID, UID) (SELECT a.ChapterID, b.UID FROM TheDataBase_Chapter a, (SELECT a.ChapterID, b.UID FROM TheDataBase_Chapter a, (SELECT a.ChapterID, b.UID FROM TheDataBase_Chapter a, TheDataBase_SubjectAndGradeU b WHERE a.SubjectAndGradeID = b.SubjectAndGradeID AND a.IsShowEnable = 1 AND a.IsDelete = 0 AND b.UID = @UID AND a.parentid = -1) b WHERE a.IsShowEnable = 1 AND a.IsDelete = 0 AND a.ParentID = b.ChapterID) b WHERE a.IsShowEnable = 1 AND a.IsDelete = 0 AND a.ParentID = b.ChapterID) -- -- 创建【节】临时表 -- IF OBJECT_ID('tempdb..#MyTempTable3') IS NOT NULL -- BEGIN -- DROP TABLE #MyTempTable3 -- END -- CREATE TABLE #MyTempTable3(ChapterID VARCHAR(100), UID INT) -- -- -- 通过用户选择的学科查出【节ID】,INSERT到#MyTempTable3表中 -- INSERT INTO #MyTempTable3(ChapterID, UID) -- (SELECT a.ChapterID, b.UID -- FROM TheDataBase_Chapter a, #MyTempTable2 b -- WHERE a.IsShowEnable = 1 AND a.IsDelete = 0 AND a.ParentID = b.ChapterID) -- -- -- 通过用户选择的学科查出【节ID】,INSERT到TheDataBase_ChapterU表中 -- INSERT INTO TheDataBase_ChapterU(ChapterID, UID)(SELECT ChapterID, UID FROM #MyTempTable3) -- lijun修改根据用户的选择保存相应的【栏目】 --------------------------------------------------------------------- ----------- INSERT INTO TheDataBase_CloumnAndChapterU(CloumnAndChapterID, UID) (SELECT a.CloumnAndChapterID, @UID FROM TheDataBase_CloumnAndChapter a, TheDataBase_Cloumn b WHERE a.ChapterID in (select d.ChapterID from (SELECT count(ChapterID) as CountKey, a.ChapterID FROM TheDataBase_CloumnAndChapter a, TheDataBase_CloumnAndChapterU b WHERE a.ChapterID in (SELECT ChapterID FROM (SELECT a.ChapterID, b.UID FROM TheDataBase_Chapter a, (SELECT a.ChapterID, b.UID FROM TheDataBase_Chapter a, (SELECT a.ChapterID, b.UID FROM TheDataBase_Chapter a, TheDataBase_SubjectAndGradeU b WHERE a.SubjectAndGradeID = b.SubjectAndGradeID AND a.IsShowEnable = 1 AND a.IsDelete = 0 AND b.UID = @UID AND a.parentid = -1) b WHERE a.IsShowEnable = 1 AND a.IsDelete = 0 AND a.ParentID = b.ChapterID) b WHERE a.IsShowEnable = 1 AND a.IsDelete = 0 AND a.ParentID = b.ChapterID) c ) AND a.IsDelete = 0 AND a.CloumnAndChapterID = b.CloumnAndChapterID AND a.IsShowEnable = 1 AND b.UID = @UID group by a.ChapterID) d where d.CountKey = 0) AND a.IsDelete = 0 AND a.IsShowEnable = 1 AND a.CloumnID = b.CloumnID AND b.IsDelete = 0 AND b.IsShowEnable = 1 AND b.IsRecommend = 1) --lijun 修改统计栏目是否被选的数据放到#MyTempTable4中CountKey按照节统计 -- IF OBJECT_ID('tempdb..#MyTempTable4') IS NOT NULL -- BEGIN -- DROP TABLE #MyTempTable4 -- END -- CREATE TABLE #MyTempTable4(CountKey INT,ChapterID VARCHAR(100)) -- declare @tempUserID int -- select @tempUserID=UID from #MyTempTable3 -- INSERT INTO #MyTempTable4(CountKey, ChapterID) -- (SELECT count(ChapterID) as CountKey,a.ChapterID -- FROM TheDataBase_CloumnAndChapter a, TheDataBase_CloumnAndChapterU b -- WHERE a.ChapterID in(SELECT ChapterID FROM #MyTempTable3) AND a.IsDelete = 0 -- AND a.CloumnAndChapterID = b.CloumnAndChapterID -- AND a.IsShowEnable = 1 AND b.UID = @tempUserID group by a.ChapterID) -- -- 申明游标 -- DECLARE ChapterID_cursor CURSOR FOR SELECT ChapterID FROM #MyTempTable3 -- -- 打开游标 -- OPEN ChapterID_cursor -- -- 开始循环游标变量 -- FETCH NEXT FROM ChapterID_cursor INTO @TId -- -- 返回被FETCH语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态 -- WHILE @@FETCH_STATUS = 0 -- BEGIN -- -- -- 取该课下的栏目数 -- SET @TempFlag = isnull((SELECT CountKey -- FROM #MyTempTable4 -- WHERE ChapterID=@TId),0) -- -- -- --如果该课下没有栏目,则Insert推荐栏目 -- IF (@TempFlag = 0) -- BEGIN -- -- INSERT INTO TheDataBase_CloumnAndChapterU(CloumnAndChapterID, UID) -- (SELECT a.CloumnAndChapterID, @UID -- FROM TheDataBase_CloumnAndChapter a, TheDataBase_Cloumn b -- WHERE a.ChapterID = @TId AND a.IsDelete = 0 -- AND a.IsShowEnable = 1 AND a.CloumnID = b.CloumnID -- AND b.IsDelete = 0 AND b.IsShowEnable = 1 -- AND b.IsRecommend = 1) -- -- END -- -- 开始循环游标变量 -- FETCH NEXT FROM ChapterID_cursor INTO @TId -- END -- -- 关闭游标 -- CLOSE ChapterID_cursor -- -- 释放游标 -- DEALLOCATE ChapterID_cursor -- -- 原始根据用户的选择保存相应的【栏目】 --------------------------------------------------------------------- ----------- -- -- -- 申明游标 -- DECLARE ChapterID_cursor CURSOR FOR SELECT ChapterID FROM #MyTempTable3 -- -- 打开游标 -- OPEN ChapterID_cursor -- -- 开始循环游标变量 -- FETCH NEXT FROM ChapterID_cursor INTO @TId -- -- 返回被FETCH语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态 -- WHILE @@FETCH_STATUS = 0 -- BEGIN -- -- -- 取该课下的栏目数 -- SET @TempFlag = (SELECT COUNT(*) -- FROM TheDataBase_CloumnAndChapter a, TheDataBase_CloumnAndChapterU b -- WHERE a.ChapterID = @TId AND a.IsDelete = 0 -- AND a.CloumnAndChapterID = b.CloumnAndChapterID -- AND a.IsShowEnable = 1 AND b.UID = @UID) -- -- -- 如果该课下没有栏目,则Insert推荐栏目 ---- IF (@TempFlag = 0) ---- BEGIN ---- ---- INSERT INTO TheDataBase_CloumnAndChapterU(CloumnAndChapterID, UID) ---- (SELECT a.CloumnAndChapterID, @UID ---- FROM TheDataBase_CloumnAndChapter a, TheDataBase_Cloumn b ---- WHERE a.ChapterID = @TId AND a.IsDelete = 0 ---- AND a.IsShowEnable = 1 AND a.CloumnID = b.CloumnID ---- AND b.IsDelete = 0 AND b.IsShowEnable = 1 ---- AND b.IsRecommend = 1 ) ---- ---- END -- -- 开始循环游标变量 -- FETCH NEXT FROM ChapterID_cursor INTO @TId -- END -- -- 关闭游标 -- CLOSE ChapterID_cursor -- -- 释放游标 -- DEALLOCATE ChapterID_cursor END IF (@@ERROR = 0) BEGIN COMMIT TRANSACTION Tran_MSG END ELSE BEGIN ROLLBACK TRANSACTION Tran_MSG END RETURN @@ERROR END
/
本文档为【sqlserver一次插入多条数据的sql相关专题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索