繁体   English   中英

空字符串参数上的System.Data.SqlTypes.SqlNullValueException

[英]System.Data.SqlTypes.SqlNullValueException on empty string param

我的查询是这一行

//query...
"AND (@4 = '' OR (p.FirstName + p.LastName LIKE '%' + @4 + '%') OR (eup.FirstName + eup.LastName LIKE '%' + @4 + '%')) " +
//more query...

这给了我一个Data is null异常。 参数@4"" 当我将其更改为

"AND (@4 IS NULL OR (p.FirstName + p.LastName LIKE '%' + @4 + '%') OR (eup.FirstName + eup.LastName LIKE '%' + @4 + '%')) " +

它不会返回任何一个表中没有名字或姓氏的记录。

我该如何解决? 如果参数4为空,我想返回所有记录,而不管名称是否存在。

除非paramenter @4包括姓氏和姓氏且没有空格或任何其他内容,否则我怀疑您正在寻找与@4匹配的名字或姓氏,如果@4为空,则返回所有内容。

AND (p.FirstName LIKE '%' ISNULL(@4,'') + '%'
    OR p.LastName LIKE '%' ISNULL(@4,'') + '%'
    OR eup.FirstName LIKE '%' ISNULL(@4,'') + '%'
    OR eup.LastName LIKE '%' ISNULL(@4,'') + '%'
    )

通过使用ISNULL(@4,'')它实际上会将您的名字和姓氏变成一个完整的通配符搜索并返回所有内容,因为它在前后都仍带有'%'。 我可能建议将其更改为仅包含“%”,因为您可能会获得更适合人们查找的结果,但这取决于您。

p.FirstName + p.LastName LIKE的主要问题是Bob Smith将变成BOBSMITH LIKE ....尽管我想如果您坚持使用% search string %它仍然会返回结果,因为只需将您切换为@4ISNULL(@4,'')并摆脱第一个@4 = ''

我将猜测您的注释“在任何一个表中都没有名字或姓氏”表明这些字段可以为空。
如果任一值为null,则执行p.FirstName + p.Lastname之类的任何操作都将得到null结果,这又将导致谓词为false。 另外,由于您的LIKE谓词可以匹配名字的末尾和姓氏开头的字符,因此我个人不会在任何时候对这两个字段进行合并。

理想情况下,将字段设置为NOT NULL,然后执行此操作。

"AND (@4 IS NULL 
  OR p.FirstName LIKE '%' + @4 +'%' 
  OR p.LastName LIKE '%' + @4 + '%'
  OR eup.FirstName LIKE '%' + @4 +'%'
  OR eup.LastName LIKE '%' + @4 + '%')) " +

如果字段必须保持可为空,请执行此操作。

"AND (@4 IS NULL 
  OR coalesce(p.FirstName,'') LIKE '%' + @4 +'%' 
  OR coalesce(p.LastName,'') LIKE '%' + @4 + '%'
  OR coalesce(eup.FirstName,'') LIKE '%' + @4 +'%'
  OR coalesce(eup.LastName,'') LIKE '%' + @4 + '%')) " +

这些-或您的版本-都不会从字段索引中受益,因此在大型表上,性能可能令人讨厌。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM