2013-05-05 23 views
12

我已经使用了LIKE操作一些其它参数搜索卡车位置的存储过程使用与存储过程LIKE操作参数

@location nchar(20), 
    @time time, 
    @date date 
AS 
    select 
     DonationsTruck.VechileId, Phone, Location, [Date], [Time] 
    from 
     Vechile, DonationsTruck 
    where 
     Vechile.VechileId = DonationsTruck.VechileId 
     and (((Location like '%'[email protected]+'%') or (Location like '%'[email protected]) or (Location like @location+'%')) or [Date][email protected] or [Time] = @time) 

我总是空的其他参数,只能通过位置搜索,但它即使当我使用位置的全名时也不会返回结果

+1

要正确处理您需要明确地检查它,例如NULL值'([Date] = @Date或@Date为NULL)'。顺便说一下,你只需要检查''%'+ @location +'%'',另外两个位置测试是多余的。 – HABO 2013-05-05 03:01:01

+1

[踢坏的习惯:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) - 老式*逗号分隔的表*样式列表已停止使用ANSI - ** 92 ** SQL标准(超过** 20年前**) – 2013-05-05 07:15:16

回答

25

由于nChar具有固定长度(填充了空格),因此@location nchar(20)的数据类型应为@location nvarchar(20)
如果位置是NCHAR过你将不得不把它转换:

... Cast(Location as nVarchar(200)) like '%'[email protected]+'%' ... 

为了使空的参数的使用和AND条件只是使用ISNULL或合并作比较,这是不使用OR需要在你的榜样。

例如如果您想比较地点和日期和时间。

@location nchar(20), 
@time time, 
@date date 
as 
select DonationsTruck.VechileId, Phone, Location, [Date], [Time] 
from Vechile, DonationsTruck 
where Vechile.VechileId = DonationsTruck.VechileId 
and (((Location like '%'+IsNull(@location,Location)+'%')) and [Date]=IsNUll(@date,date) and [Time] = IsNull(@time,Time)) 
+0

+1感谢队友为我工作 – 2014-06-16 13:06:03

+0

位置像'%'+ IsNull(@位置,位置)+'%')将返回所有记录,如果位置参数为空,这可能不是所需的行为。问题是如果没有搜索条件(如果空位置参数被视为没有搜索条件)通过,SP是否应该返回一切或什么都不返回? (请在这里修改注释限制,如果将参数放在@ symble中,S.O.会认为它在某人:) – koo9 2017-11-27 18:31:30

-3

EG:比较村名

ALTER PROCEDURE POSMAST 
(@COLUMN_NAME VARCHAR(50)) 
AS 
SELECT * FROM TABLE_NAME 
WHERE 
village_name LIKE + @VILLAGE_NAME + '%'; 
0

我工作一样。检查以下声明。为我工作!


SELECT * FROM [Schema].[Table] WHERE [Column] LIKE '%' + @Parameter + '%'