2017-08-08 132 views
0

真的很蹩腳,你不能從RStudio無縫複製/粘貼代碼到SQL Server存儲過程,但是,唉,它不會是微軟,否則,對吧?微軟R服務器解析錯誤

基本上,我在解析得到真正奇怪的錯誤:

Error in source(revoScriptConnection) : 
    revoScriptConnection:116:111: unexpected INCOMPLETE_STRING 
116: dtCumulativeResults[,c("State_Name_RAW","City_Name_MDM","County_Name_MDM","State_Name_MDM","City_Address_MDM","City_ 

下面是實際的代碼行(有幾行之前包括):

} 


} 

##save dud results if no geocoding occurred 
dtCumulativeResults <- data.table(City_Name_RAW=NA) 
dtCumulativeResults[,c("State_Name_RAW","City_Name_MDM","County_Name_MDM","State_Name_MDM","City_Address_MDM","City_Latitude","City_Longitude","index"):=character()] 

前面的這個唯一的線是結束for循環和if語句的括號。

此代碼在RStudio中運行得很好。不幸的是,如果我只隔離這幾行,SPROC就會運行。所以它與上面的一些行有關,但我不知道從哪裏開始。有一件事我知道:解析大括號{}時出現問題。如果我不縮進大括號會引發錯誤。但不總是。

無論如何,我希望有人意識到銀彈是什麼。也許保持一條線上的大括號。等等我在下面添加完整的SPROC,但是再次,這是一些奇怪的格式問題。

USE master 
GO 

