Bcp 使用心得【轉】
在做這方面研究的時候,的確遇到了不少麻煩。
首先在做bcp的時候,要開通大數據量訪問權限
一、基於sql語句的導入導出
如果是基於SQL語句的導入導出,需要使用存儲過程“master..xp_cmdshell”,默認情況下,sql server2005、sql server2008安裝完後,xp_cmdshell是禁用的(可能是安全考慮),如果未開通,會報如下錯誤:(查詢分析器:使用xp_cmdshell需要開啟服務器的設置且需要開通賬戶的權限。這個權限DBA是不會給開啟的)
消息 15281,級別 16,狀態 1,過程 xp_cmdshell,第 1 行
SQL Server 阻止了對組件 ‘xp_cmdshell‘ 的 過程 ‘sys.xp_cmdshell‘ 的訪問,因為此組件已作為此服務器安全配置的一部分而被關閉。系統管理員可以通過使用 sp_configure 啟用 ‘xp_cmdshell‘。有關啟用 ‘xp_cmdshell‘ 的詳細信息,請參閱 SQL Server 聯機叢書中的 "外圍應用配置器"。
有兩種開關方式:
i. Sql命令開啟
-- 允許配置高級選項
EXEC sp_configure ‘show advanced options‘, 1
GO
-- 重新配置
RECONFIGURE
GO
-- 啟用xp_cmdshell
EXEC sp_configure ‘xp_cmdshell‘, 1
GO
--重新配置
RECONFIGURE
GO
--執行想要的xp_cmdshell語句
Exec xp_cmdshell ‘query user‘
GO
--用完後,要記得將xp_cmdshell禁用(出於安全考慮)
-- 允許配置高級選項
EXEC sp_configure ‘show advanced options‘, 1
GO
-- 重新配置
RECONFIGURE
GO
-- 禁用xp_cmdshell
EXEC sp_configure ‘xp_cmdshell‘, 0
GO
--重新配置
RECONFIGURE
GO
b) 圖形方式開啟
- sql2008方案、
選擇數據庫服務器,右鍵→方面→外圍應用配置器→XPCmdShellEnabled,true為啟用,false為禁用
- sql2005方案
在外圍應用配置器中設置,如下圖
c) Sds
二、基於cmd的訪問
默認情況下,只要你安裝了sql或sql的客戶端,直接用dos命令就可以訪問bcp,如果使用bcp無法訪問,說明你的環境變量path沒有配置sql server的路徑,需要加上如下路徑:C:\Program Files\Microsoft SQL Server\100\Tools\Binn(這個是我本機bcp.exe的路徑),可以依據自己的情況進行配置。
如果安裝完sql的客戶端,不重啟機器的話,用程序調用cmd去執行bcp是無法訪問的;直接在dos命令中寫bcp命令,是沒有問題的;目前的job就遇到此問題,如果大家有興趣的話,可以研究下,這個目前還不太確定。
三、 Bcp語法
代碼:
bcp {[[database_name.][owner].]{table_name | view_name} | "query"}
{in | out | queryout | format} data_file
[-m max_errors] [-f format_file] [-e err_file]
[-F first_row] [-L last_row] [-b batch_size]
[-n] [-c] [-w] [-N] [-V (60 | 65 | 70)] [-6]
[-q] [-C code_page] [-t field_term] [-r row_term]
[-i input_file] [-o output_file] [-a packet_size]
[-S server_name[\instance_name]] [-U login_id] [-P password]
[-T] [-v] [-R] [-k] [-E] [-h "hint [,...n]"]
參數database_name
指定的表或視圖所在數據庫的名稱。如果未指定,則為用戶默認數據庫。
owner
表或視圖所有者的名稱。如果執行大容量復制操作的用戶擁有指定的表或視圖,則 owner 是可選的。如果沒有指定 owner 並且執行大容量復制操作的用戶不擁有指定的表或視圖,則 Microsoft? SQL Server? 2000 將返回錯誤信息並取消大容量復制操作。
table_name
是將數據復制到 SQL Server 時 (in) 的目的表名,以及從 SQL Server 復制數據時 (out) 的源表名。
view_name
是將數據復制到 SQL Server 時 (in) 的目的視圖名,以及從 SQL Server 復制數據時 (out) 的源視圖名。只有其中所有列都引用同一個表的視圖才能用作目的視圖。有關將數據復制到視圖的限制的更多信息,請參見 INSERT。
Query
是返回一個結果集的 Transact-SQL 查詢。如果查詢返回多個結果集,例如指定 COMPUTE 子句的 SELECT 語句,只有第一個結果集將復制到數據文件,隨後的結果集被忽略。使用雙引號引起查詢語句,使用單引號引起查詢語句中嵌入的任何內容。在從查詢中大容量復制數據時,還必須指定 queryout。
in | out | queryout | format
指定大容量復制的方向。in 是從文件復制到數據庫表或視圖,out 是指從數據庫表或視圖復制到文件。只有從查詢中大容量復制數據時,才必須指定 queryout。根據指定的選項(-n、-c、-w、-6 或 -N)以及表或視圖分隔符,format 將創建一個格式文件。如果使用 format,則還必須指定 -f 選項。
說明 Microsoft SQL Server 6.5 中的 bcp 實用工具不支持大容量復制到包含 sql_variant 或 bigint 數據類型的表。
data_file
大容量復制表或視圖到磁盤(或者從磁盤復制)時所用數據文件的完整路徑。當將數據大容量復制到 SQL Server 時,此數據文件包含將復制到指定表或視圖的數據。當從 SQL Server 大容量復制數據時,該數據文件包含從表或視圖復制的數據。路徑可以有 1 到 255 個字符。
-m max_errors
指定在大容量復制操作取消之前可能產生的錯誤的最大數目。bcp 無法復制的每一行都將被忽略並計為一個錯誤。如果沒有包括該選項,則默認為 10。
-f format_file
指定格式文件的完整路徑,該格式文件包含以前在同一個表或視圖上使用 bcp 時的存儲響應。當使用由 format 選項所創建的格式文件大容量復制入或復制出數據時,使用此選項。格式文件的創建是可選的。在提示幾個格式問題之後,bcp 將提示是否在格式文件中保存回答。默認文件名為 Bcp.fmt。大容量復制數據時,bcp 可引用一個格式文件,因此不必重新交互輸入以前的回答。如果未使用此選項,也沒有指定 –n、-c、-w、-6 或 -N,則 bcp 將提示輸入格式信息。
-e err_file
指定錯誤文件的完整路徑,此錯誤文件用於存儲 bcp 無法從文件傳輸到數據庫的所有行。來自 bcp 的錯誤信息將發送到用戶工作站。如果未使用此選項,則不創建錯誤文件。
-F first_row
指定要大容量復制的第一行的序數。默認值是 1,表示在指定數據文件的第一行。
-L last_row
指定要大容量復制的最後一行的序數。默認值是 0,表示指定數據文件中的最後一行。
-b batch_size
指定所復制的每批數據中的行數。每個批處理作為一個事務復制至服務器。SQL Server 提交或回滾(在失敗時)每個批處理的事務。默認情況下,指定的數據文件中的所有數據都作為一批復制。請不要與 -h "ROWS_PER_BATCH = bb" 選項一起使用。
-n
使用數據的本機(數據庫)數據類型執行大容量復制操作。此選項不提示輸入每一字段,它將使用本機值。
-c
使用字符數據類型執行大容量復制操作。此選項不提示輸入每一字段;它使用 char 作為存儲類型,不帶前綴,\t(制表符)作為字段分隔符,\n(換行符)作為行終止符。
-w
使用 Unicode 字符執行大容量復制操作。此選項不提示輸入每一字段;它使用 nchar 作為存儲類型,不帶前綴,\t(制表符)作為字段分隔符,\n(換行符)作為行終止符。不能在 SQL Server 6.5 版或更早版本中使用。
-N
對非字符數據使用數據的本機(數據庫)數據類型和對字符數據使用 Unicode 字符類型執行大容量復制操作。這是可替代 -w 選項的性能更高的選項,其目的是使用數據文件將數據從一個 SQL Server 傳輸到另一個 SQL Server 中。它不提示輸入每一字段。在需要傳輸包含 ANSI 擴展字符的數據以及想利用本機模式的性能時,可以使用這一選項。不能在 SQL Server 6.5 版或更早版本中使用 -N 選項。
-V (60 | 65 | 70)
使用 SQL Server 早期版本中的數據類型執行大容量復制操作。此選項與字符 (-c) 或本機 (-n) 格式一起使用。此選項並不提示輸入每一字段,它使用默認值。例如,若要將 SQL Server 6.5 中的 bcp 實用工具所支持(但 ODBC 不再支持)的日期格式大容量復制到 SQL Server 2000,可使用 -V 65 參數。
重要 將數據從 SQL Server 大容量復制到數據文件時,即使指定了 –V,bcp 實用工具也不會為任何 datetime 或 smalldatetime 數據生成 SQL Server 6.0 或 SQL Server 6.5 的日期格式。日期將始終以 ODBC 格式寫入。另外,由於 SQL Server 6.5 版或更早版本不支持可為空的 bit 數據,因此 bit 列中的空值寫為值 0。
-6
使用 SQL Server 6.0 或 SQL Server 6.5 數據類型執行大容量復制操作。僅為保持向後兼容性。改為使用 –V 選項。
-q
在 bcp 實用工具和 SQL Server 實例的連接中執行 SET QUOTED_IDENTIFIERS ON 語句。使用該選項指定包含空格或引號的數據庫、所有者、表或視圖的名稱。將由三部分組成的整個表名或視圖名引在雙引號 (" ") 中。
-C code_page
僅為保持向後兼容性。作為代替,請在格式文件或交互式 bcp 中為每一列指定一個排序規則名。
指定數據文件中的數據代碼頁。只有當數據中包含字符值大於 127 或小於 32 的 char、varchar 或 text 列時,code_page 才有用。
代碼頁值 描述
ACP ANSI/Microsoft ? (ISO 1252)。
OEM 客戶程序使用的默認代碼頁。如果未指定 -C,則這是 bcp 使用的默認代碼頁。
RAW 不發生從一個代碼頁到另一個代碼頁的轉換。因為不發生轉換,所以這是最快的選項。
<值> 特定的代碼頁號碼,例如 850。
-t field_term
指定字段終止符。默認的字段終止符是 \t(制表符)。使用此參數替代默認字段終止符。
-r row_term
指定行終止符。默認的行終止符是 \n(換行符)。使用此參數替代默認行終止符。
-i input_file
指定響應文件的名稱,使用交互模式(未指定 –n、-c、-w、-6 或 -N)執行大容量復制時,響應文件包含對每一字段命令提示問題的響應。
-o output_file
指定接收 bcp 輸出(從命令提示重定向)的文件的名稱。
-a packet_size
指定發送到和發送自服務器的每個網絡數據包的字節數。可以使用 SQL Server 企業管理器(或 sp_configure 系統存儲過程)設置服務器配置選項。但是,使用此選項可以單個地替代服務器配置選項。packet_size 可以設置為 4096 到 65535 字節,默認值為 4096。
數據包大小的增加能夠提高大容量復制操作的性能。如果要求一個較大的數據包而得不到,則使用默認設置。bcp 生成的性能統計顯示出所使用數據包的大小。
-S server_name[\instance_name]
指定要連接到的 SQL Server 實例。指定 server_name 以連接該服務器上的 SQL Server 默認實例。指定 server_name\instance_name 以連接到該服務器上的 SQL Server 2000 命名實例。如果未指定服務器,則 bcp 連接到本地計算機上的 SQL Server 默認實例。從網絡上的遠程計算機執行 bcp 時,要求此選項。
-U login_id
指定用於連接到 SQL Server 的登錄 ID。
-P password
指定登錄 ID 的密碼。如果未使用此選項,則 bcp 將提示輸入密碼。如果不帶密碼將此選項用於命令提示行末尾,則 bcp 將使用默認密碼 (NULL)。
-T
指定 bcp 使用網絡用戶的安全憑據,通過信任連接連接到 SQL Server。不需要 login_id 和 password。
-v
報告 bcp 實用工具的版本號和版權。
-R
指定使用為客戶端計算機的區域設置定義的區域格式,將貨幣、日期和時間數據大容量復制到 SQL Server 中。默認情況下,將會忽略區域設置。
-k
指定在大容量復制操作中空列應保留一個空值,而不是對插入的列賦予默認值
-E
指定標識列的值出現在要導入的文件中。如果沒有給出 -E,則正導入的數據文件中此列的標識值將被忽略,而且 SQL Server 2000 會根據創建表期間指定的種子值和增量值自動指派唯一的值。如果數據文件的表或視圖中不包含標識列的值,則使用格式文件指定導入數據時應跳過表或視圖中的標識列;SQL Server 2000 將自動為該列指派唯一值。有關詳細信息,請參見 DBCC CHECKIDENT。
-h "hint [,...n]"
指定在大容量復制數據到表或視圖時所使用的提示。在大容量復制數據到 SQL Server 6.x 或更早版本時,不能使用此選項。
提示 描述
ORDER (column [ASC | DESC] [,...n]) 數據文件中數據的排序次序。如果要裝載的數據已根據表中的聚集索引排序,則會提高大容量復制的性能。如果數據文件按不同次序排序,或者該表沒有聚集索引,則將忽略 ORDER 提示。所提供的列名必須是目的表中的有效列。默認情況下,bcp 假設數據文件沒有排序。
ROWS_PER_BATCH = bb 每批中數據的行數(即 bb)。在未指定 -b 時使用,這將使整個數據文件作為單個事務發送到服務器。服務器根據值 bb 優化大容量裝載。默認情況下,ROWS_PER_BATCH 未知。
KILOBYTES_PER_BATCH = cc 每批中數據的千字節 (KB) 近似數量(即 cc)。默認情況下,KILOBYTES_PER_BATCH 未知。
TABLOCK 大容量復制操作期間將獲取表級鎖。由於只在大容量復制操作期間才控制鎖減少了表中鎖的爭奪,因此此提示可以顯著提高性能。如果表沒有索引並且指定了 TABLOCK,則該表可以同時由多個客戶端裝載。默認情況下,鎖定行為是由表選項 table lock on bulk load 決定的。
CHECK_CONSTRAINTS 大容量復制操作期間,將檢查目的表上的所有約束。默認情況下,將會忽略約束。
FIRE_TRIGGERS 與 in 參數一起指定,在目的表上定義的任何插入觸發器將在大容量復制操作期間執行。如果沒有指定 FIRE_TRIGGERS,則不執行插入觸發器。對於 out、queryout 和 format 參數,將忽略 FIRE_TRIGGERS。
註釋
將忽略要導入的數據文件中計算列或 timestamp 列的值,SQL Server 2000 自動賦值。如果數據文件不包含表中的計算列或 timestamp 列的值,可用格式文件指定應在導入數據時跳過表中的計算列和 timestamp 列;SQL Server 將自動為該列賦值。
計算列和 timestamp 列照常會從 SQL Server 大容量復制到一個數據文件。
SQL Server 標識符(包括數據庫名稱、表名或視圖名、登錄和密碼)可以包含諸如嵌入空格和引號等字符。當在命令提示符處指定包含空格或引號的標識符或文件名時,需要將該標識符引在雙引號(" ") 內。另外,對於包含嵌入空格或引號的所有者、表或視圖的名稱,可以指定 -q 選項,或者將所有者、表或視圖的名稱在雙引號內用方括號 ([ ]) 括起來。
四、 簡單示例:
導出:
導出整張表:
bcp master.dbo.spt_values out E:\b.txt -S".\SQLEXPRESS" -U"sa" -P"123456" -c
bcp master.dbo.spt_values out E:\b.txt -S".\SQLEXPRESS" -T –c
bcp master.dbo.spt_values out E: \a.dat -S".\SQLEXPRESS" -U"sa" -P"123456" -t"," -c
依據查詢整張表:
bcp "SELECT * FROM master.dbo.spt_values" queryout E:\b.txt -S".\SQLEXPRESS" -U"sa" -P"123456" -c
bcp "SELECT * FROM master.dbo.spt_values" queryout E:\b.txt -S".\SQLEXPRESS" -T -c
導入:
普通導入:bcp master.dbo. spt_values in E:\b.txt -S".\SQLEXPRESS" -U"sa" -P"123456" -c
格式化導入:
Bcp BI.dbo.tab in E:\BI固化數據\a.dat -f E:\a.fmt -S".\SQLEXPRESS" -U"sa" -P"123456" -t","
格式化:
Fmt文件
bcp SCM.dbo.tab format nul -f E:\BI固化數據\a.fmt -S"PEK7-6TKX23X\SQLEXPRESS" -U"sa" -P"123456" -c -t","
XML文件
bcp SCM.dbo.tab format nul -x -f E:\BI固化數據\t.xml -S"PEK7-6TKX23X\SQLEXPRESS" -U"sa" -P"123456 " -c -t","
查詢分析器導入導出:
導出
EXEC master..xp_cmdshell ‘bcp Caching_Test..v_v_v_V out D:\Website\BI固化數據\2013\e.txt -S"PEK7-6TKX23X\SQLEXPRESS" -U"sa" -P"[email protected]" -c -k -e -x ‘
導入
EXEC master..xp_cmdshell ‘BCP Caching_Test.dbo.vd_Day_Platform_Distinguish_Brand in D:\Website\V+平臺的數據區分品牌按日\2013\b.txt -S"PEK7-6TKX23X\SQLEXPRESS" -U"sa" -P"[email protected]" -c ‘
/******* 導出到excel
EXEC
master..xp_cmdshell
‘bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""‘
/*********** 導入Excel
SELECT
*
FROM
OpenDataSource(
‘Microsoft.Jet.OLEDB.4.0‘
,
‘Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0‘
)...xactions
/*動態文件名
declare
@fn
varchar
(20),@s
varchar
(1000)
set
@fn =
‘c:\test.xls‘
set
@s =
‘‘
‘Microsoft.Jet.OLEDB.4.0‘
‘,
‘
‘Data Source="‘
[email protected]+
‘";User ID=Admin;Password=;Extended properties=Excel 5.0‘
‘‘
set
@s =
‘SELECT * FROM OpenDataSource (‘
[email protected]+
‘)...sheet1$‘
exec
(@s)
*/
SELECT
cast
(
cast
(科目編號
as
numeric
(10,2))
as
nvarchar(255))+
‘ ‘
轉換後的別名
FROM
OpenDataSource(
‘Microsoft.Jet.OLEDB.4.0‘
,
‘Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0‘
)...xactions
/********************** EXCEL導到遠程SQL
insert
OPENDATASOURCE(
‘SQLOLEDB‘
,
‘Data Source=遠程ip;User ID=sa;Password=密碼‘
).庫名.dbo.表名 (列名1,列名2)
SELECT
列名1,列名2
FROM
OpenDataSource(
‘Microsoft.Jet.OLEDB.4.0‘
,
‘Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0‘
)...xactions
五、 使用格式化文件跳過表列 (SQL Server)
使用非 XML 格式化文件
可以修改非 XML 格式化文件以跳過某個表列。 此操作通常是使用 bcp 實用工具創建一個默認非 XML 格式化文件,並在文本編輯器中修改此默認文件。 修改過的格式化文件必須將每個現有字段映射到相應的表列並指明要跳過哪個或哪些表列。 修改默認非 XML 數據文件的方法有兩種。 兩種方法都假定數據文件中沒有數據字段,並且不會有數據插入到對應的表列中。
創建默認非 XML 格式化文件
本主題使用默認非 XML 格式化文件,此文件是使用以下 bcp 命令為 myTestSkipCol 示例表創建的:
bcp AdventureWorks2012..myTestSkipCol format nul -f myTestSkipCol_Default.fmt -c -T
以上命令創建了一個非 XML 格式化文件,myTestSkipCol_Default.fmt。 此格式化文件稱為“默認格式化文件”,因為它是 bcp 生成的格式。 默認格式化文件通常說明數據文件字段與表列之間的一一對應關系。
安全說明 |
您可能必須指定要連接的服務器實例的名稱。 可能還必須指定用戶名和密碼。 有關詳細信息,請參閱 bcp 實用工具。 |
下圖顯示了此默認格式化文件示例中的值。 圖中還顯示了格式化文件各個字段的名稱。
註意 |
有關格式化文件字段的詳細信息,請參閱非 XML 格式化文件 (SQL Server)。 |
修改非 XML 格式化文件的方法
若要跳過某個表列,可編輯默認非 XML 格式化文件並使用以下方法之一修改此文件:
- 首選方法包括三個基本步驟。 首先,刪除說明數據文件中丟失字段的任何格式化文件行。 然後,減小所刪除行後的每個格式化文件行的“宿主文件字段順序”值。 這是為了使“宿主文件字段順序”值按順序排列(1 到 n),它反映了數據文件中各個數據字段的實際位置。 最後,減小“列數”字段中的值以反映數據文件中的實際字段數。
下面的示例基於 myTestSkipCol 表的默認格式化文件,此文件是在本主題先前的“創建默認非 XML 格式化文件”中創建的。 此修改過的格式化文件將第一個數據字段映射到 Col1,並跳過 Col2 將第二個數據字段映射到 Col3。 已刪除 Col2 的行。 其他修改以粗體表示:
9.0
2
1 SQLCHAR 0 7 "\t" 1 Col1 ""
2 SQLCHAR 0 100 "\r\n" 3 Col3 SQL_Latin1_General_CP1_CI_AS
- 若要跳過某個表列,也可以修改與表列對應的格式化文件行的定義。 在此格式化文件行中,“前綴長度”、“宿主文件數據長度”和“服務器列順序”值必須設置為 0, 並且“終止符”和“列排序規則”字段必須設置為 "" (NULL)。
“服務器列名”值必須為非空白字符串,但不一定為實際列名。 其余格式字段必須為它們的默認值。
下面的示例也是從 myTestSkipCol 表的默認格式化文件派生出來的。 必須為 0 或 NULL 的值以粗體表示。
9.0
3
1 SQLCHAR 0 7 "\t" 1 Col1 ""
2 SQLCHAR 0 0 "" 0 Col2 ""
3 SQLCHAR 0 100 "\r\n" 3 Col3 SQL_Latin1_General_CP1_CI_AS
導入命令為:
bcp SCM.dbo.tab format nul -f E:\BI固化數據\a.fmt -S"PEK7-6TKX23X\SQLEXPRESS" -U"sa" -P"123456" -c -t","
參考資料:http://oylyww.i.sohu.com/blog/view/156215656.htm
http://msdn.microsoft.com/zh-cn/library/ms179250.aspx
http://msdn.microsoft.com/zh-cn/library/ms187908.aspx
http://msdn.microsoft.com/zh-cn/library/ms191175.aspx
bcp cmd訪問
#region 執行Cmd命令(前面不要加BCP,只寫後面的部分)
/// <summary> /// 執行Cmd命令(前面不要加BCP,只寫後面的部分) /// 確保服務器上已經安裝sql,否則使用不了bcp命令, /// 如果沒有安裝sqlserver需要將bcp.exe拷貝到相應目錄 /// </summary> /// <param name="commandText">命令</param> /// <param name="itemName">項目名稱</param> /// <returns></returns> public static string ExeCommand(string commandText, string itemName) { //commandText = BCP + 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; string error = ""; try { p.Start(); p.StandardInput.WriteLine(commandText); p.StandardInput.WriteLine("exit"); strOutput = p.StandardOutput.ReadToEnd(); error = p.StandardError.ReadToEnd(); p.WaitForExit(); p.Close(); } catch (Exception e) { //throw new Exception(e.Message); error = p.StandardError.ReadToEnd(); strOutput = e.Message; } if (!string.IsNullOrWhiteSpace(error)) SendEmail("BCP-JOB-錯誤:" + itemName, error + "\n" + strOutput); return error + "\n" + strOutput; }
#endregion
未解決問題:bcp將本地txt文本導入遠程sqlserver中,本地未裝sqlserver
此種方案試過之後,沒有實現預想的功能。
上次寫的bcp導入是在有sqlserver環境下進行的遠程導入,由於項目需要我做了修改,因為在開發項目中,遇到對大型數據庫導 入導出處理,客戶要求環境是web服務器、文件服務器和數據庫服務器搭配,web服務器上不允許安裝sqlserver,在沒有bcp的環境下導入大批量 的文本數據,不能直接調用cmd命令進行導入,必須引用外部bcp.exe文件來進行數據導入,引用時必須將sqlserver的bcp.exe和 bcp.rll兩個文件復制到web服務器上,如下這兩個文件我都放在項目中的compant文件夾裏:
using System; using System.Data; using System.Data.SqlClient; using System.Diagnostics; 代碼 PRivate void Page_Load(object sender, System.EventArgs e) { // 在此處放置用戶代碼以初始化頁面 Process p = new Process(); p.StartInfo.FileName = Server.MapPath("compant/bcp.exe"); p.StartInfo.UseShellExecute = false; [email protected],不然特殊字符會被自動過濾掉 p.StartInfo.Arguments = @"Test..BcpTest in D:\temp.txt -S -Usa -P1 -c -t," ; try { p.Start(); p.WaitForExit(); p.Close(); } catch {} }
應用程序服務器安裝完sql的客戶端,不重啟機器的話,用程序調用cmd去執行bcp是無法訪問的;直接在dos命令中寫bcp命令,是沒有問題的;目前的job就遇到此問題,如果大家有興趣的話,可以研究下
Bcp 使用心得【轉】