将R中的大数据集保存到临时表SQL数据库中

时间:2017-04-17 09:21:08

标签: sql sql-server r

我有一个包含60k行和2个变量(predict_prcchrt_id)的数据帧(prc)。我需要将此数据帧保存到MS 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)

但我有一个错误:

> 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,那么我就会收到此错误:

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

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

SQL Server在一个查询中不允许超过1000行。 您可以通过创建1000的块来插入所有值。 对于每1000行,您应该创建一个新的SQL查询并运行它。

答案 1 :(得分:0)

要解决此问题,我必须创建几个临时表,然后为每个表插入1000条记录来解决我的问题。
因此,在创建临时表之前,请先计算要放入临时表中的记录数,然后除以1000,然后根据需要创建临时表。

此解决方案是一次性查询解决方案。
如果要自动化该过程,请使用其他方法。