F.e. 첫째, 우리에
Heading1 Heading2 Heading3
1 Monday 2.4500000
2 Monday 3.7650000
:
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.45
2,Monday,3.765
그런 다음이 쿼리를 사용할 수 있습니다 : 당신이 내부에, D:\
드라이브에 CSV 파일 이름을 sample.csv
있어 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- file-in-sql-server)를 예로들 수 있습니다. – Dai
가장 큰 CSV 파일의 크기는 약 2MB입니다. 데이터에는 쉼표 또는 이스케이프 된 따옴표가 포함되어 있지 않습니다. – fila
기본적으로 세 가지 옵션 - 제안 된대로 파일에 BULK INSERT가 작동하는지 먼저 확인합니다.그렇지 않다면 SSIS를 사용해야 할 수도 있고 외부 프로세스 (예 : powershell 스크립트)를 사용하여 데이터를 넣을 수도 있습니다. –