为什么SQL语句在传递“”时返回所有行?

时间:2012-12-12 17:08:49

标签: c# sql-server-2008 select

我正在使用此SQL语句来获取行:

SELECT firstname, lastname 
FROM myTable 
WHERE ((lastname LIKE '" + parameter + "%')

parameter从文本框中获取值。文本框的默认值为" "

我的问题是,当文本框中没有输入任何内容时,我将获取所有行。我试着用

WHERE lastname = 

这只是给了我所有" "

的记录

获取排除数据库中空白的数据的正确方法是什么?当空白或“”作为参数传递时,也不会给出任何记录

4 个答案:

答案 0 :(得分:2)

您正在使用wilcard,因此对于空白搜索字符串,您最终会使用

... WHERE lastname LIKE '%'

将匹配所有内容。如果没有在搜索表单中输入任何内容,您只需在脚本级别检测到该内容并且不运行查询,例如:在php-ish术语中:

if (strlen($_GET['keywords']) == 0) {
   die("No search terms entered");
}

答案 1 :(得分:1)

SELECT firstname, lastname
FROM myTable
WHERE lastname LIKE '" + parameter + "%'
AND NULLIF(lastname,'') IS NOT NULL
AND '" + parameter + "' <> ''

很简单,只返回lastname以'parameter'开头的记录,并且只返回'parameter'不是空字符串的记录。

编辑:添加了代码,表明它永远不会返回带有空白姓氏的记录。

答案 2 :(得分:1)

首先,我希望你做一些消毒以避免sql注入。

然后你可以选择:

  • 如果包括trim()的清理参数为空,则不运行查询
  • SELECT firstname, lastname FORM myTable WHERE ((lastname LIKE '" + parameter + "%') AND ''<>'" + parameter + "'"

第二个是从表现点开始的不良做法,它会假设你放弃了消毒(非常糟糕)

另外,您应该注意,在您的清理过程中,您必须转义或删除特殊字符_和%,请参阅 http://msdn.microsoft.com/en-us/library/ms179859(v=sql.105).aspx

我不处理这个问题,一个等于%的非空参数将导致like '%%',相当于like '%'

答案 3 :(得分:0)

您可以在代码中测试参数变量的string.IsNullOrEmpty,这样您甚至不需要进行数据库调用。

在我看来,这是最有效的事情。