web-dev-qa-db-ja.com

SQL ServerでCSVデータの最初の行を列名として設定するにはどうすればよいですか?

SQL Serverでcsvファイルを読み取るためにBULK INSERTを使用しています。ファイルを読み込んでいる間、最初の行を列名として保持する方法はありますか?

そうでない場合、csvからデータを読み取った後(2行目から)、それに列名を追加するにはどうすればよいですか?

ヘルプ/コメント/提案は大歓迎です。

4
T.H.

そうでない場合、csvからデータを読み取った後(2行目から)、それに列名を追加するにはどうすればよいですか?

ここに焦点を当てます。まず、yoruの列名、データ型などでテーブルを作成します。

create table myTable (column1 <datatype>, column2 <datatype>)

次に、一括挿入しますが、最初の行は無視します。

bulk insert myTable
   from 'C:\somefile.csv',
   with( firstrow = 2,
         fieldterminator = ',',
         rowterminator = '\n')

動的な場合は、 openrowset を調べてください。

0
scsimon

標準のCSVをインポートしていると仮定すると、次のようにテーブルを動的に作成できます。

DECLARE @sql NVARCHAR(MAX)
DECLARE @filePath NVARCHAR(MAX) = 'C:/SomeFolder/yourImportFile.csv'
DECLARE @tableName NVARCHAR(MAX) = 'yourTableName'
DECLARE @colString NVARCHAR(MAX)

SET @sql = 'SELECT @res = LEFT(BulkColumn, CHARINDEX(CHAR(10),BulkColumn)) FROM  OPENROWSET(BULK ''' + @filePath + ''', SINGLE_CLOB) AS x'
exec sp_executesql @sql, N'@res NVARCHAR(MAX) output', @colString output;

SELECT @sql = 'DROP TABLE IF EXISTS ' + @tableName + ';  CREATE TABLE [dbo].[' + @tableName + ']( ' + STRING_AGG(name, ', ') + ' ) '
FROM (
    SELECT ' [' + value + '] nvarchar(max) ' as name
    FROM STRING_SPLIT(@colString, ',')
) t

EXECUTE(@sql)

@scsimonが提案するように、データを一括挿入します。

BULK INSERT dbo.yourTableName.
FROM 'C:/SomeFolder/yourImportFile.csv'
WITH ( 
    FORMAT='CSV', 
    FIRSTROW = 2, 
    ROWTERMINATOR = '\n', 
    FIELDQUOTE= '"',
    TABLOCK  
)
1
user5480949