Я всегда делал это, используя значения и условия по умолчанию;например,
CREATE PROCEDURE [dbo].[searchForElement]
(
@Town nvarchar(100) = '',
@County nvarchar(100) = '',
@postcode nvarchar(100) = ''
)
AS
BEGIN
SET NOCOUNT ON;
SELECT <fields>
FROM table
WHERE
(@Town = '' OR Town LIKE '%'+@Town+'%')
AND (@County = '' OR County LIKE '%'+@County+'%')
AND (@postcode = '' OR postcode LIKE '%'+@PostCode +'%')
END
Редактировать:
Как правильно @gbn рекомендует, приведенное выше приведет к сканированию индекса, что может быть проблемой для больших таблиц.Если это проблема, решение состоит в том, чтобы ниже использовать ISNULL и тот факт, что добавление NULL к чему-либо приводит к NULL , это позволит искать индекс, потому что% 'понимается оптимизатором (протестировано на SQL2008).Это может быть менее читабельным, но лучше использовать индексы.
CREATE PROCEDURE [dbo].[searchForElement]
(
@Town nvarchar(100) = NULL,
@County nvarchar(100) = NULL,
@postcode nvarchar(100) = NULL
)
AS
BEGIN
SET NOCOUNT ON;
SELECT <fields>
FROM table
WHERE Town LIKE ISNULL('%'+@Town+'%', '%')
AND County LIKE ISNULL('%'+@County+'%', '%')
AND Postcode LIKE ISNULL('%'+@PostCode +'%', '%')
END