我在使用RODBC的sqlSave创建表时遇到了麻烦(或更准确地说,是将数据写入到创建的表中)。
这与现有的sqlSave问题/答案不同,因为
我在Windows RDP上使用MS SQL Server 2008和64位R。
我有一个简单的数据框,只有1列,包含3、4或5位整数。
> head(df) colname 1 564 2 4336 3 24810 4 26206 5 26433 6 26553
当我尝试使用sqlSave时,没有数据写入表。此外,一条错误消息听起来好像无法创建该表,尽管该表实际上是用0行创建的。
根据我发现的建议,我已经尝试在运行sqlSave之前关闭并重新打开RODBC连接。即使使用append = TRUE,我也尝试在删除表之前执行此操作,但这不会影响任何操作。
append = TRUE
> sqlSave(db3, df, table = "[Jason].[dbo].[df]", append = TRUE, rownames = FALSE) Error in sqlSave(db3, df, table = "[Jason].[dbo].[df]", : 42S01 2714 [Microsoft][ODBC SQL Server Driver][SQL Server]There is already an object named 'df' in the database. [RODBC] ERROR: Could not SQLExecDirect 'CREATE TABLE [Jason].[dbo].[df] ("df" int)'
创建表后,我还尝试在表上使用sqlUpdate()。不管是在R还是SQL Server Management Studio中创建它,都会收到错误消息table not found on channel
table not found on channel
最后,请注意,在创建新表时以及不使用rownames选项的情况下,我也尝试了不使用append = TRUE的情况。
来自Freenode的#R的Mr.Flick先生让我检查了是否可以使用sqlQuery读取空表,并且确实可以。
更新
我已经完成了以下步骤:
table =
tablename =
GO
CREATE TABLE [dbo].[testing123]( [Person_DIMKey] [int] NULL ) ON [PRIMARY]
CREATE TABLE [dbo].[testing123](
[Person_DIMKey] [int] NULL
) ON [PRIMARY]
在sqlUpdate与我的新ODBC连接一起使用的RI中,表名周围没有括号
sqlUpdate
现在,sqlUpdate()可以看到该表,但是它抱怨它需要一个唯一的列
指示表中的唯一列是唯一列,并index = colname导致错误提示该列不存在
index = colname
我删除并重新创建了指定主键的表,
CREATE TABLE [dbo].[jive_BNR_Person_DIMKey]( [jive_BNR_Person_DIMKey] [int] NOT NULL PRIMARY KEY ) ON [PRIMARY]
CREATE TABLE [dbo].[jive_BNR_Person_DIMKey](
[jive_BNR_Person_DIMKey] [int] NOT NULL PRIMARY KEY
生成名为“主键”和“索引”(根据SQL Sever Management Studio的GUI界面)的文件 PK__jive_BNR__2754EC2E30F848ED
PK__jive_BNR__2754EC2E30F848ED
Error in sqlUpdate(db4, jive_BNR_Person_DIMKey, tablename = "jive_BNR_Person_DIMKey", : index column(s) PK__jive_BNR__2754EC2E30F848ED not in database table
Error in sqlUpdate(db4, jive_BNR_Person_DIMKey, tablename = "jive_BNR_Person_DIMKey", :
index column(s) PK__jive_BNR__2754EC2E30F848ED not in database table
为了记录,我为索引指定了正确的列名(而不是“ colname”);感谢MrFlick要求澄清。
另外,这些步骤在我的帖子中编号为1到7,但是当列表显示时,StackOverflow会重置列表的编号几次。如果有人可以帮助我清理这篇文章的这一方面,我将不胜感激。
重新阅读RODBC幕之后,下面是起作用的简单解决方案:
sqlDrop(db, "df", errors = FALSE) sqlSave(db, df)
完毕。
经过数天的尝试后,似乎问题出在使用附加选项,特别是table =或等效地tablename =。这些应该是有效的选项,但是以某种方式它们会导致我的RStudio特定版本((Windows,64位,桌面版本,当前版本),R(Windows,64位,v3)和/或MS SQL Server 2008)引起问题。
sqlSave(db, df)也没有工作,sqlDrop(db, "df")如果表从来没有存在过,但作为最佳实践我写try(sqlDrop(db, "df", errors = FALSE), silent = TRUE)的所有之前sqlSave在我的代码语句。
sqlSave(db, df)
sqlDrop(db, "df")
try(sqlDrop(db, "df", errors = FALSE), silent = TRUE)
sqlSave