3

我正在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) 创建了表,但表是空的。

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

4

6 回答 6

3

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

于 2014-08-21T12:08:41.020 回答
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)

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

于 2013-01-07T05:04:56.417 回答
0

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

于 2011-11-21T21:28:54.957 回答
0

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

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

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

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

  2. tablenamesqlSave 中的参数不期望数据库,因此您必须写为[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)


于 2022-02-17T13:49:57.817 回答
-1

请试试这个

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

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

于 2012-04-27T16:07:10.727 回答
-1

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

于 2016-09-15T15:05:12.530 回答