Хорошо, это заставит меня звучать так, будто я придурок, но я действительно не хочу этого делать. Мой ответ на ваш вопрос - другой вопрос.
"Какое дело вы определяете?
политика развития, если вы этого не сделаете
понять, как работает база данных? "
Вы говорите, что "представление должно было бы просто перестраиваться каждый раз в любом случае". Вы хотите сказать, что любой код с представлением перекомпилируется при каждом запросе? Потому что это абсолютно не так (по крайней мере, в Oracle и SQL Server). Использование представлений является гораздо более гибким способом получения эффективных запросов, чем хранимых процедур, поскольку оптимизатор может повторно оптимизировать ваше представление в зависимости от того, как вы его используете. И как только это будет сделано, план запроса будет кеширован, поэтому он не должен выполнять перекомпиляцию. Показательный пример: Вы создаете это представление:
CREATE VIEW myOrders AS
SELECT c.CustomerID, c.LastName, c.FirstName, o.OrderID, o.OrderPrice
FROM Customers c
LEFT JOIN Orders o
ON o.CustomerID = o.CustomerID;
Затем вы решаете, что хотите получить список всех клиентов по имени Джон Смит:
SELECT c.CustomerID
FROM myOrders
WHERE c.LastName = 'Smith' AND c.FirstName = 'John';
Поскольку это представление, соединение с «Заказами» оптимизируется. Если бы вы попытались модулировать это в хранимой процедуре, ну, вы не могли. Вам, вероятно, придется сделать еще одно sproc только для этой цели. И довольно скоро вы столкнетесь с проблемой, которая у вас есть, а это тонна едва обслуживаемых процедур.
Почему вы используете хранимые процедуры? Какую проблему вы пытаетесь решить? Инкапсуляция? Я бы сказал, что для SELECT UDF могут быть более полезными. Я также утверждаю, что запросы LINQ-типа на среднем уровне еще более гибкие. Вы пытаетесь оптимизировать производительность с помощью хранимых процедур? Если это так, знайте и понимайте, что каждый выполняемый вами специальный запрос оптимизируется и кэшируется. Если вы используете SQL Server 2005+, вы можете даже заставить его параметризировать и кэшировать планы запросов, даже если вы не указываете параметры явно.
Хранимые процедуры имеют свое место, но их недостатки, связанные с удобством обслуживания, гибкостью использования и, да, даже производительностью, означают, что вы должны использовать их разумно, а не создавать общие политики для ваших разработчиков.