我似乎无法找到这个相当微不足道的问题的答案。
我想将数据从.csv
文件(具有未知数量的列,逗号分隔)文件批量导入现有数据库中的新SQL Server表。如果表是预定义的,BULK INSERT
语句可以正常工作,但由于我不知道.csv
文件的列数,所以这不起作用。
我试图将open与openrowset结合使用,但无法使其正常工作。
顺便说一句:在这种情况下,SSIS不会是一个选项,因为我想将查询合并到R(sqlquery)或Python中。
帮助将受到高度赞赏!
答案 0 :(得分:0)
我找到了一个解决方法,使用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")
}
答案 1 :(得分:0)
我目前正面临着同样的问题。我首先使用批量插入读取了第一行(标题)并创建了表。然后再次使用表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)