2009-10-01 4 views
1

Я работаю над веб-проектом, где мне нужно получить (скажем) записи сотрудников. В некоторых случаях я должен получить одну запись, предоставив EmployeeID. В других случаях я должен получить несколько записей сотрудников, предоставив идентификатор SectorID. Эта логика может быть расширена, чтобы охватить дополнительные сценарии: получить все записи сотрудников, получить записи сотрудников по квалификации и т. Д.Является ли хорошей практикой использование одной хранимой процедуры, которая принимает переменное число параметров

Хорошо ли использовать одну хранимую процедуру, которая принимает переменное количество параметров для обработки различных сценариев (используя значения по умолчанию, когда параметр не указан). Пример:

CREATE PROCEDURE [dbo].[GetEmployeeRecords] 
(
    @employeeID int = -1, 
    @sectorID int = -1 
) 

AS 

BEGIN 

    SELECT EmployeeID, 
      EmployeeFirstName, 
      EmployeeLastName, 
      s.SectorName 

    FROM dbo.Employees e 

    INNER JOIN Sectors s ON e.SectorID = s.SectorID 

    WHERE (e.EmployeeID = @EmployeeID OR @EmployeeID = -1) 

    AND (e.SectorID = @SectorID OR @SectorID = -1) 

ответ

2

здесь очень всеобъемлющая статья на эту тему:

Dynamic Search Conditions in T-SQL by Erland Sommarskog

охватывает все вопросы и методы пытаются писать запросы с несколькими дополнительными условиями поиска

здесь оглавления :

Introduction 
     The Case Study: Searching Orders 
     The Northgale Database 
    Dynamic SQL 
     Introduction 
     Using sp_executesql 
     Using the CLR 
     Using EXEC() 
     When Caching Is Not Really What You Want 
    Static SQL 
     Introduction 
     x = @x OR @x IS NULL 
     Using IF statements 
     Umachandar's Bag of Tricks 
     Using Temp Tables 
     x = @x AND @x IS NOT NULL 
     Handling Complex Conditions 
    Hybrid Solutions – Using both Static and Dynamic SQL 
     Using Views 
     Using Inline Table Functions 
    Conclusion 
    Feedback and Acknowledgements 
    Revision History 
+0

Статья потрясающая! Бесконечно благодарен! – Max

+1

, если вы прочтете статью, вы увидите, что нет простого и/или правильного ответа. как вы справляетесь с этим, все зависит от непосредственной ситуации и компромиссов, которые вы готовы сделать. –

0

Я думаю, было бы легче поддерживать и тест у вас есть один хранимая процедура с фиксированным интерфейсом для каждого сценария.

0

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

Если SP разделен на несколько, тогда было бы проще, если бы другие модули в вашей системе имели доступ к их конкретным потребностям (например, какой-либо другой модуль хотел получить emp по отдельному идентификатору сектора, тогда зачем им нужно пройти все необязательные параметры).

И каждый раз, когда один и тот же ИП изменяется, каждый, потребляющий этот sp, должен менять свой ЦАП.

+0

Мое беспокойство заключается в том, что если вы создадите 10 различных хранимых процедур для обработки всех возможных сценариев, то это может быть кошмаром, чтобы поддерживать их. Если что-то меняется в логике одного sp, вы должны делать это и во всех остальных. – Max

+0

, если вы находитесь на SQL Server 2005 или выше, вы можете использовать IF, чтобы иметь несколько запросов в одной и той же процедуре, и каждый из них будет иметь сохраненный для него план запроса (эквивалент процедуры для каждого из более старых версий), см. Статью в моей ответьте или эта ссылка на соответствующий раздел: http://www.sommarskog.se/dyn-search-2005.html#IF –

+0

KM. Вы можете сделать это и в ранних версиях SQL Server. – HLGEM

0

В вашей процедуре есть OR, что предотвращает использование индексов, что заканчивается более низкой производительностью. Вы могли бы построить SQL динамически (sp_executesql), но потребуется перекомпилировать запрос каждый раз, когда он выполняется. Вы теряете преимущество, которое хранимые процедуры имеют (нет необходимости перекомпилировать запрос каждый раз, когда он используется). Если вы решите это сделать, прочитайте опцию «WITH RECOMPILE».

Смежные вопросы