none
MS SQL insert RRS feed

  • 問題

  • 環境:S電腦上有A.B.C 資料庫,其中A資料庫會由A電腦大約每分鐘insert 數百筆內的資料(透過迴圈每筆寫)

    而我這隻程式在電腦B寫入的是B資料庫

    資料少量

    頂多幾十筆 幾百筆

    目前的方法是迴圈抓出每一筆紀錄

    每一筆insert

    但是測試時  insert數筆紀錄,執行SQLCommand也沒有錯誤

    但是資料庫 就是會少資料

    再用相同的資料 再寫入時 又會寫入這筆紀錄

    想請問原因


    • 已編輯 StuBoo 2017年8月7日 下午 02:40
    2017年8月7日 下午 02:38

解答

  • 您可以參考這篇文件捕捉Insert失敗的動作, 以了解烤資料的原因:

    Exception Handling in SQL Server

    • 已標示為解答 StuBoo 2017年8月16日 上午 01:25
    2017年8月8日 上午 12:28
  • 1. 檢視 SQL 有沒有寫錯,特別是愛用字串連結的特別容易掉 <-- 強烈建議改用參數查詢。

    2. 檢查 ExecuteNonQuery() 的回傳值是否為 0,0 表示沒有資料寫入 (INSERT, UPDATE) 或刪除 (DELETE)。

    3. 資料庫可能出現了一致性問題,用 DBCC CHECKDB 檢查。

    由於沒有錯誤,使用交易也不一定能解決這個問題。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 StuBoo 2017年8月16日 上午 01:25
    2017年8月8日 上午 12:59
    版主
  • StuBoo:

    你可以一筆筆對比,但是SQL提供了更好的方法,請參考:SQL數據對比自動插入刪除Merge命令

    MERGE INTO TargetTable AS T           
    USING SourceTable AS S                
       ON T.ID = S.ID   '比較主鍵                   
    WHEN MATCHED         
       THEN UPDATE SET T.DSPT = S.DSPT  
    WHEN NOT MATCHED BY TARGET   
       THEN INSERT VALUES(S.ID,S.DSPT)
    WHEN NOT MATCHED BY SOURCE            
       THEN DELETE

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report

    • 已編輯 ThankfulHeart 2017年8月9日 上午 03:44
    • 已標示為解答 StuBoo 2017年8月16日 上午 01:25
    2017年8月9日 上午 03:43
  • 1000筆,參考:http://blog.kkbruce.net/2011/01/t-sql-insertvalues.html

    理直氣和,切記。

    個人

    • 已標示為解答 StuBoo 2017年8月16日 上午 01:25
    2017年8月10日 上午 08:00

