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- file-in-sql-server)を使用します。 – Dai
最大のCSVファイルのサイズは約2MBです。データにはカンマまたはエスケープされた引用符は含まれません。 – fila
基本的に3つのオプション - 最初に、BULK INSERTがあなたのファイルに対してうまく動作するかどうかを確認してください。そうでない場合は、SSISを使用する必要があるかもしれませんし、(PowerShellスクリプトのような)外部プロセスを使用してデータをプッシュすることもできます。 –