Предложение OUTPUT для хранимой процедуры против табличной функции
Я учусь на сертификацию MCTS 70-433 "Разработка базы данных", и в тексте, который я изучаю, один из самотестирований имеет этот вопрос.
У вас есть хранимая процедура с именем Get_NewProducts. Вы хотите вставить результаты этой хранимой процедуры в таблицу Production.Product и вывести значения INSERTED.* С помощью предложения OUTPUT. Каков наилучший способ сделать это?
Есть четыре возможных ответа. Первые три варианта - это все варианты выражения "INSERT... OUTPUT... EXECUTE Get_NewProducts". Четвертый вариант, D, просто говорит: "Переписать хранимую процедуру как табличную функцию".
D правильный ответ. Я не совсем понимаю, почему, и в тексте нет ничего, что объясняет это. У кого-нибудь есть идеи?
4 ответа
Ну, из MSDN:
"Предложение OUTPUT не поддерживается в инструкциях DML, которые ссылаются на локальные многораздельные представления, распределенные многораздельные представления или удаленные таблицы или операторы INSERT, которые содержат execute_statement".
Моя реакция коленного рефлекса на это (я ударил его снова несколько дней назад):
- Хранимые процедуры могут быть и часто являются вложенными. Процедура A вызывает B, которая вызывает C и так далее.
- Код, вызываемый оператором INSERT...EXECUTE..., сам по себе не может содержать или ссылаться на оператор INSERT...EXECUTE.... Если вы вставите один из них, вы не сможете "встроить" эту процедуру в более позднюю INSERT...EXECUTE...
Это может показаться тривиальным, и, как правило, так происходит, по крайней мере, до тех пор, пока вы не включите его в проект рефакторинга. Идиома: обжегся на молоке - дует на воду. (И это укусило меня несколько раз.)
Есть много причин стиля и внешнего вида, но они немного поверхностны. Вероятно, существует серьезная техническая причина, возможно, связанная с перекомпиляцией или планами выполнения запросов; если так, надеюсь, кто-то еще опубликует их.
Только одна причина, по которой их "правильный ответ" неправильный: у TVF есть проблемы с проверкой ошибок и отчетностью.
Это действительно странный вопрос / ответ, потому что D даже не представляется возможным с учетом вопроса.
Я не знаю "правильного" ответа, но я думаю, что автор думает, что 70-433 Database Development
это экзамен, ориентированный на разработку и дизайн, в отличие от одного из экзаменов по "доступу к данным", например 70-442. На этапе проектирования вы должны уметь обнаруживать неисправности в существующей системе и предлагать лучшие решения. Автор считает, что хранимую процедуру, для которой необходимо вставить вывод в таблицу, лучше переписать как TVF. Вы найдете минусы и плюсы в том, что TVF лучше, чем процедура (вставьте exec nesting pro, просто начните с плохой обработки ошибок).
Я сам сдал некоторые из этих экзаменов и обнаружил, что материалы для подготовки к экзаменам и сами экзамены не всегда являются абсолютным основным ориентиром по их предмету. В целом они верны и имеют хорошую ценность, но у них есть проблемы тут и тогда, и я нашел, по крайней мере, некоторые сомнительные рекомендации и даже просто неправильные. И по темам, которые я нашел неправильными, я на самом деле являюсь главной ссылкой на эту тему, они освещали код, который я написал для функций, которые я разработал...
Мой совет - почувствовать ожидаемый ответ и подготовиться к нему во время экзамена. Учитывая ваши таланты и ваш ответ, который я видел, вы уже выше уровня экзамена, так что просто пройдите через обручи, заработайте свой значок экзамена и двигайтесь дальше.