2017-08-04 87 views
1

我想使用SQL代碼自動導入多個CSV文件(即不使用GUI)。通常,我知道我的CSV文件的尺寸。因此,在很多情況下,我創建了一個空表,例如x列與相應的數據類型。然後,我使用BULK INSERT將CSV文件導入到此表中。但是,在這種情況下,我對我的文件瞭解不多,即沒有提供有關數據類型和維度的信息。將CSV導入SQL(CODE)

要summerize該問題:

我接收的文件路徑,例如C:\ DATA.csv。然後,我想在SQL代碼中使用此路徑將文件導入到表中,而無需瞭解任何內容。

有關如何解決此問題的任何想法?

+0

您不能,csv和表列必須完全匹配。如果您不知道尺寸,則無法定義目標表。如果**必須**,則可以嘗試將其全部插入到一列表格中,並嘗試從中提取列。但是你應該爲此寫一個聰明的工具。 – HoneyBadger

+0

我已停止嘗試使用SQL導入CSV文件,並且已切換到Powershell。恕我直言,只是一個簡單的方法來完成這項任務,我可以利用我的.Net技能。 –

+0

我也是,PS很棒:) – SAS

回答

2

使用這樣的事情:

BULK INSERT tbl 
FROM 'csv_full_path' 
WITH 
(
FIRSTROW = 2, -- secopnd row if header row in file 
FIELDTERMINATOR = ',', --CSV field delimiter 
ROWTERMINATOR = '\n', --Use to shift the control to next row 
ERRORFILE = 'error_file_path', 
TABLOCK 
) 

如果coulmns不知道,你可以嘗試使用:

select * from OpenRowset 

或者,做批量插入僅第一行作爲一個大列,然後解析它以創建動態主插入。或者批量將整個文件插入只有一列的表格中,然後解析。

+0

Thx;然而,這段代碼要求我事先創建表tbl,對吧?我可以自動執行此操作,而無需爲每個CSV文件手動創建表格? – SWDQ

+0

你可以動態地做,我添加了一些建議。 – SAS

+0

請問您是否可以詳細說明如何解析一個大列。這個解決方案聽起來很有趣,它可能會解決我的問題。非常感謝你。 – SWDQ

0

您可以使用OPENROWSETdocumantation)。

SELECT * 
INTO dbo.MyTable 
FROM 
OPENROWSET(
    BULK 'C:\...\mycsvfile.csv', 
    SINGLE_CLOB) AS DATA; 

此外,您可以使用動態SQL參數化csv文件的表名稱和位置。