2016-07-01 2 views
1

R의 함수에서 저장 프로 시저를 호출하고 싶습니다. 아래 코드를 참조하십시오. 불행하게도이 코드는 값이없는 데이터 프레임 만 생성합니다. 이 문제를 RJDBC & DBI으로 수정하고 싶습니다. RODBC에 문제가있는 것으로 보입니다.R, RJDBC를 사용하여 SQL Server 저장 프로 시저 호출

RPT_09_Hourly_Connected_v3<- function(Year, Month="NULL",State = "NULL",Region="NULL", City="NULL", District="NULL", Subdistrict="NULL" ,Address='NULL'){ 
    drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver", "/opt/sqljdbc_3.0/sqljdbc4.jar") 
    conn <- DBI::dbConnect(drv, "jdbc:sqlserver://***;databaseName=***;user=***;password=***") 
    sqlText <- paste("exec [dbo].[RPT_09_Hourly_Connected_v3]@Year=",Year, 
                ",@Month=",Month, 
                ",@State=",State,"", 
                ",@Region=",Region,"", 
                ",@City=N'",City,"'", 
                ",@District=",District,"", 
                ",@Subdistrict=",Subdistrict,"", 
                ",@Address=N'",Address,"'", 
                sep="") 
    data <- RJDBC::dbGetQuery(conn,sqlText) 
} 
a<- RPT_09_Hourly_Connected_v3(Year = 2016) 

> str(a) 
'data.frame': 0 obs. of 9 variables: 
$ Regio   : chr 
$ Stad   : chr 
$ Stadsdeel  : chr 
$ Buurtcombinatie: chr 
$ Adres   : chr 
$ Jaar   : num 
$ Maand   : num 
$ hourNR   : num 
$ HoursConnected : num 

이것은 RODBC이 작동하기 전에 작동했습니다. RODBCRJDBC 사이에 어떤 차이가 있습니까? 나는 손으로 SQL Server의 저장 프로 시저를 실행하면

RPT_09_Hourly_Connected_v3<- function(Year, Month="NULL",State = "NULL",Region="NULL", City="NULL", District="NULL", Subdistrict="NULL" ,Address='NULL'){ 
    dbhandle <- odbcConnect("***;DATABASE=***;UID=***;PWD=***") 
    data <- sqlQuery(dbhandle,paste("exec [ dbo].[RPT_09_Hourly_Connected_v3]@Year=",Year, 
            ",@Month=",Month, 
            ",@State=",State,"", 
            ",@Region=",Region,"", 
            ",@City=N'",City,"'", 
            ",@District=",District,"", 
            ",@Subdistrict=",Subdistrict,"", 
            ",@Address=N'",Address,"'", 
            sep="")) 
    odbcCloseAll() 
    data 
} 

는 다음과 같이 표시됩니다

EXEC @return_value = [dbo].[RPT_09_Hourly_Connected_v3] 
     @Year = 2016, 
     @Month = NULL, 
     @State = NULL, 
     @Region = NULL, 
     @City = N'Amsterdam', 
     @District = NULL, 
     @Subdistrict = NULL, 
     @Address = NULL 

감사를 읽어! 누군가가 나를 도울 수 있기를 바랍니다!.

마티

+0

''@ City = N '', City, " '"'에 대한 줄에는'N '이 있어야합니까? 나는 SQL이 그 명령을'@ City = N'Detroit '처럼 읽으 려한다고 생각한다. 귀하의 코드가 오류를 반환하지 않는 데 나는 놀랍습니다. 주소 줄에 똑같은 것이 있습니다. 이게 내가 익숙하지 않은 변수 유형인가? – Benjamin

+0

정확히 내가 SQL에 있기를 원했던 방식입니다. –

답변

1

나는 매우 쉬운 해결책을 발견했으며, 나는 이것을 알고 있었으면 좋겠다! 어쩌면 나는 내 대답으로 다른 사람을 도울 수있다. SQLTEXT의

FACT_CHARGESESSION<- function (username, password, country = "NULL",state = "NULL", region = "NULL",city = "NULL", 
          district = "NULL",subdistrict = "NULL", provider= "NULL",startDateView = "NULL",endDateView = "NULL") { 



InstallCandidates <-c("DBI","rJava","RJDBC","dplyr") 
    toInstall<-InstallCandidates[!InstallCandidates %in% library()$results[,1]] 
    if(length(toInstall) !=0){install.packages(toInstall,repos="http://cran.r-project.org")} 
    lapply(InstallCandidates,library,character.only=TRUE) 
    rm("InstallCandidates","toInstall") 

    NAME <- "dbo.R_00_ValidTransactions_ID_PW_v4" 
    options(java.parameters = "- Xmx1024m") 
    drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver", "/opt/sqljdbc_3.0/sqljdbc4.jar") 
    conn <- dbConnect(drv, "jdbc:sqlserver://***.**.***.***;databaseName=****;user=***;password=***") 
    # Make a SQL text 
    sqlText <- paste(NAME, paste(username,password, country,state,region,city,district,subdistrict,provider,startDateView,endDateView,sep=",")) 
    data <- dbGetQuery(conn,sqlText) 

    return(data) 
} 

출력 :

"dbo.R_00_ValidTransactions_ID_PW_v4 M.Kooi , Stackoverflow , NULL , NULL , Amsterdam , NULL , NULL , NULL , NULL , NULL , NULL " 

대신 SP 창 방금 새 쿼리 창에서 paremters로 이제 SP를 실행 실행 사용.

0

나는 RJDBC 성공적으로 과거에 이것을 사용했습니다 :

d <- dbGetQuery(conn, paste0("exec my_STOREDPROC @Field1= '",Field1,"';"))

그것은 구문 단순히 문제가 될 수 있습니다. 재현 할 수없는 예제 없이는 알기가 어렵습니다. 여분의 견적 세트에 유의하십시오.

1

RODBCext은 매개 변수 바인딩을 사용하므로 훨씬 쉽게 사용할 수 있습니다. 또한 "NULL" 대신 NA을 사용하는 것이 더 쉽고 따옴표 문자를 올바르게 일치시킬 필요가 없습니다.

library(RODBCext) 
RPT_09_Hourly_Connected_v3<- function(Year, Month=NA, State = NA, Region=NA, City=NA, District=NA, Subdistrict=NA ,Address=NA){ 
    ch <- odbcDriverConnect([connection_string]) 

    sqlText <- paste("exec [dbo].[RPT_09_Hourly_Connected_v3]@Year=? ", 
                ",@Month=? ", 
                ",@State=? ", 
                ",@Region=? ", 
                ",@City=? ", 
                ",@District=? ", 
                ",@Subdistrict=? ", 
                ",@Address=? ", 
                sep="") 
    sqlExecute(channel = ch, 
    query = sqlText, 
    data = list(Year, Month, State, Region, City, District, Subdistrict, Address), 
    fetch = TRUE, 
    stringAsFactors = FALSE) 
} 
+0

불행히도'RODBC'가 저에게 잘 맞지 않는 것처럼 보입니다. ( –

+0

그것은 가장 불행한 일입니다. – Benjamin

관련 문제