Зависит от:
- как выглядят ваши данные,
- насколько они велики,
- каков точный результат (достаточно всех подходящих записей или топ-100),
- сколько ресурсов имеет ваша база данных.
вы можете попробовать что-то вроде:
CREATE PROC dbo.Search(
@param1 INT = NULL,
@param2 VARCHAR(3) = NULL
)
AS
BEGIN
SET NOCOUNT ON
-- create temporary table to keep keys (primary) of matching records from searched table
CREATE TABLE #results (k INT)
INSERT INTO
#results(k)
SELECT -- you can use TOP here to norrow results
key
FROM
table
-- you can use WHERE if there are some default conditions
PRINT @@ROWCOUNT
-- if @param1 is set filter #result
IF @param1 IS NOT NULL BEGIN
PRINT '@param1'
;WITH d AS (
SELECT
key
FROM
table
WHERE
param1 <> @param1
)
DELETE FROM
#results
WHERE
k = key
PRINT @@ROWCOUNT
END
-- if @param2 is set filter #result
IF @param2 IS NOT NULL BEGIN
PRINT '@param2'
;WITH d AS (
SELECT
key
FROM
table
WHERE
param2 <> @param2
)
DELETE FROM
#results
WHERE
k = key
PRINT @@ROWCOUNT
END
-- returns what left in #results table
SELECT
table.* -- or better only columns you need
FROM
#results r
JOIN
table
ON
table.key = r.k
END
Я использую эту технику в большой базе данных (миллионы записей, но запущена на большом сервере) для фильтрации данных из некоторых предопределенных данных. И это работает довольно хорошо.
Однако мне не нужны все соответствующие записи - в зависимости от запроса достаточно 10-3000 соответствующих записей.