所有回覆

  • 如果產生的 SQL 都沒錯,大部分的資料庫都有提供修復功能,可以先試試看。

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年8月7日 下午 04:45
  • 您可以參考這篇文件捕捉Insert失敗的動作, 以了解烤資料的原因:

    Exception Handling in SQL Server

    • 已標示為解答 StuBoo 2017年8月16日 上午 01:25
    2017年8月8日 上午 12:28
  • 1. 檢視 SQL 有沒有寫錯,特別是愛用字串連結的特別容易掉 <-- 強烈建議改用參數查詢。

    2. 檢查 ExecuteNonQuery() 的回傳值是否為 0,0 表示沒有資料寫入 (INSERT, UPDATE) 或刪除 (DELETE)。

    3. 資料庫可能出現了一致性問題,用 DBCC CHECKDB 檢查。

    由於沒有錯誤,使用交易也不一定能解決這個問題。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 StuBoo 2017年8月16日 上午 01:25
    2017年8月8日 上午 12:59
    版主
  • 如果產生的 SQL 都沒錯,大部分的資料庫都有提供修復功能,可以先試試看。

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    1.另外想請問 如果我select多個同樣結構的資料表

    但是內容不一樣

    並且如果不同的資料表有一樣的資料列需要將資料比對並選擇一筆

    有什麼物件與方式可以比較好的整合這些資料表嗎?

    2.我想將整合完的資料寫回資料庫

    並且存在的update,多的新增,少的刪除

    有什麼好的方式嗎?

    還是只能一筆一筆讀出 預存程序內容  存在就更新 不存在就新增

    全部寫完後刪除時間較舊(=整合資料沒有)的資料?


    • 已編輯 StuBoo 2017年8月9日 上午 03:34
    2017年8月9日 上午 03:07
  • StuBoo:

    你可以一筆筆對比,但是SQL提供了更好的方法,請參考:SQL數據對比自動插入刪除Merge命令

    MERGE INTO TargetTable AS T           
    USING SourceTable AS S                
       ON T.ID = S.ID   '比較主鍵                   
    WHEN MATCHED         
       THEN UPDATE SET T.DSPT = S.DSPT  
    WHEN NOT MATCHED BY TARGET   
       THEN INSERT VALUES(S.ID,S.DSPT)
    WHEN NOT MATCHED BY SOURCE            
       THEN DELETE

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report

    • 已編輯 ThankfulHeart 2017年8月9日 上午 03:44
    • 已標示為解答 StuBoo 2017年8月16日 上午 01:25
    2017年8月9日 上午 03:43
  • StuBoo:

    你可以一筆筆對比,但是SQL提供了更好的方法,請參考:SQL數據對比自動插入刪除Merge命令

    MERGE INTO TargetTable AS T           
    USING SourceTable AS S                
       ON T.ID = S.ID   '比較主鍵                   
    WHEN MATCHED         
       THEN UPDATE SET T.DSPT = S.DSPT  
    WHEN NOT MATCHED BY TARGET   
       THEN INSERT VALUES(S.ID,S.DSPT)
    WHEN NOT MATCHED BY SOURCE            
       THEN DELETE

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report

    這是由資料庫來處理比對吧?

    那我要怎麼將我程式整合的資料表 建至 SourceTable 比較好呢? 最好又是暫存的方式


    2017年8月9日 上午 04:02
  • StuBoo:

    你可以一筆筆對比,但是SQL提供了更好的方法,請參考:SQL數據對比自動插入刪除Merge命令

    MERGE INTO TargetTable AS T           
    USING SourceTable AS S                
       ON T.ID = S.ID   '比較主鍵                   
    WHEN MATCHED         
       THEN UPDATE SET T.DSPT = S.DSPT  
    WHEN NOT MATCHED BY TARGET   
       THEN INSERT VALUES(S.ID,S.DSPT)
    WHEN NOT MATCHED BY SOURCE            
       THEN DELETE

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report

    這是由資料庫來處理比對吧?

    那我要怎麼將我程式整合的資料表 建至 SourceTable 比較好呢? 最好又是暫存的方式


    這種速度快,不容易發生錯誤。

    另外,你完全可以手動創建一個SourceTable,大不了成功后程式刪除唄。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年8月9日 上午 04:13
  • StuBoo:

    你可以一筆筆對比,但是SQL提供了更好的方法,請參考:SQL數據對比自動插入刪除Merge命令

    MERGE INTO TargetTable AS T           
    USING SourceTable AS S                
       ON T.ID = S.ID   '比較主鍵                   
    WHEN MATCHED         
       THEN UPDATE SET T.DSPT = S.DSPT  
    WHEN NOT MATCHED BY TARGET   
       THEN INSERT VALUES(S.ID,S.DSPT)
    WHEN NOT MATCHED BY SOURCE            
       THEN DELETE

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report

    這是由資料庫來處理比對吧?

    那我要怎麼將我程式整合的資料表 建至 SourceTable 比較好呢? 最好又是暫存的方式


    這種速度快,不容易發生錯誤。

    另外,你完全可以手動創建一個SourceTable,大不了成功后程式刪除唄。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report

    請問透過此種方法insert,會有筆數限制嗎?

    insert into tableA (field1,field2,field3) 

    values ('xxxa','xxxxb','xxxxc'),

    ('xxxa','xxxxb','xxxxc'),

    ('xxxa','xxxxb','xxxxc'),

    2017年8月10日 上午 07:48
  • 1000筆,參考:http://blog.kkbruce.net/2011/01/t-sql-insertvalues.html

    理直氣和,切記。

    個人

    • 已標示為解答 StuBoo 2017年8月16日 上午 01:25
    2017年8月10日 上午 08:00
  • StuBoo:

    你可以一筆筆對比,但是SQL提供了更好的方法,請參考:SQL數據對比自動插入刪除Merge命令

    MERGE INTO TargetTable AS T           
    USING SourceTable AS S                
       ON T.ID = S.ID   '比較主鍵                   
    WHEN MATCHED         
       THEN UPDATE SET T.DSPT = S.DSPT  
    WHEN NOT MATCHED BY TARGET   
       THEN INSERT VALUES(S.ID,S.DSPT)
    WHEN NOT MATCHED BY SOURCE            
       THEN DELETE

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report

    這是由資料庫來處理比對吧?

    那我要怎麼將我程式整合的資料表 建至 SourceTable 比較好呢? 最好又是暫存的方式


    這種速度快,不容易發生錯誤。

    另外,你完全可以手動創建一個SourceTable,大不了成功后程式刪除唄。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    請問我能不能在THEN 後續加入自己想執行的SQL呢?

    例如NOT MATCHED BY SOURCE 那段 我除了THEN DELETE 還想刪除其他Table 是否可以自行加入SQL

    剛測試會有問題,不知道是我語法錯誤抑或是不行?

    2017年9月19日 上午 03:20