2017-04-17 98 views
0

我有一個數據幀(predict_prc),它具有60k行和2個變量(chrt_idprc)。我需要將此數據框保存到MS SQL數據庫中。將R中的大數據集保存到臨時表SQL數據庫中

我選擇下一個方法 - 創建臨時表,插入新值並執行存儲的過程。

我嘗試下面的代碼:

sql = paste(" 
      CREATE TABLE #t (chrt_id INT PRIMARY KEY,prc FLOAT) 
      INSERT INTO #t 
      VALUES", 
      paste0(sprintf("(%.2i, ", predict_prc$chrt_id), sprintf("%.2f)", predict_prc$predict_prc), collapse = ", ") 
      ,"EXEC DM.LoadChrtPrc 
      ") 

但它的值過多插入這種方式。

然後我嘗試下面的代碼:

sql_create = paste(" 
IF (SELECT object_id('#t')) IS NOT NULL 
BEGIN 
DROP TABLE #t 
END 
CREATE TABLE #t (chrt_id FLOAT PRIMARY KEY, prc FLOAT) 
      ") 

sql_exec = paste(" 
       EXEC DM.LoadChrtPrc 
       ") 

channel <- odbcConnect('db.w') 
create <- sqlQuery(channel, sql_create) 
save <- sqlSave(channel, predict_prc, tablename = '#t', fast=TRUE, append=F, rownames=FALSE) 
output <- sqlQuery(channel, sql_exec) 
odbcClose(channel) 

但i`ve得到了一個錯誤:

> save <- sqlSave(channel, predict_prc, tablename = '#t', fast=TRUE, append=F, rownames=FALSE) 
Error in sqlSave(channel, predict_prc, tablename = "#t", fast = TRUE, : 
    42S01 2714 [Microsoft][ODBC SQL Server Driver][SQL Server]There is already an object named '#t' in the database. 
[RODBC] ERROR: Could not SQLExecDirect 'CREATE TABLE "#t" ("chrt_id" float, "prc" float)' 

如果我執行save沒有create然後I`ve得到這個錯誤:

> save <- sqlSave(channel, predict_prc, tablename = '#t1', fast=TRUE, append=F, rownames=FALSE) 
Error in sqlColumns(channel, tablename) : 
    ‘#t’: table not found on channel 

有人可以幫我解決這個問題嗎?

回答

0

SQL Server在一個查詢中不允許超過1000行。 您可以通過創建1000的塊來插入所有值。 對於每1000行,您應該創建一個新的SQL查詢並運行它。