【发布时间】:2014-07-17 19:04:09
【问题描述】:
我在使用 RODBC 的 sqlSave(或者更准确地说,将数据写入创建的表)创建表时遇到问题。
这与现有的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,我也尝试在执行此操作之前删除表,但它不会影响任何内容。
> 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
最后,请注意,我在没有 append = TRUE 的情况下以及在创建新表时以及使用和不使用 rownames 选项时也尝试过。
来自 Freenode 的#R 的 Mr.Flick 让我检查是否可以使用 sqlQuery 读取空表,确实可以。
更新
我已经通过以下步骤更接近了:
- 我创建了一个 ODBC 连接,它直接连接到我的 SQL Server 中的数据库,而不是只连接到默认(主)数据库,然后在
table =或tablename =语句中指定表的路径 - 在 SQL Server Management Studio 中创建表如下
GO
CREATE TABLE [dbo].[testing123](
[Person_DIMKey] [int] NULL
) ON [PRIMARY]
GO
在 R 中,我将
sqlUpdate与我的新 ODBC 连接一起使用,并且表名周围没有括号现在 sqlUpdate() 可以看到该表,但它抱怨它需要一个唯一的列
指示表中唯一的列是具有
index = colname的唯一列会导致错误提示该列不存在我删除并重新创建了指定主键的表,
GO
CREATE TABLE [dbo].[jive_BNR_Person_DIMKey](
[jive_BNR_Person_DIMKey] [int] NOT NULL PRIMARY KEY
) ON [PRIMARY]
GO
它生成了一个名为PK__jive_BNR__2754EC2E30F848ED的主键和索引(根据SQL Sever Management Studio的GUI界面)
- 我在 sqlUpdate() 中将此索引/键指定为唯一列,但出现以下错误:
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 在列表显示时会重置几次列表的编号。如果有人可以帮助我清理这篇文章的这方面,我将不胜感激。
【问题讨论】:
-
我重新打开它是因为我认为@Andrie 可能有点草率。潜在的duplicate 没有任何明确的答案,而且您似乎已经尝试过那里的主要建议。
-
请注意,对于无法访问您的数据库的人来说,这类问题可能很难解决。 (至少对于可能是也可能不是数据库专家的 R 人来说。)一种可能性是 R 正在尝试追加,但不知何故,表结构与您的数据框不够匹配,因此它正在尝试创建一个新的失败,因为存在同名的表。
-
很公平。我也试过没有 append = TRUE 并创建一个新表,我遇到了同样的问题。
-
谢谢,@joran 我仍然不习惯这些新的超级大国。我想标记重复项,而不是完全取消问题。
标签: sql sql-server r sql-server-2008 rodbc