我正在尝试使我的分析工作流更有效地将我的SQL Server数据库连接到R-Studio。
我现在要做什么?
我想做什么?
我想在SQL Server和R-Studio之间建立连接,这样我就可以直接导入/导出数据框/表,而无需在计算机中保存这些文件。
为此,我已按照以下步骤操作:
---
title: "R Notebook"
output: html_notebook
---
```{r setup, include=FALSE}
library(odbc)
con <- dbConnect(odbc::odbc(), "Enterprise", timeout = 10) ```
```{sql, connection = con, output.var = "DataFrame"}
SELECT TOP 1000 *
FROM [DB].[dbo].[Table] ```
Data<-DataFrame[1:100,1:10]
head(Data,11)```
Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10
A 1 2.4 5.5 13.1 30.8 72.4 170.5 401.6 945.7
B 2 4.7 11.1 26.1 61.5 144.8 341.1 803.2 1891.5
C 3 7.1 16.6 39.2 92.3 217.3 511.6 1204.8 2837.2
D 4 9.4 22.2 52.2 123.0 289.7 682.2 1606.4 3782.9
E 5 11.8 27.7 65.3 153.8 362.1 852.7 2008.0 4728.6
F 6 14.1 33.3 78.4 184.5 434.5 1023.2 2409.6 5674.4
G 7 16.5 38.8 91.4 215.3 506.9 1193.8 2811.2 6620.1
H 8 18.8 44.4 104.5 246.0 579.4 1364.3 3212.8 7565.8
I 9 21.2 49.9 117.5 276.8 651.8 1534.9 3614.4 8511.5
J 10 23.5 55.5 130.6 307.5 724.2 1705.4 4016.0 9457.3
K 11 25.9 61.0 143.6 338.3 796.6 1875.9 4417.6 10403.0
```{sql, connection = con}
SELECT * INTO [DB].[dbo].[New_Table]
FROM ?Data```
这里我使用?
表示“数据”是SQL块中的R数据帧对象。
Error in vapply(values, function(x) { : values must be length 1,
but FUN(X[[1]]) result is length 100
Failed to execute SQL chunk
我的猜测是我在最后一块中做错了什么。
将“数据”推送到我的数据库的正确方法是什么?
谢谢!
我如何解决?
直到进入将数据框推送到数据库的那一部分之前,我一直处于正确的轨道。 @ r2evans指出我正在尝试从服务器创建一个表,其中包含仅使用此代码在本地存在的信息:
```{sql, connection = con}
SELECT * INTO [DB].[dbo].[New_Table]
FROM ?Data```
至此,我更改了方法,并尝试使用r代码推送数据框:
```{r}
dbWriteTable(con, "[DB].[dbo].[New_Table]", Data)```
结果是以下错误:
nanodbc / nanodbc.cpp:1587:42000:[Microsoft] [SQL Server本机客户端10.0] [SQL Server]创建表权限在数据库“主服务器”中被拒绝。
这里的问题:我试图使用"[DB].[dbo].[New_Table]"
访问具有权限的数据库。 dbWriteTable
函数将这个参数理解为表的纯名称,因此我必须找到一种方法来指定数据库的正确路径。
我没有找到直接使用代码的方法。 解决方案:我去了"ODBC Data Sources (32-bit)"
(Windows APP);并更改了我的连接配置。我建立的连接将master用作默认数据库。我为我拥有权限的数据库更改了它。因此,现在我使用以下代码从R笔记本中推送表格:
```{r}
dbWriteTable(con, "[R_Test2]", Data, overwrite = T)```
它完全可以满足我的需求。
如果有人知道如何使用代码指定此路径,将很高兴知道。也许在第一个配置块中:
```{r setup, include=FALSE}
library(odbc)
library(DBI)
con <- dbConnect(odbc::odbc(), "Enterprise", timeout = 10)```