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

Push an R dataframe to SQL as a new table

我正在努力使我的分析工作流程更高效,将我的 SQL 服务器数据库连接到 R-Studio。

我现在做什么?

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

我想做什么?

我想在 SQL 服务器和 R-Studio 之间创建一个连接,这样我就可以直接 import/export 我的 dataframe/table 而无需在我的计算机中安装这些文件。

为此,我遵循了以下步骤:

  1. 在 R 中安装了 DBI 和 odbc 包。
  2. 使用"ODBC Data Source Connection Administrator"配置了连接
    • 我的连接名称是 "Enterprise" (SQL Server Native Client 10.0)
  3. 在 R-Studio 中,使用“连接”选项卡,我可以看到包含 "Enterprise" 的数据源列表。
    • 选择 "Enterprise" 数据源创建一个名为 "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```

这里我使用 ? 表示 "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

我猜我在最后一块做错了什么。

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

我是怎么解决的?

在将数据框推送到数据库之前,我一直走在正确的轨道上。 @r2evans 指出,我试图从服务器创建一个 table,其中包含仅在本地存在的信息,代码如下:

```{sql, connection = con}
SELECT * INTO [DB].[dbo].[New_Table]
FROM ?Data```

在这一点上,我改变了方法并尝试使用 r-code 推送数据帧:

```{r}
dbWriteTable(con, "[DB].[dbo].[New_Table]", Data)```

结果出现以下错误:

nanodbc/nanodbc.cpp:1587: 42000: [Microsoft][SQL Server Native Client 10.0][SQL Server]CREATE TABLE permission denied in database 'master'.

这里的问题: 我试图访问我有权使用 "[DB].[dbo].[New_Table]" 的数据库。 dbWriteTable 函数将此参数理解为 table 的纯名称,因此我必须找到一种方法来指定数据库的正确路径。

没找到直接用代码实现的方法 解决方法:我去"ODBC Data Sources (32-bit)"( Windows APP);并更改了我的连接配置。我的连接是将 master 作为默认数据库。我为我有权限的数据库更改了它。所以现在我使用以下代码从 R-notebooks 中推送 table:

```{r}
dbWriteTable(con, "[R_Test2]", Data, overwrite = T)```

它完美地满足了我的需要。

如果有人知道如何使用代码指定此路径,那将是一件好事。也许在第一个配置块中:

```{r setup, include=FALSE}
library(odbc)
library(DBI)
con <- dbConnect(odbc::odbc(), "Enterprise", timeout = 10)```