繁体   English   中英

SQL Server将数据从.csv批量导入到新表中

[英]SQL Server Bulk import data from .csv into new table

我似乎找不到这个相当琐碎的问题的答案。

我想将数据从.csv文件(具有未知的列数,以逗号分隔)文件批量导入到现有数据库中的新SQL Server表中。 如果表是预定义的,则BULK INSERT语句可以正常工作,但是由于我不知道.csv文件的列数,因此这是行不通的。

我试图将散装与openrowset结合使用,但无法正常工作。

顺便说一句:在这种情况下,SSIS将不是一个选择,因为我想将查询合并到R(sqlquery)或Python中。

帮助将不胜感激!

我找到了一种解决方法,使用R可以解决上述问题。 可以在其他语言中应用相同的逻辑。 我建议使用此功能的每个人都牢记上面的有用评论。

我编写了一个小函数来捕获R中的步骤:

SQLSave <- function(dbhandle, data, tablename) { 
  # Export data to temp path, for example within your SQL Server directory.
  write.csv2(data,file = "\\\\pathToSQL\\temp.csv",row.names=FALSE,na="")

  # Write first 100 rows to SQL Server, to incorporate the data structure.
  sqlSave(dbhandle, head(data,100), tablename = tablename, rownames = FALSE, safer = FALSE)

  # SQL Query to remove data in the table, structure remains:
  sqlQuery(dbhandle,paste("DELETE FROM [",tablename,"]",sep=""));

  # SQL Query to bulk insert all data from temp .csv to SQL Server
  sqlQuery(dbhandle,paste("BULK INSERT [",tablename,"]
           FROM '\\\\pathToSQL\\temp.csv'
           WITH
           (
             FIELDTERMINATOR = ';',
             ROWTERMINATOR = '\\n',
             FIRSTROW = 2,
             KEEPNULLS
           )",sep=""));

  # Delete temp file from file directory
  file.remove("\\\\pathToSQL\\temp.csv")
}

我目前正面临着同样的问题。 我首先使用批量插入读取了第一行(标题)并创建了表。 然后再次使用表2中从第2行导入的数据批量插入。 尽管您必须在检查导入的数据后更改数据类型。

CREATE TABLE #Header(HeadString nvarchar(max))

declare @TableName nvarchar(100)='byom.DenormReportingData_100_100'
DECLARE @Columns nvarchar(max)=''
declare @Query nvarchar(max)=''
DECLARE @QUERY2 NVARCHAR(MAX)=''
bulk insert #Header
from 'F:/Data/BDL_BI_Test.csv'
with(firstrow=1,lastrow=1)

select @Columns=(select quotename(value)+' VARCHAR(500)'+',' from #Header cross apply string_split(HeadString,',') for xml path(''))
if isnull(@Columns,'')<>''
begin
set @Columns = left(@Columns,len(@Columns)-1)

select @Query=@Query+'CREATE TABLE '+@TableName+' ('+@Columns+')'
exec(@QUERY)
end

select @QUERY2 =@QUERY2+'bulk insert '+@TableName+' from ''F:/Data/BDL_BI_Test.csv'' 
with(firstrow=2,FORMAT=''csv'',FIELDTERMINATOR='','',ROWTERMINATOR=''\n'')'
exec(@QUERY2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM