[R-es] consulta por varTypes de sqlSave en RODBC

Javier Marcuzzi javier.ruben.marcuzzi en gmail.com
Jue Jul 13 16:11:24 CEST 2017


Mira algo de esto, puede ser útil, para no enviar directamente en lenguaje SQL (dos caminos para lo mismo, porque R lo escribe a SQL, salvo SQL server 2016, el resto no entendería R). Disculpas por enviarlo muy en bruto, falta trabajo al código, pero como usted ahora está conectado es lo más rápido que puedo hacer.

sqlSave(dbCon, dataSet, dbTable, append=TRUE, rownames=FALSE, 
varTypes=varTypes, verbose=T)

tmp <- sqlColumns(channel, correctTableName)
varTypes = as.character(tmp$TYPE_NAME)
names(varTypes) = as.character(tmp$COLUMN_NAME)

o

varTypes = c(somecolumn="datetime")

Javier Rubén Marcuzzi

De: Jose Ramirez Costa
Enviado: jueves, 13 de julio de 2017 10:57
Para: Javier Marcuzzi
CC: r-help-es
Asunto: Re: [R-es] consulta por varTypes de sqlSave en RODBC

Hola Javier, si no estoy entendiendo mal, lo q deseo hacer no se trata de configurar los parametros SQL, sino solo de colocar un vector en el argumento VarTypes de la funcion sqlSave.

El manual especifica esa opcion, pero no da ningun ejemplo de como usarla.

varTypes an optional named character vector giving the DBMSs datatypes to be used for
some (or all) of the columns if a table is to be created.

En este pdf https://cran.r-project.org/web/packages/RODBC/vignettes/RODBC.pdf, solo se hace referencia al argumento en este parrafo

4.1 Data types when saving a data frame When sqlSave creates a table, there is some choice as to the SQL data types used. The default is to select the SQL data type from the R type via the typeInfo argument to sqlSave. If this is not supplied (usual) a default mapping is looked up using getSqlTypeInfo() or by interrogating sqlTypeInfo(). This will almost always produce the correct mapping for numeric, integer and character columns of up to 254 characters (or bytes). In other cases (include dates and date-times) the desired SQL type can be specified for each column via the argument varTypes, a named character vector with names corresponding to (some of) the names in the data frame to be saved.

Muchas gracias por tu ayuda y disculpa si no entiendi bien alguna de tus preguntas.

Saludos

El 13 de julio de 2017, 10:39, Javier Marcuzzi <javier.ruben.marcuzzi en gmail.com> escribió:
Estimado Ramirez Costa
 
Si usted desea configurar los parámetros SQL podría escribirlos en lenguaje SQL y enviarlos por medio de una consulta, por otro lado ¿el manual especifica la opción que usted desea utilizar? Posiblemente está documentado (no lo se).
 
Javier Rubén Marcuzzi
 
De: Jose Ramirez Costa
Enviado: jueves, 13 de julio de 2017 10:31
Para: Javier Marcuzzi
CC: r-help-es
Asunto: Re: [R-es] consulta por varTypes de sqlSave en RODBC
 
Buen dia Javier, muchas gracias por tu ayuda y el script compartido.
 
Me va a servir como ayuda para seguir aprendiendo sobre RODBC pero no encuentro una solucion para este problema puntual de poder definir el tipo y ancho de las variables, q segun creo se hace con el argumento varTypes.
 
Si alguien tien algun ejemplo donde haya usado la SqlSave y VarTypes, me sera de gran ayuda.
 
Abrazo a todos
 
2017-07-12 15:33 GMT-03:00 Javier Marcuzzi <javier.ruben.marcuzzi en gmail.com>:
Estimado José Ramirez Costa
 
Yo tengo un archivo donde guarde lo que realizaba cuándo aprendía, habría que ver si actualmente es así o hay cambios, por lo que usted dice creo que usa sql server, si no es así busco el archivo para otras bases de datos. Si es sqlserver se podría realizar con la ayuda de visual studio, hay una integración al respecto.
 
