如何在R语言中编写SQL循环执行查询?
问题原因
你代码里的SQL语句是固定字符串,names[i]和limits[i]作为R变量并没有被解析成实际的表名和数值,数据库会把它们当成SQL里的无效标识符,所以无法执行。
修正方案
这里提供两种实用的修正方式:
方式1:字符串拼接生成完整SQL
用sprintf()把R变量的值拼接到SQL语句中,生成数据库能识别的完整SQL:
library(odbc) library(DBI) names = c("my_table1", "my_table2", "my_table3", "my_table4", "my_table5") limits = abs(as.integer(rnorm(5,100,100))) mycon = dbConnect(...) # 这里填上你的数据库连接参数 results = list() for (i in 1:length(names)) { # 用sprintf替换占位符:%s对应表名字符串,%d对应limit的整数 sql_stmt <- sprintf("SELECT * FROM %s LIMIT %d", names[i], limits[i]) file_i = dbGetQuery(mycon, sql_stmt) results[[i]] = file_i } final_results <- do.call(rbind.data.frame, results)
注意:如果表名是外部输入的,要确保没有SQL注入风险,这种方式更适合已知的安全表名。
方式2:表名拼接+参数化绑定数值
SQL的表名无法用参数化绑定,但LIMIT后的数值可以用参数化方式传递,这种方式更安全规范:
library(odbc) library(DBI) names = c("my_table1", "my_table2", "my_table3", "my_table4", "my_table5") limits = abs(as.integer(rnorm(5,100,100))) mycon = dbConnect(...) results = list() for (i in 1:length(names)) { sql_stmt <- sprintf("SELECT * FROM %s LIMIT ?", names[i]) # 发送查询请求后绑定参数 res <- dbSendQuery(mycon, sql_stmt) dbBind(res, list(limits[i])) file_i <- dbFetch(res) dbClearResult(res) # 清理查询结果 results[[i]] = file_i } final_results <- do.call(rbind.data.frame, results)
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

