我知道我可以在R中用SQL创建一个临时表,例如:
require(RODBC)
X<- odbcDriverConnect('driver={SQL Server};
server=s001000;database=X1;trusted_connection=true')
sqlQuery(X, "create table #temptable (test int)" )
sqlQuery(X, "insert into #temptable(test) values(201508)")
doesItWork <- sqlQuery(X, "select * from #temptable")
但是我想在一个R对象的sql server中创建一个临时表(我有一个表,它具有以前R计算的结果,我需要在SQL中查询另一个表。我不想将其导出为txt并将其上传到SQL服务器。它必须是从R中执行此操作的方法。我试过:
tabla<-data.frame(per=c(201508,201510))
sqlQuery(X, "Select * into ##temporal from tabla")
但是我收到了一条错误消息:
“42S02 208 [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无效 对象名称'tabla'。“ “[RODBC]错误:无法SQLExecDirect '从tabla'“
选择*到## temporal
我也知道我可以用sqlSave创建一个表:
sqlSave(X, tabla, rownames=FALSE,safer=FALSE)
但我想创建一个临时表。 如何从R对象在SQL中创建临时表?
答案 0 :(得分:2)
不幸的是,我不记得sqlSave(conection, new_data, table_name, append = TRUE)
曾经正确地将数据插入到现有表中(例如不创建新表),因此您可能不得不使用效率较低的表自己生成INSERT
语句的方法。例如,
con <- odbcConnect(...)
query <- "
SET NOCOUNT ON;
IF ( OBJECT_ID('tempdb..##tmp_table') IS NOT NULL )
DROP TABLE ##tmp_table;
CREATE TABLE ##tmp_table
(
[ID] INT IDENTITY(1, 1)
,[Value] DECIMAL(9, 2)
);
SET NOCOUNT OFF;
SELECT 1;
"
sqlQuery(con, gsub("\\s|\\t", " ", query))
df <- data.frame(Value = round(rnorm(5), 2))
update_query <- paste0(
"SET NOCOUNT ON; INSERT INTO ##tmp_table ([Value]) VALUES ",
paste0(sprintf("(%.2f)", df$Value), collapse = ", "),
" SET NOCOUNT OFF; SELECT * FROM ##tmp_table;"
)
sqlQuery(con, update_query)
# ID Value
# 1 1 0.79
# 2 2 -2.23
# 3 3 0.13
# 4 4 0.07
# 5 5 0.50
#sqlQuery(con, "DROP TABLE ##tmp_table;")
#odbcClose(con)