2014-01-06 3 views
1

В настоящее время я пытаюсь очистить некоторые хранимые процедуры. Есть около 20 из них, которые выглядят очень похожими и выполняют многие из одних и тех же вещей, но имеют несколько разные параметры и фильтруют данные по-разному.Должен ли я использовать временные таблицы для вложенных хранимых процедур?

По большей части все сохраненные процессы начинаются с загрузки некоторых данных в одну или две переменные таблицы (которые обычно различаются в зависимости от процессов). После этого весь код для каждого sproc более или менее одинаковый. Они выполняют некоторые протоколирования и применяют некоторые дополнительные общие фильтры.

Я хотел по крайней мере превратить общие части в хранимые процедуры, чтобы код был легче читать, и нам не нужно было бы открывать 20 процедур для обновления одной и той же строки sql, но использование табличных переменных предотвращает его. Мы используем Sql Server 2005, и, насколько мне известно, мы не можем использовать параметры табличных значений в наших хранимых процедурах.

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

Во вложенных хранимых процедурах следует предположить, что временная таблица уже создана в другом месте и просто запрашивает ее? Я могу проверить, существует ли таблица, но что, если это не так? Есть ли хорошая альтернатива этому в 2005 году? Это запутывает для других разработчиков, которые открывают один из вложенных хранимых процессов и видят временную таблицу, созданную в другом месте? Мне просто нужно добавить много полезных отзывов?

+2

В вашей вложенной программе; конечно, вы можете проверить, существует ли таблица или нет. Если не существует, то 'RAISERROR' с некоторым сообщением об ошибке. Поскольку вы используете SS2005, #temptable будет вариантом, который у вас есть. Комментировать ваш код для удобства чтения никогда не бывает плохой практикой. – Rahul

+0

Существует ли какое-либо соглашение об именах для процедур, которые предназначены для вложенности и не должны вызываться самостоятельно? Я знаю, что должен добавлять комментарии, но я видел много случаев, когда код изменяется, но никто не обновляет комментарий, чтобы его отразить. Разумеется, это то, с чем мы можем справиться с хорошими практиками, но все, что может помочь в удобочитаемости и последовательности, приветствуется. Я думаю, что временные таблицы, вероятно, мой единственный вариант на этом этапе. – bsayegh

+0

говорить об именовании; следуйте любому соглашению, которое лучше подходит для вашей организации (я просто дал имя SP, которое будет отражать цель SP). Если изменения кода происходят, то соответственно изменение комментария является ответственностью разработчика. Кроме этого, все, что вы делаете, выглядит правильно для меня. – Rahul

ответ

1

В вашей вложенной процедуре; конечно, вы можете проверить, существует ли таблица или нет. Если не существует, то RAISERROR с некоторым сообщением об ошибке. Поскольку вы используете SS2005, #temptable будет вашим вариантом. Комментировать ваш код для удобства чтения никогда не бывает плохой практикой.

Говоря об именовании; следуйте любому соглашению, которое лучше подходит для вашей организации (я просто дал имя SP, которое будет отражать цель SP). Если изменения кода происходят, то соответственно изменение комментария является ответственностью разработчика. Кроме этого, все, что вы делаете, выглядит правильно для меня.

+0

@MartinSmith, думал о том, чтобы ответить на этот вопрос, но заставил его работать в комментариях. Более того, есть много таких комментариев, которые отвечают только в SO (что лично мне не нравится, потому что у меня очень мало возможностей быть полезными для будущего читателя), но никогда не видел, чтобы кто-то предлагал сделать ответ, аналогично тому, как вы это делали (что я действительно ценю). Не уверен, каково фактическое соглашение, за которым я должен следовать (никогда не оставляйте комментарий только для ответа или что?). В любом случае, снял мой комментарий и дал ему ответ. Благодарим за это. Теперь дайте +1 ... LOL :) – Rahul

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