我有一个R代码数据框,我试图写入SQL Server中的现有表。数据框仅包含表中包含的约12列中的8列,并且数据框中的列与表中的列的顺序不同。 SQL Server抱怨是因为缺少列而其他列的数据类型错误(例如Varchar(字符串)与日期等)。
我正在查看RODBC和DBI库中的函数来将数据帧写入我的SQL Server表,但显然我必须按照表所期望的顺序排列数据框列并放置空位持有人参加缺失的专栏。
我有什么选择?
提前感谢您提供任何帮助。
答案 0 :(得分:4)
所以RODBC软件包的明显选择是sqlSave(连接,'R数据框','SQL表'),但是你知道这不起作用。在这些情况下,我使用sqlQuery()编写INSERT INTO语句。 sqlQuery(连接,“INSERT INTO sqltable(B,C)VALUES('i1',j1),('i2',j2)...”)
示例:我们有一个名为sqltable的SQL表,其中包含A,B和C列。我们有一个带有B列和B列的R数据帧。 C名为Rdf。 B是类字符,C是类数字。
首先需要在任何字符字段周围放置单引号,因为我们将使用INSERT INTO,SQL喜欢任何文本周围的单引号
Rdf$B <- paste("'",Rdf$B,"'",sep="")
接下来,我们需要格式化数据,使其看起来像insert语句的VALUES部分
formatRdf <- do.call(paste,c(Rdf,sep=","))
valuesRdf <- paste("(",paste(formatRdf,collapse="),("),")",sep="")
准备INSERT语句的最后一步
sql_statement <- paste("INSERT INTO sqltable (B,C) VALUES ",valuesRdf,sep="")
现在使用sqlQuery
sqlQuery(connection,sql_statement)
答案 1 :(得分:1)
如果您正在寻找表现,那么rsqlserver可能是最佳选择:
R的Sql Server驱动程序数据库接口(DBI)驱动程序。这是一个基于DBI的SQL Server驱动程序,基于SQL Server的.NET Framework数据提供程序(SqlClient){{1} }。
动机
SQL Server的.NET Framework数据提供程序(SqlClient)使用自己的协议与SQL Server进行通信。它非常轻巧,性能良好,因为它经过优化,无需添加OLE DB或开放式数据库连接(ODBC)层即可直接访问SQL Server。
在项目的Wiki中,您会找到System.Data.SqlClient
,RODBC
和RJDBC
的基准。
一旦你有了与数据库交谈的包,你就会遵循标准的DBI示例,因此rsqlserver
或dbWriteTable
用于创建/插入/更新。