2016-06-25 6 views
1

アムステルダムの特定の地区のサブディストリビューションを返すストアドプロシージャがあります。私のSQLサーバーと接続し、データベースからデータを取得するには、RODBCを使用します。RODBC:ストアドプロシージャにnull値を渡す

これは私がすべてのsubdistrictsを取得するために使用したコードです:私は何を期待

#stored procedure: all subdistricts 
subdistricts_amsterdam <-function(Region = "G4", State = "NH", City = "Amsterdam", District = NULL){ 
    dbhandle <- connect() 
    data <- sqlQuery(channel = dbhandle, 
        query = paste("exec dbo.SP_AllSubDistricts @Region='", Region, "', @State='", State, "', @City='", City, "', @District='", District,"';", sep = ""), errors = TRUE) 
    odbcClose(dbhandle) 
    return(data) 
} 

は、この機能はアムステルダムのすべてのsubdistrictsを返すことです。しかし、明らかにそれはこのようには機能しません。しかし、私が特定の地区でこの機能を呼び出すと、対応する地区のすべての地方を得ます。

RにSQLのNULLの

答えて

1

同等のを助けてくださいNA(欠損値)ではないNULL(未定義の値)です。 this R bloggers post indicatesとしてドキュメントから引っ張る:

NULLはRのnullオブジェクトを表します。これは予約語です。 NULLは であり、その値は 未定義の式および関数によって返されることがよくあります。

NAは、欠損値を含む長さ1の論理定数です。 インジケータ。

したがって、NAを機能させることを検討してください。そうすると、NAは引用符で囲まないでください。条件付きで調整するにはifelse()を追加してください。ところで

#stored procedure: all subdistricts 
subdistricts_amsterdam <-function(Region = "G4", State = "NH", 
            City = "Amsterdam", District = NA){ 
    dbhandle <- connect() 
    data <- sqlQuery(channel = dbhandle, 
        query = paste("exec dbo.SP_AllSubDistricts @Region='", Region, "', 
            @State='", State, "', @City='", City, "', @District=", 
            ifelse(is.na(District), District, 
             paste0("'", District, "'")), ";", sep=""), 
        errors = TRUE) 
    odbcClose(dbhandle) 
    return(data) 
} 

、ストアドプロシージャは、受信端にNULL値を処理し、結果は何も返さないことがあり、単にWHERE句で文字列リテラルのためにそれを交換しないでください。例えば:

SELECT * FROM TableName WHERE City = 'Amsterdam' AND District = 'Some District' 

は、地区フィルタを除外するTSQLの条件

SELECT * FROM TableName WHERE City = 'Amsterdam' AND District IS NULL 

使用して著しく異なって

IF @District IS NULL 
    BEGIN 
     SELECT * FROM TableName WHERE City = @City 
    END 
ELSE 
    BEGIN 
     SELECT * FROM TableName WHERE City = @City AND District = @District 
    END 
関連する問題