将R数据帧作为新表推送到SQL

问题描述 投票:0回答:1

我正在尝试使我的分析工作流更有效地将我的SQL Server数据库连接到R-Studio。

我现在要做什么?

  1. 我使用MS SQL Management Studio开发查询以提取相关信息以进行分析。
  2. 我将查询结果导出到.csv UTF-8文件。
  3. 我在R-Studio中读取了文件并进行了分析。
  4. 我将最终数据帧导出到.csv UTF-8文件。
  5. 我使用此文件在SQL Management Studio中创建表。

我想做什么?

我想在SQL Server和R-Studio之间建立连接,这样我就可以直接导入/导出数据框/表,而无需在计算机中保存这些文件。

为此,我已按照以下步骤操作:

  1. 已在R中安装DBI和odbc软件包。
  2. 使用“ ODBC数据源连接管理器配置连接”
    • 我的连接名称是“ Enterprise”(SQL Server Native Client 10.0)
  3. 在R-Studio中,使用“连接”选项卡,我可以看到包含“企业”的数据源的列表。
    • 选择“企业”数据源创建一个名称为“ con”的R对象,其中包含连接信息。
    • 这时我可以在连接选项卡中看到所有数据库。
  4. 我在R中进行测试的代码如下:
---
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

我的猜测是我在最后一块中做错了什么。

将“数据”推送到我的数据库的正确方法是什么?

谢谢!

r sql-server odbc r-markdown rnotebook
1个回答
0
投票

我如何解决?

直到进入将数据框推送到数据库的那一部分之前,我一直处于正确的轨道。 @ 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)```
© www.soinside.com 2019 - 2024. All rights reserved.