Le copio y pego la forma que utilicé para aprender, espero que le sea útil.
 
 
cn <- odbcDriverConnect(connection="Driver={SQL Server Native Client 11.0};
                        server=localhost;
                        database=far;
                        trusted_connection=yes;")
# DESKTOP-HEO7TLB
cosa <- sqlFetch(cn,'cosa')
cosa
 
A <- c(1,2,3,4)
B <- c(4,5,6,7)
dat <- data.frame(A,B)
colnames(dat) <- c("A", "B")
sqlSave(cn, dat, tablename = "tblTest", rownames=FALSE, append=TRUE)
 
cosa <- c("auto", "bici", "libro")
cantidad <- c(2,4,7)
dat <- data.frame(cosa, cantidad)
 
colnames(dat) <- c("A", "B")
sqlSave(cn, dat, tablename = "cosa",
        rownames=FALSE, 
        colnames=TRUE, 
        append=TRUE,
        addPK=TRUE,
        fast=TRUE)
 
# http://stackoverflow.com/questions/36202414/r-download-image-using-rvest
# https://www.r-bloggers.com/parameterized-sql-queries/
# https://cran.r-project.org/web/packages/RODBCext/vignettes/Parameterized_SQL_queries.html
 
library(RODBCext)
filterData <- data.frame('cosa'= c('libros'))
data <- sqlExecute(cn, "SELECT * FROM prueba WHERE cosa = ?", filterData, fetch = TRUE)
if(length(data$id) == 0)
{
  print ("no hay elementos")
} else
{
  print ('hay elementos')
}
 
# generar lo que se inserta o actualiza
id <- 1
cosa <- "casa"
cantidad <- 3
valor <- 4.5
dfDato <- data.frame(id,cosa, cantidad,valor)
colnames(dfDato) <- c("id", "cosa","cantidad","valor")
print(dfDato)
insertar <- function(dfDato) {
  dfNuevoDato <- data.frame(dfDato$cosa, dfDato$cantidad, dfDato$valor)
  colnames(dfNuevoDato) <- c("cosa","cantidad","valor")
  # Parameterized query
   sqlExecute(cn, "INSERT INTO prueba
              (cosa
                ,cantidad
                ,valor)
              VALUES (?,?,?)", dfNuevoDato)
  print(dfNuevoDato)
}
 
# comprobar si existe el id
filterId <- data.frame('id'= dfDato$id)
data <- sqlExecute(cn, "SELECT * FROM prueba WHERE id = ?", filterId, fetch = TRUE)
if(length(data$id) == 0)
{
  print ('no existe el id')
  insertar(dfDato)
}else{
  print('Existe el id')
  # buscar la palabra si existe
  filterPalabra <- data.frame('cosa'=dfDato$cosa)
  data <- sqlExecute(cn, "SELECT * FROM prueba WHERE cosa like ?", filterPalabra, fetch = TRUE)
  print(data)
    if(length(data$cosa) > 0)
    {
      print ('existe debo actualizar')
     # query <- "UPDATE cakes SET price = ? WHERE cake = ?"
       query <- "UPDATE prueba
       SET cosa = ?
       ,cantidad = ?
       ,valor = ?
       WHERE id = ?"
       sqlExecute(cn, query, dfDato)
      print(dfDato)
    }else{
      print ('puedo insertar')
      insertar(dfDato)
    }
  }
#http://finzi.psych.upenn.edu/R/library/RODBC/html/sqlSave.html
 
Javier Rubén Marcuzzi
 
De: Jose Ramirez Costa
Enviado: miércoles, 12 de julio de 2017 12:33
Para: r-help-es
Asunto: [R-es] consulta por varTypes de sqlSave en RODBC
 
Buen dia compañerxs de R, les traigo una pregunta bastante especifica.
 
En el trabajo me estan requiriendo el uso de SQL, asi q estoy aprendiendo a
usarlo desde R, con el paquete RODBC.
 
Mi problema puntual es que al crear una tabla en el servidor SQL a partir
de un data frame en R (usando la funcion sqlSave) no puedo definir el tipo
de variables que quiero usar en el data frame.
 
Segun entiendo esto se deberia poder hacer con el parametro vartypes, pero
hasta ahora solo he podido cargar un vector q dice el tipo de variables
(varchar, int, o numeric) pero no he podido indicarle el ancho q tiene cad
variable.
 
Esto en SQL se escribiria algo asi:
[ACTA] int,
[APENAC] varchar(25),
[PESONAC] numeric(4,0),
 
Alguien uso vartypes de esta forma?
 
Desde ya gracias por el tiempo y un abrazo a todxs.
 
-- 
"*“Que tudo pesado se torne leve, todo corpo, dançarino, e todo espírito,
pássaro.” *
*Nietzsche, "Assim Falou Zaratustra”.*
 
                [[alternative HTML version deleted]]
 
_______________________________________________
R-help-es mailing list
R-help-es en r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es
 



 
-- 
"“Que tudo pesado se torne leve, todo corpo, dançarino, e todo espírito, pássaro.” 
Nietzsche, "Assim Falou Zaratustra”.
 




-- 
"“Que tudo pesado se torne leve, todo corpo, dançarino, e todo espírito, pássaro.” 
Nietzsche, "Assim Falou Zaratustra”.


	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es