创建一个表并从SQL Server中的csv插入数据

时间:2017-02-08 12:30:26

标签: sql-server-2008

我可以告诉批量插入命令以某种方式从.csv文件创建第一行作为列的表吗?

BULK INSERT DataExtraction
FROM '\\server03\c$\wwwroot\Filename.csv'
WITH
    (FIRSTROW = 2,
     FIELDTERMINATOR = ',',  --CSV field delimiter
     ROWTERMINATOR = '\n',   --Use to shift the control to next row
     TABLOCK
    )

1 个答案:

答案 0 :(得分:1)

我很幸运地将CSV的前1行选入TEMP表并使用动态SQL构建表。

--import the headers from the CSV. Make sure your XML is right
SELECT  TOP 1 * INTO #temp
FROM    OPENROWSET(BULK 'c:\temp\csv.csv', FORMATFILE= 'c:\temp\csv.xml') AS a

--define and set your variables, one to each column of the CSV
DECLARE @var1 VARCHAR(50)
DECLARE @var2 VARCHAR(50) 

SET @var1 = (SELECT TOP 1 col0 FROM #temp) 
SET @var2 = (SELECT TOP 1 col1 FROM #temp) 

--build your dynamic query to create Table1. Table name can also be dynamic 
declare @sql varchar(MAX) 
SET @sql = 'create table Table1 ( ' + @var1 +' varchar(50), ' +@var2+ ' varchar(50) )'

--EXECUTE your sql
EXEC (@sql)

你的XML可能看起来像(感谢Jiri Hubacek):

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="510" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="510" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="510" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="col0" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="2" NAME="col1" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="3" NAME="col2" xsi:type="SQLNVARCHAR"/>
 </ROW>
</BCPFORMAT>