Sql-Server

如何將 CSV 數據的第一行設置為 SQL Server 中的列名?

  • December 12, 2019

我正在使用 BULK INSERT 讀取 SQL Server 中的 csv 文件。有沒有辦法在我讀取文件時將第一行保留為列名?

如果沒有,在從 csv(從第二行)讀取數據後,如何向其中添加列名?

非常感謝任何幫助/評論/建議。

如果沒有,在從 csv(從第二行)讀取數據後,如何向其中添加列名?

我會把你的注意力放在這裡。首先,使用 yoru 列名、數據類型等創建表。

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

然後,批量插入其中但忽略第一行。

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

如果它是動態的,那麼您可能需要查看openrowset.

假設您正在導入標準 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  
)

引用自:https://dba.stackexchange.com/questions/221805