显然,你有一个RETURN
紧随其后的声明ROLLBACK TRANSACTION
。您是否尝试过将其删除?
虽然你也可以使用重写主体TRY/CATCH
相反,像这样:
...
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
INSERT INTO STIDENT_A(SID,SNAME,SUB,MARKS)
VALUES (@SID,@SNAME,@SUB,@MARKS);
END TRY
BEGIN CATCH
-- this section must have some statement,
-- so, why not log the erroneous data to the screen at least?
PRINT @SID;
PRINT @SNAME;
PRINT @SUB;
PRINT @MARKS;
PRINT ''; -- an empty line as a delimiter
-- or, perhaps, into a table?
--INSERT INTO SomeFailLog (SID,SNAME,SUB,MARKS)
--VALUES (@SID,@SNAME,@SUB,@MARKS);
END CATCH;
FETCH NEXT FROM LOAD_DATA INTO @SID,@SNAME,@SUB,@MARKS;
END;
...
但是,如果您知道具体是什么可能导致插入失败,那么最好提出一个仅生成要插入的有效数据的语句。
例如,如果问题是某些 SIDstudent
已经存在于STIDENT_A
并且您需要忽略它们,您可以简单地尝试以下操作而不是你的程序:
INSERT INTO STIDENT_A (SID, SNAME, SUB, MARKS)
SELECT s.SID, s.SNAME, s.SUB, s.MARKS
FROM student AS s
LEFT JOIN STIDENT_A AS a ON s.SID = a.SID
WHERE a.SID IS NULL
;
如果您具体说明传输数据时可能出现的问题,我们也许能够帮助您找到专门针对该问题的最有效的解决方案。
UPDATE处理评论