避免Access和SQLServer的空值冲突
图B
Nz返回一个实际的值,而不是轻易使人产生误解的空值第二个表达式返回零长度的字符串来取代空值:
WithoutOptional: Nz([Region])
虽然这样为用户提供的信息较少,但却有效防止了在后续的表达式中使用空值,从而避免出错。图C显示的新表达式证实了这一点。
图C
表达式可能不能像预期的那样处理空值
两个表达式都直接或间接依靠于Region字段中的值。第一个表达式直接引用Region字段:
RegionString: IIf([Region]="","N/A",[Region])
只看表达式,你可能认为结果记录集的每个字段中都应该出现一个字符串。图D展示了实际结果,它和你设想的不符,并不是每个字段都包含一个字符串。事实上,只有在字段包含零长度字符串("")的前提下,表达式才会返回字符串"N/A"。我们知道,这些看似空白的字段包含空值,而不是零长度的字符串。但是,错误是可以理解的,也是能避免的。
图D
碰到空值时,用Nz返回值而不是错误
下一个表达式也引用了Region值,只是通过Nz函数的结果来间接地引用: copyright dedecms
WithoutOptionalString: IIf([WithoutOptional]="","N/A",[WithoutOptional])
这样一来,任何空值都可用一个更确切的值来表示,并在后续任何表达式中进行求值。如图D所示,表达式在处理空白Region字段时没什么问题。只有“未预计到”或者“未知”的空值才会导致问题。
Nz在项目中无法工作
有人以为Access项目也支持Nz函数,但实情并非如此。记住,项目中的表是真正的SQL Server表。要证实这一点非常简单,只需使用Access配套提供的示范项目NorthwindCS.adp。以Employees表的一个简单视图为基础,并像前面在Microsoft(.mdb)文件中那样使用Nz函数,如图E所示。试图运行该查询时,Access会返回一个错误。
图E
Access项目不支持Nz函数在Access项目中使用Nz
在项目中不能使用Nz,而应换用Transact SQL的IsNull函数。该函数的作用与Nz相似,它的形式如下:
IsNull(expression, valueifnull)
两个参数都是必需的,IsNull结果值的类型由expression决定。假如valueifnull的列数据类型与expression的数据类型冲突,SQL Server会在你试图输入表达式时返回一个错误。例如,假如expression基于一个数值列,而valueifnull是一个字符串,两个参数就会产生冲突。由于SQL Server无法解决冲突,所以会拒绝表达式。
织梦内容管理系统
为了解决上例(图E)的问题,可将Nz替换成IsNull表达式,如图F所示:
IsNull(Region, 'N/A')
结果与图B相同(在WithOptional字段中)。
图F
在Access项目中用IsNull代替Nz
文章评论
共有位Admini5网友发表了评论 查看完整内容