我有一个包含60k行和2个变量(predict_prc
和chrt_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
有人可以帮我解决这个问题吗?
答案 0 :(得分:0)
SQL Server在一个查询中不允许超过1000行。 您可以通过创建1000的块来插入所有值。 对于每1000行,您应该创建一个新的SQL查询并运行它。
答案 1 :(得分:0)
要解决此问题,我必须创建几个临时表,然后为每个表插入1000条记录来解决我的问题。
因此,在创建临时表之前,请先计算要放入临时表中的记录数,然后除以1000,然后根据需要创建临时表。
此解决方案是一次性查询解决方案。
如果要自动化该过程,请使用其他方法。