Из документов MSDN для create function
:
User-defined functions cannot be used to perform actions that modify the database state.
Мой вопрос просто - почему ?
Да, UDF, который изменяет данные, может иметь потенциально нежелательные побочные эффекты.
Да, это связано с накладными расходами, если UDF вызывается тысячи раз.
Но в этом весь смысл проектирования и тестирования - чтобы такие проблемы были устранены перед развертыванием. Так почему же производители БД настаивают на введении этих искусственных ограничений для разработчиков? В чем смысл языковой конструкции, которая по существу может использоваться только в качестве оболочки для select
операторов?
Причина этого вопроса заключается в следующем: я пишу функцию, возвращающую GUID для определенного уникального целочисленного идентификатора. Если GUID уже выделен для этого идентификатора, я просто возвращаю его; в противном случае я хочу сгенерировать новый GUID, сохранить его в таблице и вернуть вновь сгенерированный GUID. (Да, это звучит многословно и, возможно, безумно, но когда вы отправляете данные в другую компанию разработчиков, которая считает, что их дизайн был передан Богом и не может быть улучшен, проще просто улыбнуться, кивнуть и сделать то, что они просят ).
Я знаю, что могу использовать хранимую процедуру с выходным параметром для достижения того же результата, но затем я должен объявить новую переменную просто для хранения результата sproc. Кроме того, мне нужно преобразовать мой простой select
в цикл while, который вставляется во временную таблицу, и вызывать sproc для каждой итерации этого цикла.