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