【问题标题】:R- create temporary table in sql server from R data frameR-从R数据框在sql server中创建临时表
【发布时间】:2016-09-04 05:13:24
【问题描述】:

我知道我可以在 SQL 中从 R 创建一个临时表,例如:

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]无效 对象名称't​​abla'。” “[RODBC] 错误:无法 SQLExecDirect 'Select * into ##temporal from tabla'"

我也知道我可以用 sqlSave 创建一个表:

sqlSave(X, tabla, rownames=FALSE,safer=FALSE)

但我想创建一个临时表。 如何从 R 对象在 SQL 中创建临时表?

【问题讨论】:

  • 我不认为您可以通过 sqlQuery 在查询中引用 R 会话 (tabla) 中的对象,例如, sqldf。尝试使用sqlSavesqlUpdate 进行插入操作。

标签: sql sql-server r rodbc


【解决方案1】:

不幸的是,我不记得 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) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多