通過程序(C#)使用SQL Server 2005 BCP命令工具批量導入TXT數據

新疆華世丹葯業項目中使用到大批數據導入,參考下面2篇文章寫了個存儲過程。

=============================================================================================================

一、http://www.pczpg.com/a/2010/0727/15688.html

        bcp 實用工具可以在 Microsoft SQL Server 2005 實例和用戶指定格式的數據文件間大容量複製數據。使用 bcp 實用工具可以將大量新行導入 SQL Server 表,或將表數據導入數據文件。若要將數據導入表中,必須使用爲該表

        bcp 實用工具可以在 Microsoft SQL Server 2005 實例和用戶指定格式的數據文件間大容量複製數據。使用 bcp 實用工具可以將大量新行導入 SQL Server 表,或將表數據導入數據文件。若要將數據導入表中,必須使用爲該表創建的格式文件,或者必須瞭解表的結構以及對於該表中的列有效的數據類型。

        步驟1:打開 SQL Server 2005 配置工具中的 [Notification Services 命令提示] 工具。 

        步驟2:由Sql工具建立被導入表的格式文件,這個文件手動編輯很麻煩,可以先由Sql工具生成然後再根據需要改變裏面的內容,這個文件的主要作用是建立TXT數據和SQL表中字段的關聯和TXT文本中字段的分隔符,生成後默認保存在"SQl安裝根目錄\90\NotificationServices\9.0.242\bin\"中。

                命令:bcp 數據庫名.所有者.表名 format nul -T -c -f 自定義格式文件名稱.fmt

                註釋(區分大小寫):

                format nul 對於 format 選項,必須指定 nul 作爲 data_file (format nul) 的值。
                -T 指定 bcp 實用工具通過使用集成安全性的可信連接連接到 SQL Server。不需要網絡用戶的安全憑據、login_id 和 password。如果不指定 –T,則需要指定 –U 和 –P 才能成功登錄。
                -c 使用字符數據類型執行該操作。此選項不提示輸入每個字段;它使用 char 作爲存儲類型,不帶前綴;使用 \t(製表符)作爲字段分隔符,使用 (換行符)作爲行終止符。
                -f 指定一個格式文件的完整路徑。

        步驟3:是用bcp命令導入數據。

                命令:bcp 數據庫名.所有者.表名 in "TXT文本路徑和名稱.txt" -T -f 步驟2建立的格式文件名稱.fmt -C 1252

                註釋:
                -C 指定數據文件中數據的代碼頁。如果不設置導入的數據會出現亂碼的現象。

        步驟4:使用程序調用bcp命令,如C#,實現批量導入,bcp工具的最大優點是比sql insert 命令導入的速度快將近一百倍,令你難以置信。

        public string ExeCommand(string commandText)
        {
            Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            string strOutput = null;
            try
            {
                p.Start();
                //p.StandardInput.WriteLine(commandText);
                //p.StandardInput.WriteLine("exit");//不過要記得加上Exit要不然下一行命令執行的時候會當機。
                strOutput = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
                p.Close();
            }
            catch(Exception e)
            {
                strOutput = e.Message;
            }
            return strOutput;
        }

-----------------------------------------------------------------------------------------------------------------------------------

二、http://topic.csdn.net/u/20100121/15/65911cd3-0a84-4f41-97c3-6f75cb9fa589.html

fmt文件:
參考以下:

D:\KopLog\fmt\ 中存放文件爲Character.fmt
內容爲

8.0
11
1      SQLCHAR      0      12      "|\t|"      1    ServerID            ""
2      SQLCHAR      0      10      "|\t|"      2    LogDate      Chinese_PRC_CI_AS
3      SQLCHAR      0      50      "|\t|"      3    act_name     Chinese_PRC_CI_AS
4      SQLCHAR      0      12      "|\t|"      4    cha_id              ""
5      SQLCHAR      0      50      "|\t|"      5    cha_name     Chinese_PRC_CI_AS
6      SQLCHAR      0      50      "|\t|"      6    job          Chinese_PRC_CI_AS
7      SQLCHAR      0      7      "|\t|"      7    degree              ""
8      SQLCHAR      0      21      "|\t|"      8    exp                  ""
9      SQLCHAR      0      12      "|\t|"      9    gd                  ""
10      SQLCHAR      0      50      "|\t|"      10    operdate   Chinese_PRC_CI_AS
11      SQLCHAR      0      2000    "\r\n"  11    look           Chinese_PRC_CI_AS


數據庫表結構:

附上數據表結構
ServerID
int no 4 10  0    yes (n/a) (n/a) NULL
LogDate
char no 10         yes no yes Chinese_PRC_CI_AS
act_name
varchar no 50         yes no yes Chinese_PRC_CI_AS
cha_id
int no 4 10  0    yes (n/a) (n/a) NULL
cha_name
varchar no 50         yes no yes Chinese_PRC_CI_AS
job
varchar no 50         yes no yes Chinese_PRC_CI_AS
degree
smallint no 2 5    0    yes (n/a) (n/a) NULL
exp bigint no 8         yes (n/a) (n/a) NULL
gd
int no 4 10  0    yes (n/a) (n/a) NULL
operdate
varchar no 50         yes no yes Chinese_PRC_CI_AS
look
varchar no 2000         yes no yes Chinese_PRC_CI_AS



以下爲BCP程序:自己參考:

ALTER PROCEDURE [dbo].[KOP_GameDB_Export]   
@DBServer varchar(100) = 'localhost',   
@DBUser varchar(100) = 'sa',   
@DBPwd varchar(100)= '',   
@ServerID varchar(10) ='1'   
AS   
BEGIN   
DECLARE @LogDate varchar(10)   
DECLARE @StrSQL varchar(2000)   
DECLARE @FileName varchar(50
DECLARE @ErrorFile varchar(50)   
DECLARE @Prefix varchar(100)   
DECLARE @FilePath varchar(100)   
DECLARE @Cmd varchar(3000)   
DECLARE @CmdResult int   
DECLARE @FmtPath varchar(100)   
   
SET @FmtPath = 'D:\KopLog\fmt\'   
SET @FilePath ='D:\KopLog\Data\'   
   
SELECT @LogDate = CONVERT(varchar(8),getdate(),112)   
SELECT @Prefix = @ServerID +'| |' + @LogDate   
   
SET NOCOUNT ON   
   
SELECT @StrSQL = 'SELECT ''' +@Prefix +''',B.act_name,A.cha_id,A.cha_name,A.job,degree,A.exp,A.gd,A.operdate,RTRIM(A.look) FROM GameDB.dbo.character A  INNER JOIN GameDB.dbo.account B ON A.act_id = B.act_id WHERE A.delflag=0'   
SET @FileName=@LogDate+'_'+@ServerID+'_KOP_Character.txt'   
SET @ErrorFile=@LogDate+'_'+@ServerID+'_KOP_Character.log'   
SET @Cmd = 'bcp "' +@StrSQL +'" queryout "'+ @FilePath +@FileName +'" -S "'+ @DBServer + '" -U "' + @DBUser + '" -P "' + @DBPwd + '" -k -c -t "|\t|" -r "\n"'   
PRINT @Cmd 
EXEC @CmdResult = master..xp_cmdshell @Cmd,no_output   
IF (@CmdResult = 0)   
BEGIN   
SET @Cmd='bcp KopLogDB..KOP_Character in "' + @FilePath +@FileName +'" -f "'+@FmtPath+'Character.fmt" -T -o "' + @FilePath + @ErrorFile +'"'   
PRINT @Cmd   
EXEC @CmdResult = master..xp_cmdshell @Cmd,no_output   
END

   
SET NOCOUNT OFF   
END


執行以上存儲過程執行 第一步BCP queryout 成功,生成文件20091202_1_KOP_Character.txt
該文件執行成功有數據
現列一條數據出來:
1| |20091202| |yuyuyuxpy| |1| |*#_1_844| |0| |1| |0| |0| |2008-09-19 10:33:36.683| |112#1,2000;0,0,0,0,0,0,0,0,0,0,0;0,2554,0,0,0,0,0,0,0,0,0;0,0,0,0,0,0,0,0,0,0,0;0,0,0,0,0,0,0,0,0,0,0;0,0,0,0,0,0,0,0,0,0,0;0,0,0,0,0,0,0,0,0,0,0;0,0,0,0,0,0,0,0,0,0,0;0,0,0,0,0,0,0,0,0,0,0;0,0,0,0,0,0,0,0,0,0,0;0,0,0,0,0,0,0,0,0,0,0;4555

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章