1. 程式人生 > >Java調用BCP導入數據到數據庫解決標識列ID問題

Java調用BCP導入數據到數據庫解決標識列ID問題

java 導入 bcp 標識列id

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://enetq.blog.51cto.com/479739/912093

前面的一篇博文講解了調用bcp批量導出數據,對於批量導入數據則寫的不怎麽詳細,本文再詳細的介紹下一個使用技巧。對於批量導入,如果表中含有標識列,則默認會按照Sql Server 的處理方式來處理這個標識列,因此也就不是我們需要的ID值了,本文我們一起來探討下解決方法。

①要導入的數據如下:

技術分享

紅框框的則是標識列,自動增長。

但是,我們使用了

bcp sportSys.dbo.competitions in %1competitions.xls -c -T >>%2import.txt

②導入數據之後,發現數據出現了問題。

技術分享

可以很清晰的發現,ID變了,由此帶來的問題也就可想而知了,怎麽解決這個問題呢?

有人提出了下面的這種做法:

SET IDENTITY_INSERT tb ON--把顯式值插入表的標識列中。  INSERT INTO.....  SET IDENTITY_INSERT tb OFF--完成之後關閉選項

這條語句使用的時候,只能一張表一張表的導入,也就失去了批量導入的意義了。
而且直接寫在我們的bat文件中還會提示

SET IDENTITY_INSERT sportSys.dbo.compet  itions on  環境變量 IDENTITY_INSERT sportSys.dbo.competitions 沒有定義

經查閱文檔發現,bcp已經為我們提供了一個非常好的解決方法,加上-E

這個參數,即可解決標識列的問題!

下面是-E 參數的詳細介紹,

-E   Specifies that identity value or values in the imported data file are to be used for the identity column. If -E is not given, the identity values for this column in the data file being imported are ignored, and SQL Server automatically assigns unique values based on the seed and increment values specified during table creation.    If the data file does not contain values for the identity column in the table or view, use a format file to specify that the identity column in the table or view should be skipped when importing data; SQL Server automatically assigns unique values for the column. For more information, see DBCC CHECKIDENT (Transact-SQL).   The -E option has a special permissions requirement. For more information, see "Remarks" later in this topic.

如果bcp導入的時候,沒有加入-E這個參數,則對於目標表中的標識列的處理則由Sql Server 自動的來處理,因此得出的ID值就不是我們想要的了。

本文出自 “幽靈柯南的技術blog” 博客,請務必保留此出處http://enetq.blog.51cto.com/479739/912093


Java調用BCP導入數據到數據庫解決標識列ID問題