2011-12-15 11 views
13

Sto tentando di caricare un frame di dati su una tabella in sql server utilizzando sqlSave(). Questo dataframe contiene un timestamp e vorrei mappare il timestamp col a un datetime col in sqlserver.sqlSave: mappatura dei timestamp dei dataframe a timestamp di SQL Server

Ho riscontrato due problemi.

1. Mappa il timestamp del frame di dati su un valore float. 2. Crea una tabella, ma nessun dato viene caricato e viene visualizzato un errore.

Ecco un esempio frame di dati, 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 

Ecco cosa succede quando si tenta sqlSave a un database di 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 

Inoltre, quando guardo i tipi di dati della tabella, non ottengo "datetime" per il timestamp. Non ha senso per me perché RODBC dovrebbe mappare un segnaposto POSIXct a qualcosa di diverso da datetime.

[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 

Come aggirare questo?

risposta

16

due opzioni:

1) pigro uno: lasciare che si verificano l'errore, verrà creato il tavolo, e cambiare la colonna (s) in datetime manualmente nel database. Funzionerà la prossima volta.

2) Corretto: utilizzare varTypes

Si noti che il problema può essere smontato rimuovendo cose inutili. Per inciso, probabilmente non userei il timestamp del nome della colonna in un server sql, perché ho visto le confusioni a causa del tipo di data timestamp interno completamente diverso.

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) 
Problemi correlati