如何在不手动输入 R 的情况下为多列的 sqlSave() 指定 vartype?

How to specify vartype for sqlSave() for multiple columns without manually typing in R?

一些可重现的代码。请注意,您的数据库和服务器名称可能不同。

library(RODBC)

iris <- iris

connection <- odbcDriverConnect(
  "Driver={SQL Server};
   Server=localhost\SQLEXPRESS;
   Database=testdb;
   Trusted_connection=true;"
)

# create table in sql and move dataframe values in
columnTypes <- list( 
                Sepal.Length="decimal(28,0)",
                Sepal.Width="decimal(28,0)",
                Petal.Length ="decimal(28,0)",
                Petal.Width ="decimal(28,0)",
                Species = "varchar(255)"
                )

sqlSave(connection,iris,varTypes = columnTypes)

这就是我将数据框作为 table 导出到 sql 管理工作室的方式,它有效,但是,假设我在 iris 中有一百个新列。我是否必须在我的 columnTypes 变量中指定每个列名 = 到 decimal(28,0)?

# but what if i have
iris$random1 <- rnorm(150)
iris$random2 <- rnorm(150)
iris$random3-999 ..... <- rnorm(150) ....
iris$random1000 <- rnorm(150)

默认情况下,列至少在我的实际数据框中以浮动形式进入(iris 只是示例),所以这就是为什么我需要在 columnTypes 中手动更改它们。我希望 iris 中 5 个原始列之后的所有内容都是 decimal(28,0) 格式,而不需要手动将它们包含在 columnTypes 中。

我没有阅读 sqlSave() 语句和可能的替代方法。含义:可能有更合适的解决方案。无论如何,您可以通过重复和组合列表在 base R 中生成所需定义的列表:

# dummy data
df <- data.frame(Sepal.Lengt = 1:5,Sepal.Width = 1:5,Petal.Length = 1:5,Petal.Width = 1:5,Species = 1:5,col6 = 1:5,col7 = 1:5)

# all column names after the 5th -> if less then 6 columns you will get an error here!
vec <- names(df)[6:ncol(df)]

# generate list with same definition for all columns after the 5th
list_after_5 <- as.list(rep("decimal(28,0)", length(vec)))

# name the list items acording to the columns after the 5th
names(list_after_5) <- vec

# frist 5 column definitions manualy plus remaining columns with same definition from list generate above
columnTypes <- c(list(Sepal.Length="decimal(28,0)",
                      Sepal.Width="decimal(28,0)",
                      Petal.Length ="decimal(28,0)",
                      Petal.Width ="decimal(28,0)",
                      Species = "varchar(255)"),
                 list_after_5)

columnTypes 

$Sepal.Length
[1] "decimal(28,0)"

$Sepal.Width
[1] "decimal(28,0)"

$Petal.Length
[1] "decimal(28,0)"

$Petal.Width
[1] "decimal(28,0)"

$Species
[1] "varchar(255)"

$col6
[1] "decimal(28,0)"

$col7
[1] "decimal(28,0)"

由于您的示例代码似乎对您有用,这也应该如此(根据输出判断)- 我没有使用数据库对其进行测试,因为我没有可用的 atm 测试设置。