以下はcsvのサンプルラインです
012,12/11/2013,"<555523051548>KRISHNA KUMAR ASHOKU,AR",<10-12-2013>,555523051548,12/11/2013,"13,012.55",
KRISHNA KUMAR ASHOKU、ARは単一のフィールドとして表示されますが、KRISHNA KUMAR ASHOKUとARは、コンマのために2つの異なるフィールドとして扱われますが、 "で囲まれていますが、まだ運がありません。
私は試した
BULK
INSERT tbl
FROM 'd:\1.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
FIRSTROW=2
)
GO
それに対する解決策はありますか?
答えは次のとおりです。それはできません。 http://technet.Microsoft.com/en-us/library/ms188365.aspx を参照してください。
「CSVファイルからのデータのインポート
SQL Serverの一括インポート操作では、カンマ区切り(CSV)ファイルはサポートされていません。ただし、場合によっては、SQL Serverへのデータの一括インポート用のデータファイルとしてCSVファイルを使用できます。 CSVデータファイルからデータをインポートするための要件については、「一括エクスポートまたはインポートのためのデータの準備(SQL Server)」を参照してください。
一般的な解決策は、CSVファイルを正常にインポートできるファイルに変換する必要があることです。さまざまな区切り文字(TABなど)を使用してファイルを作成するか、CSVファイルを理解するツール(Excelまたは多くのスクリプト言語など)を使用してテーブルをインポートし、固有の区切り文字(TABなど)。そこからBULK INSERTできます。
残念ながら、SQL Serverインポートメソッド(BCP && BULK INSERT)は ""の引用を理解できません
ソース: http://msdn.Microsoft.com/en-us/library/ms191485%28v=sql.100%29.aspx
最近この問題に遭遇し、タブ区切り形式に切り替える必要がありました。それを行い、SQL Server Management Studioを使用してインポートを実行する場合(データベースを右クリックして[タスク]を選択し、次に[インポート]を選択)、タブ区切りは正常に機能します。タブ区切りの一括挿入オプションも機能するはずです。
Microsoft SQL Serverにこのカンマ区切りの問題があることを知ったとき、私は非常に驚いたことを認めなければなりません。 CSVファイル形式は非常に古い形式であるため、これが最新のデータベースの問題であることを発見したのは非常に残念です。
MSはこの問題に対処しました。with句でFIELDQUOTEを使用して、引用符で囲まれた文字列のサポートを追加できます。
FIELDQUOTE = '"',
sQL Server 2017以降を使用している場合は、with句のどこでもトリックを実行できます。
彼らはこのSQL Server 2017(14.x)CTP 1.1のサポートを追加しました。 BULK INSERTコマンドには、FORMAT = 'CSV'入力ファイルオプションを使用する必要があります。
明確にするために、csvが問題を引き起こしているように見えるものを以下に示します。最初の行は解析が簡単で、2番目の行には引用符で囲まれたフィールド内にコンマがあるため、曲線のボールが含まれています。
jenkins-2019-09-25_cve-2019-10401,CVE-2019-10401,4,Jenkins Advisory 2019-09-25: CVE-2019-10401:
jenkins-2019-09-25_cve-2019-10403_cve-2019-10404,"CVE-2019-10404,CVE-2019-10403",4,Jenkins Advisory 2019-09-25: CVE-2019-10403: CVE-2019-10404:
壊れたコード
BULK INSERT temp
FROM 'c:\test.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0a',
FIRSTROW= 2
);
作業コード
BULK INSERT temp
FROM 'c:\test.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0a',
FORMAT = 'CSV',
FIRSTROW= 2
);