F.e. вы получили имена файлов CSV sample.csv
на D:\
диске, с этим внутри:
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
Сначала мы принимать данные как SINGLE_CLOB
с помощью OPEROWSET.
Затем мы помещаем все в переменную @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-quote-csv- file-in-sql-server), например. – Dai
Самый большой CSV-файл будет размером около 2 МБ. Данные не содержат никаких запятых или экранированных кавычек. – fila
В принципе три варианта - сначала посмотрите, работает ли BULK INSERT для ваших файлов, как было предложено.Если нет, вам может понадобиться использовать SSIS или вы можете использовать внешний процесс (например, скрипт powershell) для ввода данных. –