2013-05-05 66 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 + '%'