2016-07-01 14 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