2017-07-07 47 views
6

我试图用一个数据帧附加到SQL Server表:如何写入表日期列与DBI

DBI::dbWriteTable(con_poc, "DEP_EVENTS", data_up, overwrite=FALSE, append = TRUE, verbose = TRUE, rownames = FALSE) 

但我在列,它是“日期”类型得到一个错误在数据库中。

Error in result_insert_dataframe([email protected], values) : 
    nanodbc.cpp:1587: 22003: [Microsoft][ODBC SQL Server Driver]Numeric value out of range 

我以前格式化使用as.POSIXct(EXAMPLE_DATE)列,但这似乎只为“日期时间”列

谁能帮助工作吗?

添加信息:

DEP_EVENTS: 
DATA_REGION (varchar(50), not null) 
EVENT_ID(PK, bigint, not null) 
EVENT_NAME(varchar(200), not null) 
FORECAST_STATUS(varchar(50), not null) 
FORECAST_CYCLE(date, not null) 

data_up <- data.frame(DATA_REGION = "America", 
         EVENT_NAME = "shiny deal", 
         FORECAST_STATUS = "Plan of Record", 
         FORECAST_CYCLE = as.Date("2017-07-07")) 

DBI::dbWriteTable(con_poc, "DEP_EVENTS", data_up, overwrite=FALSE, append = TRUE, verbose = TRUE, rownames = FALSE) 

Error in result_insert_dataframe([email protected], values) : 
    nanodbc.cpp:1587: 22003: [Microsoft][ODBC SQL Server Driver]Numeric value out of range 

我不是插入的主键,因为我碰到下面的错误,当我尝试

Error in result_insert_dataframe([email protected], values) : 
    nanodbc.cpp:1587: 23000: [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert explicit value for identity column in table 'DEP_EVENTS' when IDENTITY_INSERT is set to OFF. 

同样的要求:

str(data_up) 
'data.frame': 1 obs. of 4 variables: 
$ DATA_REGION : Factor w/ 1 level "America": 1 
$ EVENT_NAME  : Factor w/ 1 level "shiny deal": 1 
$ FORECAST_STATUS: Factor w/ 1 level "Plan of Record": 1 
$ FORECAST_CYCLE : Date, format: "2017-07-07" 

我也尝试将因子列更改为字符,但没有更改错误

+0

你可以尝试格式化你的日期对象与格式(example_date,format =“%y-%m-%d”)'? – Benjamin

+0

尝试过,但它给出了相同的错误,它将列转换为字符类型? – tonyk

+0

我通常使用'RODBCext'而不是'DBI',并且在最近发布之前需要将日期和日期时间转换为字符串。我不知道在DBI中它是否相似。 – Benjamin

回答

0

使用RODBC,您可以通过将sqlSave()命令与SET IDENTITY_INSERT = ON语句对话来插入主键列。例如:

con = odbcConnect(MY_DSN) 
sqlQuery(con,'SET IDENTITY_INSERT DEP_EVENTS ON') 
sqlSave(con, DEP_EVENTS, rownames = FALSE, append = 
     TRUE, verbose = FALSE, fast = FALSE)   
sqlQuery(con,'SET IDENTITY_INSERT DEP_EVENTS OFF') 
close(con)