R - sql запрос, сохраненный как имя объекта, не работает с r dbGetquery - PullRequest
0 голосов
/ 15 февраля 2020

Нужна небольшая помощь со следующим кодом R. У меня достаточно данных для загрузки из базы данных Microsoft sql. Я попытался сделать несколько вещей, чтобы сделать запросы sql управляемыми.

1) Сохранял запрос как имена объектов с уникальным префиксом 2) Используя поиск, чтобы вернуть вектор имен объектов с уникальным префиксом 3) используя для l oop до l oop через вектор для загрузки данных <- эта часть не сработала. </p>

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] [ODB C SQL Драйвер сервера] [SQL Сервер] Не удалось найти хранимую процедуру 'Sql_query1'

Однако, если я не использую l oop, ошибки не произошло! Это может быть выполнимо, если у меня есть только 2 -3 запроса для управления ... к сожалению, у меня их 20!

dbGetquery(db,Sql_query1)

Кто-нибудь может помочь? Спасибо!

1 Ответ

0 голосов
/ 15 февраля 2020

@ Решение Рохитса записано:
первая часть с вашей стороны в порядке

#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 styli sh и imho элегантно:

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

Я предлагаю вам смешивать и смешивать подробные, например, для создания или более точно для называя список запросов и краткую версию для выполнения запросов к базе данных, как вам удобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...