循环插入数据

wwfxgm 2017-11-28 10:54:39
早上写了一个存储过程,但是搞不定大批量插入数据的问题。
关键就是如何一条一条记录循环插入。 批量插入,这个自增长ID。无法搞定。
--drop PROCEDURE if EXISTS P_JCB;
--GO

CREATE PROCEDURE dbo.P_JCB (
@xn VARCHAR (20) ,@xq INT )
AS
DECLARE @kcid INT ,@bID int,@jcid int --定义变量

begin TRANSACTION
--从jcb表获取学年(xn),学期(xq)的不重复班级名称,插入BJMC表
INSERT INTO dbo.BJMC (xn, xq, BJMC)
SELECT
XN,
XQ,
[班级名称]
FROM
dbo.jcb
WHERE
xn = @xn and xq=@xq
GROUP BY xn,xq,[班级名称] ;

SET @bID = @@identity;--获取插入数据的自增长ID。


--以下获取学年,学期的课程代码和课程名称,再插入kcmc表
INSERT INTO dbo.kcmc (xn, xq, kcdm, kcmc)
SELECT
XN,
XQ,
kcdm,
开设课程
FROM
dbo.JCB
WHERE
xn = @xn and xq=@xq
GROUP BY xn,xq,kcdm,开设课程
;
set @kcid = @@identity; --获取插入数据的自增长ID。

--以下获取学年,学期 不重复的教材信息 插入 JCB1表里面。
INSERT INTO dbo.JCB1 (
XN,
XQ,
ISBN,
JCMC,
CBS,
BB,
JCZZ,
XBX
)
SELECT
XN,
XQ,
教材ISBN,
教材名称,
出版社,
版别,
作者,
选必修
FROM
dbo.JCB
WHERE
xn=@xn and xq=@xq
GROUP BY xn,xq,教材isbn,教材名称,出版社,版别,作者,选必修
;
set @jcid=@@identity; --获取插入数据的自增长ID


--以下为中间表。因为是多对多关系(班级和教材关系是多对多),所以需要获取上面获取的各ID值。
INSERT INTO dbo.BJJC (xn, xq, B_ID, JC_ID, kc_ID)
VALUES(@xn,@xq,@bid,@jcid,@kcid) ;

--以下为中间表,因为是多对多关系(课程和教材,班级都是多对多),所以需要获取上面获取的各ID值。 这里我咋感觉完全没有必要这个表啊!!!
INSERT INTO dbo.kcjc (xn, xq, KC_ID, JC_ID, BJ_ID) values(@xn,@xq,@kcid,@jcid,@bid)
IF @@error = 0
BEGIN
SELECT '数据插入成功!';
COMMIT;
END
ELSE
BEGIN
ROLLBACK;
SELECT '不成功,回退';

END
...全文
225 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
文盲老顾 2017-11-28
  • 打赏
  • 举报
回复
@@identity 不好用,用SCOPE_IDENTITY(),这样每个触发器的返回值都是当前作业的内容,@@identity是所有作业的最后一次插入的值
wwfxgm 2017-11-28
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
插入的事务执行完之后再关联查询,这种关联的会出现数据变多的情况吗?如果不会试试执行批量插入:
    INSERT  INTO dbo.BJJC
            ( xn ,
              xq ,
              B_ID ,
              JC_ID ,
              kc_ID
            )
            SELECT  @xn ,
                    @xq ,
                    BJMC.ID ,
                    JCB1.ID ,
                    kcmc.ID
            FROM    BJMC
                    JOIN kcmc ON kcmc.xn = BJMC.XN
                                 AND kcmc.xq = BJMC.XQ
                    JOIN JCB1 ON JCB1.XN = BJMC.XN
                                 AND JCB1.XQ = BJMC.XQ
            WHERE   BJMC.XN = @xn
                    AND BJMC.XQ = @xq
版主。业务是这样的,我批量插入dbo.jcb表以后, 前端根据学年,学期 筛选出来以后,再插入各个表。 数据基本上是每个学期都不一样,慢慢在增加jcb里面的数据 , 当然其他各个表也要每个学期增加一次。 我这样写的设计思路是想 每次插入一条记录,那么是可以获取 @@identitiy。但是批量插入的话,这个就无法保证数据的准确性了。
二月十六 2017-11-28
  • 打赏
  • 举报
回复
插入的事务执行完之后再关联查询,这种关联的会出现数据变多的情况吗?如果不会试试执行批量插入:
    INSERT  INTO dbo.BJJC
            ( xn ,
              xq ,
              B_ID ,
              JC_ID ,
              kc_ID
            )
            SELECT  @xn ,
                    @xq ,
                    BJMC.ID ,
                    JCB1.ID ,
                    kcmc.ID
            FROM    BJMC
                    JOIN kcmc ON kcmc.xn = BJMC.XN
                                 AND kcmc.xq = BJMC.XQ
                    JOIN JCB1 ON JCB1.XN = BJMC.XN
                                 AND JCB1.XQ = BJMC.XQ
            WHERE   BJMC.XN = @xn
                    AND BJMC.XQ = @xq
wwfxgm 2017-11-28
  • 打赏
  • 举报
回复
我自己解决了。修改存储过程。用while循环,只是速度慢点。
文盲老顾 2017-11-28
  • 打赏
  • 举报
回复
或者,你在你的作业里加游标吧,凡是可能出现多组数据插入的地方都换成游标一条一条插入就可以了
吉普赛的歌 2017-11-28
  • 打赏
  • 举报
回复
对于这种批量操作,而且后续还有其它操作的,应该用程序(或其它方法)产生id , 而不是折腾标识列
wwfxgm 2017-11-28
  • 打赏
  • 举报
回复
刚才自己又修改了以下。想用循环的结构来做。不过执行是成功了,但是数据没有插入。
--drop PROCEDURE if EXISTS P_JCB;
--GO

ALTER PROCEDURE dbo.P_JCB (
	@xn VARCHAR (20) ,@xq INT ) 
AS
BEGIN 
		SET NOCOUNT ON;
    --DECLARE @userId varchar(50)
    DECLARE @count int
    SET @count = 0
    SELECT @count = count(*) FROM   dbo.JCB where xn=@xn and xq=@xq
   WHILE @count > 0
    BEGIN
		DECLARE @kcid INT ,@bID int,@jcid int  --定义变量


--从jcb表获取学年(xn),学期(xq)的不重复班级名称,插入BJMC表
			INSERT INTO dbo.BJMC (xn, xq, BJMC) 
SELECT 
	XN,
	XQ,
	[班级名称]
FROM
	dbo.jcb
WHERE
	xn  = @xn and xq=@xq
	GROUP BY xn,xq,[班级名称] ; 

SET @bID = @@identity;--获取插入数据的自增长ID。


--以下获取学年,学期的课程代码和课程名称,再插入kcmc表
INSERT INTO dbo.kcmc (xn, xq, kcdm, kcmc) 
SELECT 
		XN,
		XQ,
		kcdm,
		开设课程
	FROM
		dbo.JCB
	WHERE
		xn = @xn and xq=@xq
GROUP BY xn,xq,kcdm,开设课程
 ; 
set @kcid = @@identity;  --获取插入数据的自增长ID。

--以下获取学年,学期 不重复的教材信息 插入 JCB1表里面。
INSERT INTO dbo.JCB1 (
			XN,
			XQ,
			ISBN,
			JCMC,
			CBS,
			BB,
			JCZZ,
			XBX
		) 
SELECT 
			XN,
			XQ,
			教材ISBN,
			教材名称,
			出版社,
			版别,
			作者,
			选必修
		FROM
			dbo.JCB
		WHERE
			xn=@xn and xq=@xq
 GROUP BY xn,xq,教材isbn,教材名称,出版社,版别,作者,选必修
; 
set @jcid=@@identity;  --获取插入数据的自增长ID


--以下为中间表。因为是多对多关系(班级和教材关系是多对多),所以需要获取上面获取的各ID值。
INSERT INTO dbo.BJJC (xn, xq, B_ID, JC_ID, kc_ID) 
VALUES(@xn,@xq,@bid,@jcid,@kcid) ; 

--以下为中间表,因为是多对多关系(课程和教材,班级都是多对多),所以需要获取上面获取的各ID值。 这里我咋感觉完全没有必要这个表啊!!!
INSERT INTO dbo.kcjc (xn, xq, KC_ID, JC_ID, BJ_ID) values(@xn,@xq,@kcid,@jcid,@bid)
SET @count=@count-1
END

END
wwfxgm 2017-11-28
  • 打赏
  • 举报
回复
引用 3 楼 superwfei 的回复:
@@identity 不好用,用SCOPE_IDENTITY(),这样每个触发器的返回值都是当前作业的内容,@@identity是所有作业的最后一次插入的值
您说的有理。我这个问题还不是这个。 我上面写的语句有问题的。无法准确插入数据。也不知道问题出在哪里。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