Это будет как прямой вопрос, так и предмет обсуждения. Сначала я задам прямой вопрос:
Может ли хранимая процедура динамически создавать другую хранимую процедуру? (Лично меня интересует SQL Server 2008, но в интересах более широкого обсуждения он останется открытым)
Теперь по причине, которую я спрашиваю. Вкратце (вы можете прочитать больше в другом месте), определяемые пользователем скалярные функции в SQL Server, в лучшем случае, являются узкими местами производительности. Я видел использование в нашей базе кода, которые замедляют общий запрос в 3-4 раза, но из того, что я прочитал, локальное влияние S-UDF может быть 10x +
Тем не менее, UDF потенциально хороши для повышения уровней абстракции, сокращения множества утомительных шаблонов, централизации логических правил и т. Д. В большинстве случаев они сводятся к простым выражениям, которые могут быть легко расширены встроенными - но это не так ( Я действительно думаю только о незапрашивающих функциях - например, манипуляциях со строками). Я видел сообщение об ошибке, которое будет исправлено в следующем выпуске - с некоторым взносом от MS. Но пока мы должны жить с (ИМХО) неработающей реализацией.
Один из способов - использовать вместо этого табличное значение UDF - однако это усложняет клиентский код способами, с которыми вам не всегда хочется иметь дело (особенно, когда UDF просто вычисляет результат выражения).
Так что моей безумной идеей было сначала написать проки с директивами препроцессора C, а затем передать их через препроцессор перед отправкой в RDBMS. Это может работать, но есть свои проблемы.
Это привело меня к моей следующей безумной идее, которая заключалась в том, чтобы определить «макросы» в самой БД и создать основной процесс, который принимает строку, содержащую необработанный SP с макросами, расширяет встроенные макросы, а затем отправляет их в в RDMS. Это не то, в чем хорошо работают SP, но я думаю, что это может сработать - если предположить, что вы можете сделать это в первую очередь - отсюда мой оригинальный вопрос.
Однако, теперь я объяснил свой путь к вопросу, я также хотел бы оставить его открытым для других идей. Я уверен, что я не единственный, кто думал в этом направлении. Возможно, уже есть сторонние решения? Мой поиск в Google еще не много.
Также я подумал, что это будет веселая тема для обсуждения.
[править]
Этот пост в блоге , который я нашел в своем исследовании, описывает ту же проблему, что и я. Я был бы счастлив, если бы кто-то мог указать на то, что я или постер блога, возможно, делали неправильно, что приводило к накладным расходам.
Я должен также добавить, что я использую WITH SCHEMABINDING на моем S-UDF, хотя, похоже, это не дает мне никакого преимущества