久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

即使在循環中發生錯誤,如何繼續游標循環

How to continue cursor loop even error occured in the loop(即使在循環中發生錯誤,如何繼續游標循環)
本文介紹了即使在循環中發生錯誤,如何繼續游標循環的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我想將一個表的行插入到另一個表中.為此,我有以下程序.

I want to insert rows of one table into another. For that I have the below procedure.

ALTER PROCEDURE LOADDATA_a
AS 
BEGIN

TRUNCATE TABLE STIDENT_A
DECLARE @SID INT
DECLARE @SNAME VARCHAR(50)
DECLARE @SUB VARCHAR(50)
DECLARE @MARKS INT

DECLARE LOAD_DATA CURSOR FAST_FORWARD FOR  
SELECT SID,SNAME,SUB,MARKS 
FROM student 

OPEN LOAD_DATA   
FETCH NEXT FROM LOAD_DATA INTO @SID,@SNAME,@SUB,@MARKS

WHILE @@FETCH_STATUS = 0   
BEGIN
    BEGIN TRANSACTION

    INSERT INTO STIDENT_A(SID,SNAME,SUB,MARKS) VALUES (@SID,@SNAME,@SUB,@MARKS)

    IF @@ERROR != 0
    BEGIN
        ROLLBACK TRANSACTION
        RETURN
    END
    ELSE
    BEGIN
        COMMIT TRANSACTION
    END
    FETCH NEXT FROM LOAD_DATA INTO @SID,@SNAME,@SUB,@MARKS
END

CLOSE LOAD_DATA   
DEALLOCATE LOAD_DATA

END

每當一行插入失敗時,游標就會失敗并停在那里,但我需要它繼續.如何做到這一點?

Whenever a row fails to insert, the cursor fails and stops there, but I need it to continue. How to do that?

推薦答案

顯然,您在 ROLLBACK TRANSACTION 之后立即有一個 RETURN 語句.您是否嘗試將其刪除?

Apparently, you've got a RETURN statement immediately after ROLLBACK TRANSACTION. Have you tried just removing it?

盡管您也可以改用 TRY/CATCH 重寫正文,如下所示:

Although you could also rewrite the body using TRY/CATCH instead, like this:

...
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;
...

但是,如果您知道具體是什么導致插入失敗,那么提出一條僅生成有效數據以進行插入的語句可能會更好.

But if you know what specifically may cause the inserts to fail, it might be even better to come up with a single statement that would produce only valid data to insert.

例如,如果問題是 student 中的某些 SID 已經存在于 STIDENT_A 中,而您需要忽略它們,您可以簡單地嘗試以下 您的程序:

For instance, if the issue is that some SIDs in student already exist in STIDENT_A and you need to omit them, you could simply try the following instead of your procedure:

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
;

如果您在傳輸數據時具體說明可能出現的問題,我們或許能夠幫助您找到最有效的解決方案.

If you specify what exactly may be the issue while transferring your data, we might be able to help you with finding the most efficient solution specifically for that.

更新處理評論

如果問題是STIDENT_ASNAME的最大長度小于student中同名列的最大長度和一些值可能不適合,您可以簡單地使用過濾器(WHERE 子句)將插入的行限制為 SNAME 的實際長度不超過某個值的行:

If the issue is that the maximum length of SNAME in STIDENT_A is less than that of the same name column in student and some values may not fit, you could simply use a filter (a WHERE clause) to limit the inserted rows to those where the actual length of SNAME does not exceed a certain value:

INSERT INTO STIDENT_A (SID, SNAME, SUB, MARKS)
SELECT SID, SNAME, SUB, MARKS
WHERE LEN(SNAME) <= @maxlength
;

您可以查詢元數據以確定所需列的最大長度.有多種方式,一種是使用sys.columns系統目錄:

You could query the metadata to determine the maximum length of the required column. There are various ways, one is to use the sys.columns system catalog:

DECLARE @maxlength int;
SELECT @maxlength = max_length
FROM sys.columns
WHERE object_id = OBJECT_ID('STIDENT_A')
  AND name = 'SNAME'
;

要確定哪些行無法插入:

To determine which rows could not be inserted:

INSERT INTO STIDENT_A (SID, SNAME, SUB, MARKS)
SELECT SID, SNAME, SUB, MARKS
WHERE LEN(SNAME) > @maxlength
;

這篇關于即使在循環中發生錯誤,如何繼續游標循環的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

SQL - Select all when filter value is empty(SQL - 過濾器值為空時全選)
How and where do I set the MAXRECURSION option?(如何以及在何處設置 MAXRECURSION 選項?)
TABLOCKX versus SERIALIZABLE(TABLOCKX 與可序列化)
TSQL Constants... Use Variable or Literal?(TSQL 常量...使用變量還是文字?)
TSQL RIGHT String function not working(TSQL RIGHT 字符串函數不起作用)
What is the comparative speed of temporary tables to physical tables in SQL?(SQL中臨時表與物理表的比較速度是多少?)
主站蜘蛛池模板: 成人性视频在线播放 | 福利社午夜影院 | 亚洲成人网在线 | 亚洲欧美自拍偷拍视频 | 国产在线网站 | 精品三区| 国产乱码精品一区二区三区忘忧草 | 国产成在线观看免费视频 | 久久久久亚洲 | 日韩高清中文字幕 | 毛片高清 | 丝袜一区二区三区 | 日本一区二区三区四区 | 国产精品免费看 | 激情小视频 | 日本在线看片 | 久久久久国产精品一区 | 精品国产欧美一区二区三区成人 | 亚洲精品1| 成人小视频在线观看 | 国产1区在线| 国产精品高清一区二区三区 | 不卡视频一区二区三区 | 亚洲精品欧美一区二区三区 | 欧美视频福利 | 国产成人精品999在线观看 | 成人欧美日韩一区二区三区 | 日韩精品欧美精品 | 国产 日韩 欧美 中文 在线播放 | 日韩精品久久久 | 国产一级视屏 | 亚洲精品99| 成人精品 | 欧美人人 | 久久午夜国产精品www忘忧草 | 国产成人久久 | 国产精品久久久久久久免费观看 | 成人午夜精品 | 久久精品一区 | 日日夜夜精品视频 | av日韩在线播放 |