簡體   English   中英

R - 存儲為對象名稱的 sql 查詢不適用於 r dbGetquery

[英]R - sql query stored as object name does not work with r dbGetquery

以下 R 代碼需要一些幫助。 我有相當多的數據要從 Microsoft sql 數據庫加載。 我試圖做一些事情來使 sql 查詢易於管理。

1) 將查詢存儲為具有唯一前綴的對象名稱 2) 使用搜索返回具有唯一前綴的對象名稱的向量 3) 使用 for 循環遍歷向量以加載數據 <- 這部分不起作用。

Library(odbc)
Library(tidyverse)
Library(stringer)

#setting up dB connection, odbc pkg
db<- DBI::dbConnect(odbc::odbc(),Driver =‘SQL Server’, Server=‘Server_name’, Database=‘Datbase name’, UID=‘User ID’, trusted_connection=‘yes’)

#defining the sql query
Sql_query1<-“select * from db1”
Sql_query2<-“select top 100 * from db2”

#the following is to store the sql query object name in a vector by searching for object names with prefix sql_
Sql_list <- ls()[str_detect(ls(),regex(“sql_”,ignore_case=TRUE))]

#This is the part where the code didn’t work
For (i in Sql_list){ i <- dbGetQuery(db, i)}

我得到的錯誤是“錯誤:'Sql_query1' nanodb.cpp:1587: 42000: [Microsoft][ODBC SQL Server 驅動程序][SQL Server]找不到存儲過程 'Sql_query1'

但是,如果我不使用循環,則不會發生錯誤! 如果我只有 2 -3 個查詢需要管理,這可能是可行的……不幸的是,我有 20 個!

dbGetquery(db,Sql_query1)

任何人都可以幫忙嗎? 謝謝!

@Rohits 解決方案寫下來:
你身邊的第一部分很好

#setting up dB connection, odbc pkg   
db<- DBI::dbConnect(odbc::odbc(),Driver =‘SQL Server’, Server=‘Server_name’, Database=‘Datbase name’, UID=‘User ID’, trusted_connection=‘yes’)

但是這樣做會更方便:
更詳細的版本:

sqlqry_lst <- vector(mode = 'list', length = 2)#create a list to hold queries the in real life length = 20
names(sqlqry_lst) <- paste0('Sql_query', 1:2)#assign names to your list again jut use 1:20 here in your real life example
#put the SQL code into the list elements 
sqlqry_lst['Sql_query1'] <- "select * from db1" 
sqlqry_lst['Sql_query2'] <- "select top 100 * from db2"
#if you really want to use for loops
res <- vector(mode = 'list', length(sqlqry_lst))#result list 
for (i in length(sqlqry_lst)) res[[i]] <- dbGetquery(db,sqlqry_lst[[i]])

或者作為兩個班輪,更R時尚和imho優雅:

sqlqry_lst <- list(Sql_query1="select * from db1", Sql_query2="select top 100 * from db2") 
res <- lapply(sqlqry_lst, FUN = dbGetQuery, conn=db)

我建議您混合和混合詳細信息,例如用於創建或更精確地命名查詢列表和用於對數據庫運行查詢的簡短版本,因為它最適合您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM