RODBC::sqlSave - 在创建/追加表时出现问题

11 浏览
0 Comments

RODBC::sqlSave - 在创建/追加表时出现问题

关于RODBC包的几个相关问题,我在使用RODBC::sqlSave将数据写入SQL Server数据库的表时遇到了问题。我使用的是MS SQL Server 2008和64位的Windows RDP上的R。

第三个链接中的解决方案确实可行[sqlSave(ch, df)]。但是在这种情况下,它写入了错误的数据库。也就是说,我的默认数据库是"C2G",但我想要写入"BI_Sandbox"。而且它不允许使用参数如rownames等。因此,该包似乎仍然存在问题。

显然,一个可能的解决方案是将我的ODBC解决方案更改为指定的数据库,但似乎应该有更好的方法。而且这并不能解决sqlSave命令中无法使用的参数的问题,如rownames、varTypes等。

我有以下ODBC-系统DSN连接:

Microsoft SQL Server Native Client Version 11.00.3000

Data Source Name: c2g

Data Source Description: c2g

Server: DC01-WIN-SQLEDW\BISQL01,29537

Use Integrated Security: Yes

Database: C2G

Language: (Default)

Data Encryption: No

Trust Server Certificate: No

Multiple Active Result Sets(MARS): No

Mirror Server:

Translate Character Data: Yes

Log Long Running Queries: No

Log Driver Statistics: No

Use Regional Settings: No

Use ANSI Quoted Identifiers: Yes

Use ANSI Null, Paddings and Warnings: Yes

R代码:

R> ch <- odbcConnect("c2g")

R> sqlSave(ch, zinq_scores, tablename = "[bi_sandbox].[dbo].[table1]",

append= FALSE, rownames= FALSE, colnames= FALSE)

Error in sqlColumns(channel, tablename) :

‘[bi_sandbox].[dbo].[table1]’:通道上找不到表

# 出现错误后,再次尝试:

R> sqlDrop(ch, "[bi_sandbox].[dbo].[table1]", errors = FALSE)

R> sqlSave(ch, zinq_scores, tablename = "[bi_sandbox].[dbo].[table1]",

append= FALSE, rownames= FALSE, colnames= FALSE)

Error in sqlSave(ch, zinq_scores, tablename = "[bi_sandbox].[dbo].[table1]", :

42S01 2714 [Microsoft][SQL Server Native Client 11.0][SQL Server]数据库中已经存在名为'table1'的对象。

[RODBC] ERROR: Could not SQLExecDirect 'CREATE TABLE [bi_sandbox].[dbo].[table1] ("credibility_review" float, "creditbuilder" float, "no_product" float, "duns" varchar(255), "pos_credrev" varchar(5), "pos_credbuild" varchar(5))'

过去,我通过使用非常低效的sqlQuery和逐行的insert into来解决这个问题。但是这次我尝试了一下,没有数据被写入。尽管sqlQuery语句没有出现错误或警告消息。

任何帮助将不胜感激。

此外,如果有任何遗漏的细节,请告诉我,我会编辑问题。

0
0 Comments

问题的原因是使用RODBC::sqlSave函数创建或追加表时遇到了问题。解决方法是使用存储过程来执行插入或更新操作,并使用RODBC::sqlQuery函数将数据逐行插入或更新到表中。

在SQL Server Management Studio中,首先创建了一个名为mtcars的数据库,并添加了一个用户。然后在数据库中创建了一个名为mtcars的表,该表包含一些列。接下来创建了两个存储过程,一个用于插入或更新数据,另一个用于获取数据。

在R中,首先建立与数据库的连接,然后使用一个for循环将数据逐行插入或更新到表中。最后使用sqlQuery函数获取表中的数据。

存储过程的使用可以提供更大的灵活性,可以将SQL代码存储在数据库中,而不是在R代码中使用大量的SQL字符串。此外,存储过程可以避免SQL注入的问题。

建议在解决这个问题时使用RODBCext包中的sqlExecute函数来运行参数化查询,这样可以更安全地执行数据库操作,并且减少了一些准备工作。

使用RODBC::sqlSave函数创建或追加表时遇到问题,解决方法是使用存储过程执行插入或更新操作,并使用RODBC::sqlQuery函数将数据逐行插入或更新到表中。存储过程提供了更大的灵活性和安全性。

0
0 Comments

问题出现的原因是使用RODBC::sqlSave函数创建或追加表时遇到问题。解决方法是使用"insert by line"的解决方案,具体的解决方案可以在链接herehere中找到。根据回答中的描述,问题可能是由于用户自己的scheme导致的,可以通过创建表解决该问题。另外,链接应该附带使用说明、具体解释链接资源如何适用于问题,或者一些示例代码等。

0