Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RODBC:在存储过程中传递空值_R_Stored Procedures_Rodbc - Fatal编程技术网

RODBC:在存储过程中传递空值

RODBC:在存储过程中传递空值,r,stored-procedures,rodbc,R,Stored Procedures,Rodbc,我有一个存储过程,它返回阿姆斯特丹某个地区的子区。要连接我的sql server并从数据库中获取数据,我使用RODBC 这是我用来获取所有子区的代码: #stored procedure: all subdistricts subdistricts_amsterdam <-function(Region = "G4", State = "NH", City = "Amsterdam", District = NULL){ dbhandle <- connect() data

我有一个存储过程,它返回阿姆斯特丹某个地区的子区。要连接我的sql server并从数据库中获取数据,我使用RODBC

这是我用来获取所有子区的代码:

#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)
}
我希望这个函数返回阿姆斯特丹的所有子区。但很明显,它不是这样工作的。但是当我调用某个区域的函数时,我会得到相应区域的所有子区域


请提供帮助

R中SQL的NULL等效于一个缺失值而非NULL未定义值。从文件中可以看出:

NULL表示R中的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)
}
明显不同于

从表格名称中选择*其中城市='Amsterdam'和地区为空 在TSQL中使用条件以省去区域筛选器

如果@District为空 开始 从TableName中选择*,其中城市=@City 终止 其他的 开始 从表格名称中选择*,其中城市=@City和地区=@District 终止