Есть ли способ создать параметризованный запрос или хранимую процедуру, которая принимает <= N параметров? - PullRequest
4 голосов
/ 15 июля 2009

Предположим, у меня есть экран поиска, предназначенный для поиска предметов. На экране имеются различные необязательные параметры поиска, которые могут привести к изменению оператора SQL-запроса.

Вот несколько примеров поиска:

  1. Описание поиска
  2. Описание поиска + идентификатор поставщика товара
  3. Описание поиска + идентификатор поставщика товара + иерархия элементов уровня 1 id
  4. Описание поиска + идентификатор поставщика товара + идентификатор иерархии товаров уровень 1 идентификатор + идентификатор уровня 2
  5. Иерархия элементов уровня 1 ID + идентификатор уровня 2 (без описания, без идентификатора поставщика элемента)

... вы поняли идею. Существует довольно много возможных комбинаций. Я надеялся использовать параметризованные запросы для повышения производительности и тому подобное (плюс я использую их для остальных запросов по всей программе).

Есть ли способ сделать это, или я вынужден либо создать каждый возможный запрос и соответствующий объект SQLiteCommand, либо динамически построить строку запроса с помощью StringBuilder на основе выбранных параметров?

Я использую поставщик данных SQLite.NET с C # 3.0 (на компактной платформе 3.5).


UPDATE

Основываясь на некоторых предложениях с нулевыми значениями по умолчанию для параметров и использованием (@param isnull or column = @param), я думаю, что я смогу заставить это работать. Я буду держать вас в курсе.

ПРИМЕЧАНИЕ. Я избегаю использования хранимых процедур, потому что остальная часть кода использует параметризованные запросы вместо хранимых процедур. Я хотел бы, чтобы все было в соответствии с здравым смыслом будущих программистов обслуживания. В любом случае, это не должно иметь большого значения.


ОБНОВЛЕНИЕ 2

Это сработало замечательно на настольной системе (именно там я провел первоначальное тестирование запросов). Однако это было очень медленно на устройстве Windows CE, которое я использовал. Необычайно медленный Тем не менее, я могу определенно использовать это в будущем, и это очень удобно. Только не при выполнении запросов на мобильном устройстве.

Спасибо

Ответы [ 3 ]

4 голосов
/ 15 июля 2009

Со стороны хранимой процедуры вы можете установить значения по умолчанию в null, а затем построить выражение where для размещения этого значения null.

ALTER Procedure FooProcedure 
    @SupplierID INT = NULL,
    @LevelOne INT = NULL 
AS
BEGIN

    SELECT SupplierID, LevelOne 
      FROM FooTable
     WHERE @SupplierID IS NULL OR SupplierID = @SupplierID
       AND @LevelOne IS NULL OR LevelOne = @LevelOne 

END
1 голос
/ 15 июля 2009

Вы можете назначить значения параметров по умолчанию и обрабатывать логику в вашей хранимой процедуре:

create procedure mySproc(@description nvarchar(20) = null, @supplierid int = null, etc...)

обрабатывает логику того, являются ли параметры нулевыми в теле sproc.

0 голосов
/ 15 июля 2009

Лучше всего создавать хранимые процедуры для каждого случая.

Если у вас есть встроенный код SQL в вашем c #, созданный с помощью StringBuilder, то планы выполнения никогда не будут кэшироваться и не будут работать так же, как с хранимыми процедурами.

...