2016-07-01 16 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之間有什麼區別?

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 
} 

如果我的手在SQL Server中執行存儲過程會是這樣的:

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 

感謝您的閱讀!我希望有人能幫助我!

的Martijn

+0

在'',@ City = N'',City,''「'的行中,應該在那裏嗎?例如,我認爲SQL將讀取該命令爲「@ City = N'Detroit」。我很驚訝你的編碼不​​會返回錯誤。你在地址欄中有同樣的事情。這是一個我不熟悉的變量類型嗎? – Benjamin

+0

這正是我想要它在SQL中:) –

回答

1

我發現了一個非常簡單的解決方案,我希望我以前知道這一點!也許我可以幫助別人解答我的問題。

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) 
} 

輸出SQLTEXT的:

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

而不是使用SP執行窗口中,您剛纔執行SP在一個新的查詢窗口paremters的。

0

我用這個成功的過去與RJDBC

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

這可能是簡單語法的問題。很難說沒有可重複的例子。 請注意額外的引號集

1

我發現RODBCext更容易使用,因爲它使用參數綁定。它還使得使用NA代替"NULL"更容易,並消除了正確匹配引號字符的擔憂。

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