【发布时间】:2016-02-19 18:23:35
【问题描述】:
与RODBC 包上的several other questions 相关,我在使用RODBC::sqlSave 写入SQL Server 数据库上的表时遇到问题。我在 Windows RDP 上使用 MS SQL Server 2008 和 64 位 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]’: table not found on channel
# after error, try again:
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]There is already an object named 'table1' in the database.
[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 语句没有错误或警告消息。
temp <-"INSERT INTO [bi_sandbox].[dbo].[table1]
+ (credibility_review, creditbuilder, no_product, duns, pos_credrev, pos_credbuild) VALUES ("
>
> for(i in 1:nrow(zinq_scores)) {
+ sqlQuery(ch, paste(temp, "'", zinq_scores[i, 1], "'",",", " ",
+ "'", zinq_scores[i, 2], "'", ",",
+ "'", zinq_scores[i, 3], "'", ",",
+ "'", zinq_scores[i, 4], "'", ",",
+ "'", zinq_scores[i, 5], "'", ",",
+ "'", zinq_scores[i, 6], "'", ")"))
+ }
> str(sqlQuery(ch, "select * from [bi_sandbox].[dbo].[table1]"))
'data.frame': 0 obs. of 6 variables:
$ credibility_review: chr
$ creditbuilder : chr
$ no_product : chr
$ duns : chr
$ pos_credrev : chr
$ pos_credbuild : chr
任何帮助将不胜感激。
另外,如果有任何遗漏的细节,请告诉我,我会修改问题。 p>
【问题讨论】:
-
我也遇到过类似的问题。我已经读到列映射必须完全正确,或者任何非 varchar 数据类型都需要输入数据框
as.factor(x)。我刚刚通过 sqlQuery 从 CSV 批量插入,所以我也很想看到一个解决方案。 -
就个人而言,我从不使用
sqlSave或sqlUpdate,而是在SQL Server Management Studio 中编写存储过程。然后我使用sqlQuery执行存储过程。它似乎表现良好,减少了混乱的 R 代码,而且我的 IT 安全团队非常喜欢存储过程而不是 SQL 注入。 -
@Benjamin 您能否提供此过程的示例作为答案?我认为这对我自己和其他人来说都是一个有用的解决方案。
-
@Alex,小心你的要求——请看下面我的回答:)
标签: sql-server r rodbc