请教前辈insert 语句不能欠套的问题,急...分不够再加...
主要是下面这一句,我去掉下面这句程序是可以正确执行的.
set @chvnSql = @chvnSql + 'insert into ' + @chvTempTableName + ' exec GetSalesManByLevel @intTempID,' + @chvID + ',' + @chvLevel + ',' + @chvCurrentCommentLV + ',' + @chvMaxCommentLV + ',' + @chvShrinkState + ' ' + char(10)
递归调用时系统说
服务器: 消息 8164,级别 16,状态 1,行 28
INSERT EXEC 语句不能嵌套。
郁闷...搞了很久搞不出来...
http://community.csdn.net/Expert/topic/4716/4716931.xml?temp=.5362818
有高手说不要用exec
但是我在递归调用时要声明不同的游标名称,不然系统会说游标已经存在...
不知道哪位前辈帮我看一下,万分感谢,领导已经在吹了...郁闷...
-------------------------------------------------------------------------------------------
--标题:
-- 根据级别参数来得到业务员数据
--说明:
-- 第一级,判断指定级别是否为0和1,是的话就插入
-- 第二级,判断指定级别是否为0和2,是的话就插入
-- ...
--参数:
-- 0 表示获取所有下线
-- 1 表示获取一级下线
-- 2 表示获取二级下线
-- 3 表示获取三级下线
-- 4 表示获取四级下线
-- 5 表示获取五级下线
--返回值:
-- 业务员数据表
-------------------------------------------------------------------------------------------
ALTER procedure GetSalesManByLevel
@intID int, --业务员ID
@intTopManID int, --顶部业务员ID,收缩状态时要计算离职人数。
@intLevel int, --当前要取的级别
@intCurrentCommentLV int, --当前推荐管理级别
@intMaxCommentLV int, --最高推荐管理级别
@intShrinkState int --收缩状态1表示开启0表示关闭
as
declare @chvCursorString varchar(15) --将参数ID转换成字符串存入此变量,游标名称由此变量命名。
declare @chvTempTableName varchar(15) --临时表名,递归的话要创建不同的临时表名。
declare @chvnSql nvarchar(3000) --动态参数语句
set @chvCursorString = 'C' + cast(@intID as varchar) --因为ID为数字,加上A是以英文字母开头为游标命名。
set @chvTempTableName = 'T' + cast(@intID as varchar)
set @chvnSql = 'declare @intTempCash int ' + char(10) --存储临时的金额
set @chvnSql = @chvnSql + 'declare @intTempID int ' + char(10) --临时存储业务员ID
set @chvnSql = @chvnSql + 'set @intTempID = 0 ' + char(10)
--数据表做为输入
set @chvnSql = @chvnSql + 'declare @tblSubordinateOutPut table(intID int,chvnName nvarchar(30),chvnSex nvarchar(1),
chvMobileTel varchar(15),dtmJoinDate datetime,intParentID int,intStateID int) ' + char(10)
--查找下级业务员,把数据存入@tblSubordinate。
set @chvnSql = @chvnSql + 'declare @tblSubordinate table(intID int,chvnName nvarchar(30),chvnSex nvarchar(1),
chvMobileTel varchar(15),dtmJoinDate datetime,intParentID int,intStateID int) ' + char(10)
set @chvnSql = @chvnSql + 'insert into @tblSubordinate select * from dbo.SearchSubordinateByID2(' + cast(@intID as varchar) +') ' + char(10)
----------------------------------------------------------------------------------
--判断intLevel是否为0或者是否等于@intCurrentCommentLV都可以对业务员进行读取
----------------------------------------------------------------------------------
set @chvnSql = @chvnSql + 'declare ' + @chvCursorString + ' cursor scroll for select intID from @tblSubordinate ' + char(10)
set @chvnSql = @chvnSql + 'open ' + @chvCursorString + ' ' + char(10)
set @chvnSql = @chvnSql + 'if( ' + cast(@intLevel as varchar) + '= 0 or ' + cast(@intLevel as varchar) + '=' + cast(@intCurrentCommentLV as varchar) + ') ' + char(10)
set @chvnSql = @chvnSql + 'begin ' + char(10)
set @chvnSql = @chvnSql + 'fetch first from ' + @chvCursorString + ' into @intTempID ' + char(10)
set @chvnSql = @chvnSql + 'while @@fetch_status = 0 ' + char(10)
set @chvnSql = @chvnSql + 'begin ' + char(10)
--如何符合级别条件,这里可以把业务员数据存入指定表中。
set @chvnSql = @chvnSql + 'insert into @tblSubordinateOutPut select intID,chvnName,chvnSex,chvMobileTel,dtmJoinDate,intParentID,intStateID from vSalesManInformation where intID=@intTempID ' + char(10)
set @chvnSql = @chvnSql + 'fetch next from ' + @chvCursorSTring + ' into @intTempID ' + char(10)
set @chvnSql = @chvnSql + 'end ' + char(10)
set @chvnSql = @chvnSql + 'end ' + char(10)
--声明临时变量,因为直接在exec后面转换字符串会出错,要转换后存到变量中,再用变量当参数。
declare @chvID varchar(15)
declare @chvTopManID varchar(15)
declare @chvLevel varchar(1)
declare @chvCurrentCommentLV varchar(1)
declare @chvMaxCommentLV varchar(1)
declare @chvShrinkState varchar(1)
set @chvID = cast(@intID as varchar)
set @chvTopManID = cast(@intTopManID as varchar)
set @chvLevel = cast(@intLevel as varchar)
set @chvMaxCommentLV = cast(@intMaxCommentLV as varchar)
set @chvShrinkState = cast(@intShrinkState as varchar)
--递归调用存储过程,把返回的金额存入临时变量,然后再加到总数里。
if( @intShrinkState = 0 )
begin
--如果级别小于等于5,那么就继续读取下一级的数据
if( @intCurrentCommentLV <= @intMaxCommentLV )
begin
set @intCurrentCommentLV = @intCurrentCommentLV + 1
set @chvCurrentCommentLV= cast(@intCurrentCommentLV as varchar)
----------------------------------------------------------------------------------
--再次重新读取数据,进行递归调用。
----------------------------------------------------------------------------------
set @chvnSql = @chvnSql + 'fetch first from ' + @chvCursorString + ' into @intTempID ' + char(10)
set @chvnSql = @chvnSql + 'while @@fetch_status = 0 ' + char(10)
set @chvnSql = @chvnSql + 'begin ' + char(10)
--创建临时表,存存储过程返回的数据。
set @chvnSql = @chvnSql + 'if object_id(''' + @chvTempTableName + ''') is not null ' + char(10)
set @chvnSql = @chvnSql + 'drop table ' + @chvTempTableName + + char(10) +' else ' + char(10)
set @chvnSql = @chvnSql + 'create table ' + @chvTempTableName + ' (intID int,chvnName nvarchar(30),chvnSex nvarchar(1),
chvMobileTel varchar(15),dtmJoinDate datetime,intParentID int,intStateID int) ' + char(10)
--递归调用存储过程,把返回值先存到临时表中,然后把临时表的数据插入到真正的输出表中。
--set @chvnSql = @chvnSql + 'execute(''insert into #tblTemp exec GetSalesManByLevel @intTempID,' + @chvTopManID + ',' + @chvLevel + ',' + @chvCurrentCommentLV + ',' + @chvMaxCommentLV + ',' + @chvShrinkState + ''') '
set @chvnSql = @chvnSql + 'insert into ' + @chvTempTableName + ' exec GetSalesManByLevel @intTempID,' + @chvID + ',' + @chvLevel + ',' + @chvCurrentCommentLV + ',' + @chvMaxCommentLV + ',' + @chvShrinkState + ' ' + char(10)
--set @chvnSql = @chvnSql + 'insert into #tblTemp select * from @tblSubordinateOutPut '
--把数据存入输出表中
--set @chvnSql = @chvnSql + 'insert into @tblSubordinateOutPut select * from #tblTemp '
--丢弃临时表数据
set @chvnSql = @chvnSql + 'if object_id(''' + @chvTempTableName + ''') is not null ' + char(10)
set @chvnSql = @chvnSql + 'drop table ' + @chvTempTableName + ' ' + char(10)
set @chvnSql = @chvnSql + 'fetch next from ' + @chvCursorString + ' into @intTempID ' + char(10)
set @chvnSql = @chvnSql + 'end ' + char(10)
--关闭游标
set @chvnSql = @chvnSql + 'close ' + @chvCursorString + ' ' + char(10)
set @chvnSql = @chvnSql + 'deallocate ' + @chvCursorString + ' ' + char(10)
set @chvnSql = @chvnSql + 'select * from @tblSubordinateOutPut ' + char(10)
print(@chvnSql)
exec(@chvnSql)
end
end
else
select '0'