RODBC sqlSave表创建问题

Hac*_*k-R 8 sql sql-server r sql-server-2008 rodbc

我在使用RODBC的sqlSave创建表时遇到了麻烦(或者更准确地说,是将数据写入创建的表).

这与现有的sqlSave问题/答案不同,如

  1. 他们遇到的问题是不同的,我可以创建表,而他们不能和
  2. 我已经无法合并他们的解决方案,例如在运行sqlSave之前关闭和重新打开连接
  3. 错误消息不同,唯一的例外是上述两种方式不同的帖子

我在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
Run Code Online (Sandbox Code Playgroud)

当我尝试使用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)'
Run Code Online (Sandbox Code Playgroud)

一旦创建了表,我也尝试在表上使用sqlUpdate().如果我在R或SQL Server Management Studio中创建它并不重要,我得到错误table not found on channel

最后,请注意我在没有append = TRUE的情况下尝试了这个,并且在创建新表时,以及使用和不使用rownames选项.

来自Freenode #R的Mr.Flick让我检查一下我是否可以使用sqlQuery读取空表,事实上,我可以.

更新

我已经通过以下步骤更加接近了:

  1. 我创建了一个ODBC连接,它直接进入SQL Server中的数据库,而不是仅仅到默认(主)数据库,然后在table =tablename =语句中指定表的路径
  2. 在SQL Server Management Studio中创建表,如下所示

GO

CREATE TABLE [dbo].[testing123]( [Person_DIMKey] [int] NULL ) ON [PRIMARY]

GO

  1. 在RI中使用sqlUpdate我的新ODBC连接,并且在表名周围没有括号

  2. 现在sqlUpdate()看到了表,但它抱怨它需要一个唯一的列

  3. 指示表中唯一的列是唯一列,index = colname导致错误表明该列不存在

  4. 我删除并重新创建了指定主键的表,

GO

CREATE TABLE [dbo].[jive_BNR_Person_DIMKey]( [jive_BNR_Person_DIMKey] [int] NOT NULL PRIMARY KEY ) ON [PRIMARY]

GO

它生成了一个主键和索引(根据SQL Sever Management Studio的GUI界面)命名 PK__jive_BNR__2754EC2E30F848ED

  1. 我将此索引/键指定为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在显示时重置列表的编号几次.如果有人能帮我清理这篇文章的这一方面,我会很感激.

Hac*_*k-R 9

重新阅读RODBC vingette后,这是一个简单的解决方案:

sqlDrop(db, "df", errors = FALSE)
sqlSave(db, df)
Run Code Online (Sandbox Code Playgroud)

完成.

在经过几天的实验之后,似乎问题源于使用其他选项,特别是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语句之前编写的最佳实践.


d84*_*nj4 7

经过几个小时的工作,我终于能够在指定表名时让sqlSave工作 - 深呼吸,从哪里开始.以下是我为使其工作而做的事情列表:

  • 打开32位ODBC管理器并创建用户DSN并为您的特定数据库配置它.在我的情况下,我正在创建一个全局临时表,所以我链接到tempdb.在您的odbcConnection(Name).中使用此连接名称.这是我的代码myconn2 <- odbcConnect("SYSTEMDB").
  • 然后我使用以下代码定义了我的数据类型:columnTypes <- list(Record = "VARCHAR(10)", Case_Number = "VARCHAR(15)", Claim_Type = "VARCHAR(15)", Block_Date = "datetime", Claim_Processed_Date = "datetime", Status ="VARCHAR(100)").
  • 然后我使用as.character和更新我的数据框类类型,as.Date以匹配上面列出的数据类型.
  • 我已经创建了表,因为我已经工作了几个小时所以我不得不放弃使用表sqlDrop(myconn2, "##R_Claims_Data").
  • 然后我跑了: sqlSave(myconn2, MainClmDF2, tablename = "##R_Claims_Data", verbose=TRUE, rownames= FALSE, varTypes=columnTypes)

然后我的头掉了因为它有效!我真的希望这有助于前进的人.以下是帮助我达到这一点的链接:

表未找到

R中的sqlSave

RODBC


归档时间:

查看次数:

15525 次

最近记录:

7 年,6 月 前