sqlSave 出错

Posted

技术标签:

【中文标题】sqlSave 出错【英文标题】:Error with sqlSave 【发布时间】:2011-11-15 20:30:11 【问题描述】:

我正在与 sqlSave 战斗以添加我的矩阵 B,如下所示:

Noinscr
88877799
45645687
23523521
45454545

到一个 SQL 表。

所以我运行以下命令:

sqlSave(channel, b, "[testsFelix].[dbo].[TREB]", append = TRUE,
  rownames = FALSE, colnames = FALSE, safer = TRUE, fast = FALSE)

我收到以下错误:

Erreur dans sqlSave(channel, b, "[testsFelix].[dbo].[TREB]", append = TRUE,  : 
  42S01 2714 [Microsoft][SQL Server Native Client 10.0][SQL Server]
    There is already an object named 'TREB' in the database.
  [RODBC] ERROR: Could not SQLExecDirect
    'CREATE TABLE [testsFelix].[dbo].[TREB]  ("Noinscr" int)'

看到它不想擦除表,即使有append=TRUE,我也尝试擦除我的SQL表并再次运行相同的代码。

我收到以下错误:

Erreur dans sqlColumns(channel, tablename) : 
  ‘[testsFelix].[dbo].[TREB]’: table not found on channel

所以我很困惑,当我想附加 R 说它不能因为表在那里而当表不在那里时,R 说它不能把信息放进去,因为表不在那里。我进入 SQL 以验证没有发生任何事情,但我看到 R 使用正确的列名 (Noinscr) 创建了表,但表是空的。

请告诉我我做错了什么。 谢谢

【问题讨论】:

给我们一个可重现的例子。 【参考方案1】:

我遇到了同样的问题。我意识到默认情况下 sqlSave 会在“主”模式中创建表。我启动了 ODBC 数据源管理器并更改了默认数据库并选择了所需的数据库并且它工作。

【讨论】:

【参考方案2】:

我发现这篇文章在谷歌上搜索了类似的问题。重新启动R 并重新启动系统后问题仍然存在。我通过打开与不同数据库的新连接,并使用sqlSave 写入该连接,将问题缩小到数据库。

奇怪的是,原始数据库的问题通过使用R打开和关闭它得到了纠正:

DBchannel <- odbcConnectAccess(access.file = "C:/myPath/Data.mdb")
odbcClose(DBchannel)

完成此操作后,以下测试工作正常:

require(RODBC)
dd <- data.frame('normal' = rnorm(100), 'uniform' = runif(100))
DBchannel <- odbcConnectAccess(access.file = "C:/myPath/Data.mdb")
sqlSave(DBchan, dd, tablename='testtable')
odbcClose(DBchannel)

(这很好,因为我最初的(非)解决方案是重新构建数据库)

【讨论】:

【参考方案3】:

我和你有同样的问题。我可以调用 odbcQuery 逐行插入数据。但是,我的 data.frame 有数十万行。这是一种通过插入来缓和的。如果你的数据集不大,可以试试。

【讨论】:

【参考方案4】:

问题是您将tablename 参数写为 "[testsFelix].[dbo].[TREB]",而您必须将其写为 "[dbo].[TREB]" 省略数据库。

您必须将您的 odbc 频道的数据库更改为您感兴趣的数据库。在 Microsoft 的 odbc 管理员中。也许问题在于默认数据库与[testsFelix]不同

因此我对你的问题的解决方案是

    通过 odbc 管理员在 Microsoft 中将您频道的数据库更改为 [testsFelix]

    sqlSave中的tablename参数不期望数据库,所以你必须写成[schema].[tablename]sintaxis

sqlSave(channel, b, "[dbo].[TREB]", append = TRUE,
  rownames = FALSE, colnames = FALSE, safer = TRUE)

顺便说一句。在我的情况下,在 1000 个观察值的块中插入值会更快。

试一试:

vals = paste0("('", b$Field1   , "','",
                    b$Field2   , "','",
                    b$Field3   , "','",
                    b$lastField, "')", collapse = ",")


sqlQuery(channel, 
         query = paste0("INSERT INTO [testsFelix].[dbo].[TREB] 
                         values", vals), as.is = TRUE)


【讨论】:

【参考方案5】:

请试试这个

sqlSave(channel, b, "_b", append = TRUE,
    rownames = FALSE, colnames = FALSE, safer = TRUE, fast = FALSE)

我发现Excel会在默认文件名前加一个“_”,如果你把这个加到文件名里,Excel就会找到表格。

【讨论】:

从错误信息来看,似乎连接的是 SQL 服务器,而不是 Excel 文件。【参考方案6】:

您必须删除括号 ([]),然后它应该可以正常运行。

【讨论】:

以上是关于sqlSave 出错的主要内容,如果未能解决你的问题,请参考以下文章

RODBC 错误:SqlSave 无法附加到表

如何将 sqlSave 函数与 R 中的现有表一起使用

无法在 R 中使用 sqlSave 追加到 SQL Server 表

如何跳过 sqlSave() 命令中的主键?

RODBC::sqlSave() 创建表,警告:在列中截断为 255 个字节?

RODBC sqlSave 崩溃 R 前端