新疆華世丹葯業項目中使用到大批數據導入,參考下面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