/****** Object: StoredProcedure [dbo].[Rscript_geocodeUSACities] Script Date: 8/8/2017 10:31:15 AM ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 



























CREATE PROCEDURE [dbo].[Rscript_geocodeUSACities] 
    @usrOutputFilePath varchar(150) 
    ,@usrOutputFileName varchar(150) 

AS 
BEGIN 

    SET NOCOUNT ON; 

DECLARE @rScript nvarchar(max) = N' 

#### USER INPUTS #### 

usrOutputFile <- "' + @usrOutputFilePath + @usrOutputFileName + '" 


#### ESTABLISH ENVIRONMENT #### 

library(data.table) 
library(foreach) 
library(XML) 
library(RCurl) 
library(RJSONIO) 

##turn off scientific notation 
options(scipen=999) 


#### GEOCODE #### 

##assign input data set 
dtInputData <- data.table(InputDataSet) 

##initialize cumulative results data table 
dtCumulativeResults <- dtInputData[0,] 

##find out where to start 
startindex <- 1 

##if a temp file exists - load it up and count the rows 
if (file.exists(usrOutputFile)) { 

    print("Found temp file - resuming from index") 
    dtCumulativeResults <- fread(usrOutputFile,colClasses="character") 
    startindex <- ifelse(is.na(max(as.numeric(dtCumulativeResults$index),na.rm=T)),1,max(as.numeric(dtCumulativeResults$index),na.rm=T)+1) 
    print(startindex) 


} else { print("No temp file") } 



if (startindex<nrow(dtInputData) | startindex==nrow(dtInputData)) { 

    for (ii in seq(startindex,nrow(dtInputData))) { 

    ##initialize temporary results data table 
    dtTempResults <- dtInputData[ii,] 

    ##geocode address 
    vcSearchInput <- paste0(gsub("[[:punct:]]","",unlist(strsplit(paste(dtInputData$City_Name_RAW[ii],dtInputData$State_Name_RAW[ii],"USA")," "))),collapse="+") 
    vcSearchURL <- URLencode(paste("http://maps.google.com/maps/api/geocode/json?address=",vcSearchInput,"&sensor=false",sep="")) 
    vcSearchOutput <- getURL(vcSearchURL) 
    vcSearchOutput <- fromJSON(vcSearchOutput,simplify=F) 

    if (vcSearchOutput$status=="OVER_QUERY_LIMIT") { 

    dtTempResults[1,c("City_Name_MDM","County_Name_MDM","State_Name_MDM","City_Address_MDM","City_Latitude","City_Longitude","index"):=NA] 

    #save temporary results as we are going along 
    dtCumulativeResults <- rbind(dtCumulativeResults,dtTempResults[0,],fill=T) 
    write.csv(dtCumulativeResults,usrOutputFile,row.names=F) 
    break 

    } 

    if (vcSearchOutput$status=="OK" & !(tolower(dtTempResults$City_Name_RAW) %in% tolower(state.name)) & !(tolower(dtTempResults$City_Name_RAW) %in% tolower(state.abb)) & !(tolower(vcSearchOutput$results[[1]]$address_components[[1]]$long_name) %in% tolower(state.name))) { 

    dtTempResults[1,City_Name_MDM:=vcSearchOutput$results[[1]]$address_components[[1]]$long_name] 

    if (regexpr("County|Parish|Borough",vcSearchOutput$results[[1]]$address_components[[2]]$long_name)>0) { 

    dtTempResults[1,County_Name_MDM:=gsub(" County","",vcSearchOutput$results[[1]]$address_components[[2]]$long_name)] 
    dtTempResults[1,State_Name_MDM:=vcSearchOutput$results[[1]]$address_components[[3]]$long_name] 

    } else if (regexpr("United States",vcSearchOutput$results[[1]]$address_components[[3]]$long_name)>0) { 

    dtTempResults[1,County_Name_MDM:=vcSearchOutput$results[[1]]$address_components[[1]]$long_name] 
    dtTempResults[1,State_Name_MDM:=vcSearchOutput$results[[1]]$address_components[[2]]$long_name] 


    } else { 

    dtTempResults[1,County_Name_MDM:=gsub(" County","",vcSearchOutput$results[[1]]$address_components[[3]]$long_name)] 
    dtTempResults[1,State_Name_MDM:=vcSearchOutput$results[[1]]$address_components[[4]]$long_name] 

    } 

    dtTempResults[1,City_Address_MDM:=vcSearchOutput$results[[1]]$formatted_address] 
    dtTempResults[1,City_Latitude:=vcSearchOutput$results[[1]]$geometry$location$lat] 
    dtTempResults[1,City_Longitude:=vcSearchOutput$results[[1]]$geometry$location$lng] 
    dtTempResults[1,index:=ii] 

    } 

    ##save temporary results as we are going along 
    dtCumulativeResults <- rbind(dtCumulativeResults,dtTempResults,fill=T) 
    write.csv(dtCumulativeResults,usrOutputFile,row.names=F) 

    } 

} else { 

    ##save dud results if no geocoding occurred 
    dtCumulativeResults <- data.table(City_Name_RAW=NA) 
    dtCumulativeResults[,c("State_Name_RAW","City_Name_MDM","County_Name_MDM","State_Name_MDM","City_Address_MDM","City_Latitude","City_Longitude","index"):=character()] 
    write.csv(dtCumulativeResults[0,],usrOutputFile,row.names=F) 

    } 

' 

EXECUTE sp_execute_external_script 
       @language = N'R' 
       , @script = @rScript 
       ,@input_data_1 =N'select distinct [City_Name_RAW] 
            ,[State_Name_RAW] 
           from [External].[mdm].[dim_USA_Cities_Map] 
           where Mod_DT is null' 
       ; 

END 


























GO 
+0

然後問題出現在這兩條線之前是很難得的,這是我們看不到的。 –

+0

我之前添加了幾行(這只是右括號)。此外,錯誤聲明字符串未終止,但實際的代碼表明它是。 –

+0

例如,如果我在這些行之前將結束括號摺疊到同一行上,現在意外的INCOMPLETE_STRING錯誤稍後會在同一行中出現幾個字符空間 –

回答

2

請注意,腳本的大部分被指定爲非Unicode字符串文字。 EveryD after

usrOutputFile <- "' + @usrOutputFilePath + @usrOutputFileName + '" . . . 

因爲在'+'之後你開始下一個沒有N'的字符串。應該是

usrOutputFile <- "' + @usrOutputFilePath + @usrOutputFileName + N'" . . . 

要將結果插入表中,在TSQL中使用INSERT ... EXEC。請參閱https://docs.microsoft.com/en-us/sql/t-sql/statements/insert-transact-sql

+0

與INSERT ... EXEC的問題是,EXEC是一個循環,我想寫每次迭代到SQL表格 –

+0

在此處添加問題:https://stackoverflow.com/questions/45574968/microsoft-r-server-row-by-row-insert –