2010-06-22 57 views
0

我有一个使用LIKE的存储过程(SP)。让我们将其简化为:SELECT * FROM customers WHERE name LIKE'%'+ @query +'%'在T-SQL中使用LIKE与存储过程完全匹配?

我想使用它(可选)精确匹配搜索不改变存储过程,但有一个棘手的参数;)

有没有办法来“取消” 2“%”用聪明的@query

回答

2

当然,使用一个变量来保存两个%符号,并且当你想要一个完全匹配时将它设置为一个空字符串。

使用从Vinko的基本答案,你可以有

 
create procedure match 
    @needle varchar(max), @mode int 
as 
begin 
declare @like char(1); 

set @like = case when @like = 1 then '%' else '' end 

SELECT * FROM customers WHERE name LIKE (@like + @needle + @like) 
end 

0

为什么它必须这样?像这样的东西更有意义(未经测试,可能有一些错误/错别字)

create procedure match 
    @needle varchar(max), @mode int 
as 
begin 
    declare @query varchar(max) 
    if @mode = 1 begin 
     set @query = 'SELECT * FROM customers WHERE name LIKE ''%' + @needle + '%''' 
    end 
    else begin 
     set @query = 'SELECT * FROM customers WHERE name = ''' + @needle + ''' 
    end 
    exec @query 
end 

编辑:既然你想避免改变原型,你可以模拟模式参数,或者简单地用%S发送字符串

create procedure match 
    @modeneedle varchar(max) 
as 
begin 
    declare @mode varchar(1) 
    declare @needle varchar(max) 

    set @mode=substring(@modeneedle,1,1) 
    set @needle=substring(@modeneedle,2,len(@modeneedle)) 

    declare @query varchar(max) 
    if @mode = '1' begin 
     set @query = 'SELECT * FROM customers WHERE name LIKE ''%' + @needle + '%''' 
    end 
    else begin 
     set @query = 'SELECT * FROM customers WHERE name = ''' + @needle + ''' 
    end 
    exec @query 
end 
+1

感谢您的回答。你是真的。 我希望我不能改变过程的原型(它被WS调用);) 没有可以删除/保留上一个/下一个字符的东西吗? 事实上,我想要做我自己的SQL注入,大声笑! – zar 2010-06-22 08:44:38

+1

你能转过头来问题吗?保留存储过程原样,除了删除已添加的%符号,并且在调用过程时要传递的字符串中添加%符号(如果要执行通配符搜索) – 2010-06-22 09:13:04

+0

我的SP广泛应用于“LIKE-mode”。我正在寻找一种快速的方法来获得与同一个SP的精确匹配。 感谢大家的回答。 – zar 2010-06-22 09:40:53

0

注:我永远永远不建议这样做。这是一个迹象,你真的在​​做,真的是错的。说了这么多,如果你真的想要做自己的SQL注入和存储过程是这样的:

set @query = 'SELECT * FROM tmpCustomer WHERE name LIKE ''%' + @needle + '%''' 
exec (@query) 

然后运行存储过程是这样的:

exec match '~~~~THIS WILL NEVER BE IN THE DATABASE~~~~'' OR name = ''testing'' OR ''notapercentagesign'' = ''' 

...应该做的完全匹配搜索“测试”。

但坦率地说,如果你需要做这样的东西用自己的计算机系统,那么你已经失去了,和这里的一些证据:运行存储过程像这样

exec match '''; DELETE FROM Customer; SELECT * FROM Customer WHERE name LIKE '' ' 

.. .will删除所有客户记录:)

+0

我正在寻找一个聪明的方式,我有我的答案;)。 我会做得很好。谢谢。 – zar 2010-06-22 09:34:37

+0

@zar好动:) – 2010-06-22 09:39:43

0

尝试:

select * 
from customers 
where case @exact then name = @query else name like '%' + @query + '%' end;