2015-10-31 101 views
3

我有一個要求將大的2 GB CSV文件插入我的MS SQL數據庫。大部分的行不需要插入。在進行批量插入時,我沒有找到任何要過濾的行。我正在使用MS SQL批量插入命令來執行此操作。是否有任何選項可以在批量插入上過濾mySQL/MSSQL/Oracle上的行?MS SQL批量插入

BULK INSERT payroll.t_allowance 
    FROM 'f:\orders\lineitem.csv' 
    WITH 
     (
     FIELDTERMINATOR =' |', 
     ROWTERMINATOR =' |\n' 
    ); 
+0

@suchit您的編輯失敗。當然,這使得代碼變得很漂亮,但是把英文放在了頂部,並且把它弄糟了。 「沒有找到任何可以使用的東西......」嗯? 'Builter',那是什麼? – zipzit

+1

如何批量插入並刪除不需要的行 – BICube

+0

在導入之前是否可以過濾行?要麼使用腳本語言,要麼使用type + find? –

回答

3

您可以使用OPENROWSETBULK選項:

SELECT * 
FROM OPENROWSET(BULK 'f:\orders\lineitem.csv', 
       FORMATFILE= 'f:\orders\format.xml') AS a 
WHERE ... 

format.xml可以在其中配置定界符,列名,文件終止等:https://msdn.microsoft.com/en-us/library/ms178129.aspx

0

使用OPENROWSET(BULK...)是要走的路,假設您不能預先過濾文件。

INSERT INTO table1 (col1, col2, ..., colN) 
SELECT col1, col2, ..., colN 
FROM OPENROWSET(BULK '<data_file_name>.txt', FORMATFILE = '<format_file_name>.xml') AS a 
WHERE ... 

作爲一個附帶的好處是,你可以選擇使用功能和查找表文件轉換數據,並添加連接到其他表進行過濾,但你必須牢記的性能影響。

INSERT INTO table1 (col1, col2, ..., colN) 
SELECT a.col1, a.col2, ..., a.colN 
FROM OPENROWSET(BULK '<data_file_name>.txt', FORMATFILE = '<format_file_name>.xml') AS a 
INNER JOIN ... 
ON ... 
LEFT JOIN ... 
ON ... 
WHERE ... 

Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...)

注意,使用OPENROWSET(BULK...)會要求您創建一個XML或非XML格式的格式文件。這兩種文件格式都可能很難用手寫入,並且容易出錯。如果您可以從生成的文件開始並進行必要的修改,那麼您的工作將變得更加輕鬆。使用bcp程序生成格式文件。首選XML格式(-x參數)。

bcp <table_or_view> format nul -f<format_file_name>.xml -x

Create a Format File

1

爲了避免格式文件的複雜性,以及與其他一些權衡,你可以創建一個臨時表,BULK INSERT臨時表,並使用INSERT...SELECT加載目標表從臨時表中。

-- Create a temporary staging table with the same column names and data types, but no indexes 
-- Alternatively, use CREATE TABLE 
-- When using a permanent table, use TRUNCATE TABLE 
SELECT * 
INTO #stage 
FROM payroll.t_allowance 
WHERE 1 = 0; 

-- Bulk load the staging table 
-- Use the TABLOCK hint to achieve minimally logged inserts 
BULK INSERT #stage 
FROM 'f:\orders\lineitem.csv' 
WITH (TABLOCK, FIELDTERMINATOR = ' |', ROWTERMINATOR = ' |\n'); 

-- Load the target table from the staging table 
INSERT INTO payroll.t_allowance 
SELECT s.* 
FROM #stage AS s 
WHERE...; 

-- Drop the staging table 
-- or use TRUNCATE TABLE for a permanent table 
DROP TABLE #stage;