2013-05-05 23 views
12

Tôi có một thủ tục lưu trữ sử dụng các nhà điều hành LIKE để tìm kiếm một vị trí xe tải trong một số thông số khácSử dụng toán tử NHƯ với thủ tục lưu trữ thông số

@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) 

tôi null các thông số khác và tìm kiếm theo địa điểm chỉ nhưng nó luôn luôn không trả lại kết quả nào ngay cả khi tôi đã sử dụng tên đầy đủ của địa điểm

+1

Để xử lý một cách chính xác giá trị NULL bạn cần phải kiểm tra cho nó rõ ràng, ví dụ '([Ngày] = @Date hoặc @Date là NULL)'. Nhân tiện, bạn chỉ cần kiểm tra ''%' + @location + '%'', hai thử nghiệm vị trí còn lại là thừa. – HABO

+1

[Thói quen xấu để đá: sử dụng các kiểu JOIN cũ] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins. aspx) - kiểu cũ * kiểu danh sách phân cách bằng dấu phẩy * đã bị ngừng với chuẩn ANSI - ** 92 ** SQL (hơn ** 20 năm ** trước) –

Trả lời

25

Kiểu dữ liệu của bạn cho @location nchar(20) phải là @location nvarchar(20), vì nChar có độ dài cố định (đầy Spaces).
Nếu Vị trí là NCHAR quá bạn sẽ phải chuyển đổi nó:

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

Để kích hoạt các thông số nullable với và AND điều kiện chỉ cần sử dụng IsNull hoặc liên hiệp để so sánh, mà là không cần thiết trong ví dụ của bạn sử dụng OR.

ví dụ: nếu bạn muốn so sánh với Vị trí VÀ Ngày và Giờ.

@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 nhờ bạn đời đã làm việc cho tôi –

+0

Vị trí như '%' + IsNull (@ location, Location) + '%') sẽ trả về tất cả các bản ghi nếu thông số vị trí là null, có thể không phải là hành vi mong muốn. câu hỏi đặt ra là nếu không có tiêu chí tìm kiếm (nếu null tham số vị trí được coi là không có tiêu chí tìm kiếm) được thông qua, thì SP sẽ trả về mọi thứ hay không có gì? (hãy sửa các hạn chế bình luận ở đây, nếu đặt tham số với @ symble, S.O. sẽ nghĩ nó ở một ai đó :) – koo9

-3

EG: SO SÁNH VỚI VILLAGE TÊN

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

tôi đã làm việc trên cùng. Kiểm tra câu lệnh dưới đây. Đã làm cho tôi!!


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