sql2000中,临时表循环插入数据需要指定插入列,否则会报错

USE [hdykxin]
GO

/****** Object:  StoredProcedure [dbo].[pro_StudentExamScores]    Script Date: 08/27/2012 00:13:44 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[pro_StudentExamScores] 
	-- Add the parameters for the stored procedure here
	@examId int --传入考试ID
AS
BEGIN
	set nocount on
	begin transaction
	declare @courses varchar(100), --班级定义考试课程列表
		    @index int,--当前下标
		    @activeCourse int, --当前课程
		    @length int, --字符串长度
		    @resultAction int --返回操作结果 1:成功 0:失败
	
	select @courses=[class].coursePlan from h_kscj_exam exam
	left join h_jxgl_ClassInfo [class] on exam.classid=[class].Id
	where exam.id=@examId
	select @length=LEN(@courses) --初始化LENGTH
	if @length is not null and @length>0
	begin
		
		select @index=CHARINDEX(',',@courses) --初始化INDEX
		while @index>0
		begin
			select @activeCourse=SUBSTRING(@courses,1,@index-1)--取得课程
			select @courses=SUBSTRING(@courses,@index+1,@length)--去掉已经取得的课程
			select @index=CHARINDEX(',',@courses)--更新index
			
			--计算科目排名,并记录入数据库
			if @activeCourse>0
			begin
				create table #scoreTable  --创建临时表#scoreTable 用来进行排名
				(
					ID   int IDENTITY (1,1) PRIMARY KEY  not null, -- 排名
					ScoreId int --考试科目成绩ID
				);
				
				
				insert into #scoreTable(ScoreId) 
				select cj.id as ScoreId
				from h_kscj_cjRecords cj
				left join h_jxgl_kcManage kc on cj.SubjectId=kc.Id
				where SubjectId=@activeCourse and ExamId=@examId
				order by Score desc
				
				--每次插入数据之后删除临时表,保证排名从1开始
				insert into h_kscj_examRanking
				select ScoreId,ID from #scoreTable
				drop table #scoreTable
				
			end
			
		end
		--总分数排名
		create table #SumscoreTable  --创建临时表#scoreTable 用来进行排名
				(
					ID   int IDENTITY (1,1)     not null, -- 排名
					ScoreId int --考试科目成绩ID
				);
				
				insert into #SumscoreTable(ScoreId) 
				select cj.id as ScoreId
				from h_kscj_cjRecords cj
				left join h_jxgl_kcManage kc on cj.SubjectId=kc.Id
				where SubjectId=0 and ExamId=@examId
				order by Score desc
				
				--每次插入数据之后删除临时表,保证排名从1开始
				insert into h_kscj_examRanking
				select ScoreId,ID from #SumscoreTable
				drop table #SumscoreTable
				
	end
	
	if(@@error>0)
		begin 
		select @resultAction=0
		rollback transaction
		end
	else
		begin 
		select @resultAction=1
		commit transaction
		end
	
    -- 最后的查询结果
	select @resultAction as result
END


GO

  结果会导致错误:“当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'products' 中的标识列插入显式值。”

原文地址:https://www.cnblogs.com/encore620/p/2657883.html