F.e.你D:\
驅動器上得到了CSV文件名sample.csv
,這個裏面:
Heading1,Heading2,Heading3
1,Monday,2.45
2,Monday,3.765
然後你可以使用此查詢:
DECLARE @str nvarchar(max),
@x xml,
@head xml,
@sql nvarchar(max),
@params nvarchar(max) = '@x xml'
SELECT @str = BulkColumn
FROM OPENROWSET (BULK N'D:\sample.csv', SINGLE_CLOB) AS a
SELECT @head = CAST('<row><s>'+REPLACE(SUBSTRING(@str,1,CHARINDEX(CHAR(13)+CHAR(10),@str)-1),',','</s><s>')+'</s></row>' as xml)
SELECT @x = CAST('<row><s>'+REPLACE(REPLACE(SUBSTRING(@str,CHARINDEX(CHAR(10),@str)+1,LEN(@str)),CHAR(13)+CHAR(10),'</s></row><row><s>'),',','</s><s>')+'</s></row>' as xml)
SELECT @sql = N'
SELECT t.c.value(''s[1]'',''int'') '+QUOTENAME(t.c.value('s[1]','nvarchar(max)'))+',
t.c.value(''s[2]'',''nvarchar(max)'') '+QUOTENAME(t.c.value('s[2]','nvarchar(max)'))+',
t.c.value(''s[3]'',''decimal(15,7)'') '+QUOTENAME(t.c.value('s[3]','nvarchar(max)'))+'
FROM @x.nodes(''/row'') as t(c)'
FROM @head.nodes('/row') as t(c)
爲了得到這樣的輸出:
Heading1 Heading2 Heading3
1 Monday 2.4500000
2 Monday 3.7650000
起初我們在OPEROWSET的幫助下將數據作爲SINGLE_CLOB
。
然後,我們把所有在@str
變量。從開頭到第一個部分\r\n
我們把@head
,另一部分在@x
轉換成XML。結構:
<row>
<s>Heading1</s>
<s>Heading2</s>
<s>Heading3</s>
</row>
<row>
<s>1</s>
<s>Monday</s>
<s>2.45</s>
</row>
<row>
<s>2</s>
<s>Monday</s>
<s>3.765</s>
</row>
之後,我們建立一個像動態查詢:
SELECT t.c.value('s[1]','int') [Heading1],
t.c.value('s[2]','nvarchar(max)') [Heading2],
t.c.value('s[3]','decimal(15,7)') [Heading3]
FROM @x.nodes('/row') as t(c)
並執行它。變量@x
作爲參數傳遞。
希望這可以幫助你。
CSV文件有多大?如果需要,你可以假設使用Excel。請注意,'BULK INSERT'不提供真正的CSV解析器:它不支持轉義引號,甚至不支持引號值中的逗號(http://stackoverflow.com/questions/12902110/bulk-insert-correctly-quoted-csv-文件在SQL服務器)例如。 – Dai
最大的CSV文件大小約爲2MB。數據不包含任何逗號或轉義引號。 – fila
基本上有三個選項 - 首先看看BULK INSERT是否適合您的文件,如建議。如果不是,您可能需要使用SSIS,或者您可以使用外部進程(如PowerShell腳本)來推送數據。 –