Some reproducible code. Note that your database and server name may be different.
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)
This is how i export a dataframe to sql management studio as a table and it works but, say I have one hundred new columns in iris. Do I have to specify each column name = to decimal(28,0) in my columnTypes variable?
# but what if i have iris$random1 <- rnorm(150) iris$random2 <- rnorm(150) iris$random3-999 ..... <- rnorm(150) .... iris$random1000 <- rnorm(150)
By default the columns go in as floats as least in my actual dataframe (iris is just the example), so that’s why I need to manually change them in columnTypes. I want everything after the 5 original columns in iris to be decimal(28,0) format without manually including them in columnTypes.
Advertisement
Answer
I did not read into the sqlSave() statement and possible alternatives. Meaning: there might be a more apropriate solution. Anyhow you can generate the list of wanted definitions in base R by repitition and combining lists:
# 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)"
Since you example code seems to be working for you, this should also though (judging by the output) – I did not test it with a DB, as I have no test setup available atm.