2011-12-15 15 views
13

Estoy tratando de cargar un marco de datos a una tabla en el servidor SQL usando sqlSave(). Este dataframe tiene una marca de tiempo y me gustaría asignar la columna timestamp col a datetime col en sqlserver.sqlGuardar: Asignación de marcas de tiempo del marco de datos a las marcas de tiempo de SQL Server

Tengo dos problemas.

1. Correlaciona la marca de tiempo del marco de datos con un flotador. 2. Crea una tabla, pero no se cargan datos y aparece un error.

He aquí un ejemplo de trama de datos, mdf:

mdf <- structure(list(run = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("run_00", 
"run_01", "run_02", "run_03", "run_04"), class = "factor"), slot = structure(c(1L, 
1L, 1L, 1L, 1L, 1L), .Label = c("slot 3", "slot 4", "slot 5", 
"slot 6"), class = "factor"), timestamp = structure(c(1320774563, 
1320774624, 1320774686, 1320774747, 1320774809, 1320774871), class = c("POSIXct", 
"POSIXt"), tzone = ""), channel = structure(c(1L, 1L, 1L, 1L, 
1L, 1L), .Label = c("och01", "och02", "och09", "och10"), class = "factor"), 
    variable = structure(c(2L, 2L, 2L, 2L, 2L, 2L), .Label = c("num_blocks", 
    "num_collection", "num_corr_0", "num_corr_1", "num_uncorr_srow", 
    "post_fec_err_rate", "pre_fec_err_rate"), class = "factor"), 
    value = c(1, 62, 124, 185, 247, 309)), .Names = c("run", 
"slot", "timestamp", "channel", "variable", "value"), row.names = c(NA, 
6L), class = "data.frame") 

> mdf 
    run slot   timestamp channel  variable value 
1 run_00 slot 3 2011-11-08 12:49:23 och01 num_collection  1 
2 run_00 slot 3 2011-11-08 12:50:24 och01 num_collection 62 
3 run_00 slot 3 2011-11-08 12:51:26 och01 num_collection 124 
4 run_00 slot 3 2011-11-08 12:52:27 och01 num_collection 185 
5 run_00 slot 3 2011-11-08 12:53:29 och01 num_collection 247 
6 run_00 slot 3 2011-11-08 12:54:31 och01 num_collection 309 

Esto es lo que sucede cuando intento sqlSave a una base de datos SQL Server ...

> sqlSave(dbandle,mdf,tablename="mdf") 
Error in sqlSave(dbandle, mdf, tablename = "mdf") : 
    [RODBC] Failed exec in Update 
22018 0 [Microsoft][ODBC SQL Server Driver]Invalid character value for cast specification 

Además, cuando miro a los tipos de datos de la mesa, no obtengo "fecha y hora" para la marca de tiempo. No tiene sentido para mí por qué RODBC correlacionaría una marca de tiempo POSIXct con algo que no fuera la fecha.

[rownames] [varchar](255) NULL, 
[run] [varchar](255) NULL, 
[slot] [varchar](255) NULL, 
[timestamp] [float] NULL, 
[channel] [varchar](255) NULL, 
[variable] [varchar](255) NULL, 
[value] [float] NULL 

¿Cómo puedo evitar esto?

Respuesta

16

dos opciones:

1) Lazy uno: dejar que se produzca el error, se creará la mesa, y cambiar la columna (s) de fecha y hora de forma manual en su base de datos. Funcionará la próxima vez.

2) Correcto: utilizar varTypes

Tenga en cuenta que su problema puede ser desmontado mediante la eliminación de la materia innecesaria. Por otro lado, probablemente no usaría la marca de tiempo de nombre de columna en un servidor sql, porque he visto confusiones debido a que el tipo de datos de marca de tiempo interno es totalmente diferente.

library(RODBC) 
mdf = data.frame(timestamp=as.POSIXct(Sys.time())) 

varTypes = c(timestamp="datetime") 
channel = odbcConnect("test") 
sqlSave(channel,mdf,rownames=FALSE,append=TRUE,varTypes=varTypes) 
close(channel) 
Cuestiones relacionadas