RODBC::sqlSave - 在创建/追加表时出现问题
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语句没有出现错误或警告消息。
任何帮助将不胜感激。
此外,如果有任何遗漏的细节,请告诉我,我会编辑问题。
问题的原因是使用RODBC::sqlSave函数创建或追加表时遇到了问题。解决方法是使用存储过程来执行插入或更新操作,并使用RODBC::sqlQuery函数将数据逐行插入或更新到表中。
在SQL Server Management Studio中,首先创建了一个名为mtcars的数据库,并添加了一个用户。然后在数据库中创建了一个名为mtcars的表,该表包含一些列。接下来创建了两个存储过程,一个用于插入或更新数据,另一个用于获取数据。
在R中,首先建立与数据库的连接,然后使用一个for循环将数据逐行插入或更新到表中。最后使用sqlQuery函数获取表中的数据。
存储过程的使用可以提供更大的灵活性,可以将SQL代码存储在数据库中,而不是在R代码中使用大量的SQL字符串。此外,存储过程可以避免SQL注入的问题。
建议在解决这个问题时使用RODBCext包中的sqlExecute函数来运行参数化查询,这样可以更安全地执行数据库操作,并且减少了一些准备工作。
使用RODBC::sqlSave函数创建或追加表时遇到问题,解决方法是使用存储过程执行插入或更新操作,并使用RODBC::sqlQuery函数将数据逐行插入或更新到表中。存储过程提供了更大的灵活性和安全性。