Мы используем SQL Server 2005. Весь наш доступ к данным осуществляется через хранимые процедуры. Наши хранимые процедуры выбора всегда возвращают несколько наборов результатов.
Например:
CREATE PROCEDURE hd_invoice_select(@id INT) AS
SELECT * FROM Invoice WHERE InvoiceID = @id
SELECT * FROM InvoiceItem WHERE InvoiceID = @id
SELECT * FROM InvoiceComments WHERE InvoiceID = @id
RETURN
Уровень доступа к данным нашего приложения строит граф объектов на основе результатов (стиль O / R Mapper).
Проблема, с которой я столкнулся, заключается в том, что у нас есть много разных сохраненных процедур выбора счетов. Все они возвращают одну и ту же структуру, только для разных критериев выбора. Например, у меня также есть:
CREATE PROCEDURE hd_invoice_selectAllForCustomer(@customerID INT) AS
SELECT * FROM Invoice WHERE CustomerID = @customerID
SELECT * FROM InvoiceItem WHERE InvoiceID IN
(SELECT InvoiceID FROM Invoice WHERE CustomerID = @customerID)
SELECT * FROM InvoiceComments WHERE InvoiceID = @id
(SELECT InvoiceID FROM Invoice WHERE CustomerID = @customerID)
RETURN
и у меня есть много других, в том числе:
hd_invoice_selectActive()
hd_invoice_selectOverdue()
hd_invoice_selectForMonth(@year INT, @month INT)
и у меня один и тот же шаблон для многих понятий (клиенты, сотрудники и т. Д.)
Мы заканчиваем тем, что копируем много кода, и обслуживание очень сложно. Когда «структура» концепции меняется, мы должны пойти и исправить все процессы, и это очень подвержено ошибкам.
Итак, мой вопрос: каков наилучший способ повторного использования кода в сценарии?
Мы придумали решение, которое использует временные таблицы. Но это не очень элегантно. Я позволю вам поделиться своими идеями и, если необходимо, опубликую подробности моего решения в следующем сообщении, чтобы получить ваши комментарии об этом подходе.
Спасибо