SQL通配符不返回数据?

时间:2010-08-04 16:23:09

标签: sql stored-procedures gridview wildcard

我有一个select语句,通过存储过程在gridview中使用:

SELECT * FROM T_Computer WHERE (ISTag LIKE '%' + @ISTag + '%') AND Status <> 'Trashed' AND Status <> 'Sold' AND Status <> 'Stored'

@ISTag,一个nchar由文本框值决定,如果文本框为空我将默认值设置为%,在我看来应该基本上否定where子句的那一部分并返回所有行除外由状态列否定的那些。相反,它没有返回任何东西。如果我删除“+ @ISTag +”,它就会按照我想要的方式执行。

基本上3%的人没有回报,但2%的回报是我想要的。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

以下是替代方案,将@ISTag参数的默认值保留为NULL

SELECT * 
FROM T_Computer 
WHERE (@ISTag IS NULL OR (ISTag LIKE '%' + @ISTag + '%')) 
AND Status <> 'Trashed' 
AND Status <> 'Sold' 
AND Status <> 'Stored'

答案 1 :(得分:3)

我真的很感兴趣。首先,我对一个包含13221行的表运行了这两个查询,并在第一个实例中得到了每一行,在第二个实例中得到了大约一半:

declare @rad char(30)
select @rad = '%'

select count(*) from xofdoc where docdesc like '%%%'
select count(*) from xofdoc where docdesc like '%' + @rad + '%'

另一方面,如果我将@rad的声明更改为 varchar (30),则两个查询都会拉出所有行。

我提出这个问题的原因是因为@IsTag的数据声明可能会发生一些事情。你没有说它是如何宣布的。这很重要,因为char是一个固定长度的字符串,这意味着设置为'%'值的char(5)实际上将具有值'% '。因此,语句'%' + '% ' + '%'的评估结果为:'%% %'。因此,它只会找到在whered列中至少有四个连续空格的行。另一方面,varchar是一个可变长度项,并且忽略尾随空格,在上述情况下会导致'%%%',因此通配符整个列。

编辑添加:nchar或char,在这种情况下没有任何区别。如果您现在正在使用nchar,请将其更改为nvarchar。

答案 2 :(得分:0)

你的替代%标记是否被转义?如果搜索匹配文字%字符,你就不会得到你所期望的。

另外,没有必要将%用于空字段。 %%应返回与%%%相同的结果。

答案 3 :(得分:-1)

问题是两个连续的百分号(%%)使它与文字'%'字符匹配。所以3连续意味着“匹配百分比符号,然后匹配任何字符”。

正如LittleBobby所指出的,不要使用'%'作为空值的默认值。