web-dev-qa-db-ja.com

OPENROWSETは1行だけを返します

列が1つしかない.csvファイルから値をインポートしようとしています。すべての値を1行で取得し続けます。

SELECT BulkColumn  
FROM OPENROWSET (BULK 'C:\Temp\myfile.csv', SINGLE_CLOB) MyFile

これは、ファイルコンテンツの最初の行のサンプルです。

Nummer
072XXXXXX63
072XXXXXX76
07XXXXXX66
072XXXXXX4
1
Daarwin

OPENROWSETドキュメント は、SINGLE_CLOBオプションを次のように説明しています。

内容をvarchar(max)型の単一行、単一列行セットとして返します

したがって、 STRING_SPLIT 関数(または同様の方法)を使用して文字列を複数の列に分割する必要があります。 フォーマットファイル を使用して行ターミネータを指定しますOPENROWSETの場合、または BULK INSERT を使用します。これにより、フォーマットファイルを作成せずに行終端記号を指定できます。

入力ファイルの必要に応じてFIELDTERMINATORおよびROWTERMINATORをカスタマイズすることにより、次のコードを適合させることができます。たとえば、次のコードは 提供されたサンプルファイル でテストされています。

CREATE TABLE #bulkInsert (col1 NVARCHAR(MAX) NULL)

BULK INSERT #bulkInsert
FROM 'C:\Temp\myfile.csv'
WITH (FIELDTERMINATOR = N','
    , ROWTERMINATOR = N'0x0a' /* See https://stackoverflow.com/a/26758288/1582862 */
    , BATCHSIZE = 50000
    , TABLOCK
);

-- The sample rows were correctly bulk loaded, including the header row,
-- which you can remove from your file or filter out after bulk loading
SELECT *
FROM #bulkInsert
--Nummer
--072XXXXXX63
--072XXXXXX76
--07XXXXXX66
--072XXXXXX4
3
Geoff Patterson