Я пытаюсь найти все таблицы и столбцы в базе данных, а здесь . Предлагаемый метод состоит в том, чтобы создать строки SQL-запроса, а затем EXEC их. Это хорошо работает, как хранимая процедура. (Другой пример имен переменных таблиц / столбцов - здесь . Опять же, EXEC используется для выполнения «динамического SQL».)
Однако мое приложение требует, чтобы я делал это в функции, а не в SP. (В нашей среде разработки возникают проблемы с получением результатов от SP.) Но в функции, по крайней мере в SQL Server 2008 R2, нельзя использовать EXEC; Я получаю эту ошибку:
Invalid use of a side-effecting operator 'INSERT EXEC' within a function.
Согласно ответу на этот пост, по-видимому, от разработчика Microsoft , это сделано намеренно; он не имеет ничего общего с INSERT, только тот факт, что когда вы выполняете динамически построенный код SQL, анализатор не может гарантировать отсутствие побочных эффектов. Поэтому он не позволит вам создать такую функцию.
Итак ... есть ли способ перебирать множество таблиц / столбцов внутри функции?
Я вижу из BOL , что
В функции допустимы следующие операторы: ...
- ВЫПОЛНИТЬ
операторы, вызывающие расширенные хранимые процедуры.
Да - Как можно гарантировать, что расширенные SP могут быть гарантированы без побочных эффектов?
Но это все равно мне не поможет:
Расширенная хранимая процедура, когда она вызывается изнутри
Функция не может возвращать наборы результатов клиенту . Любые ODS API, которые
вернуть наборы результатов клиенту вернет FAIL. Расширенный хранится
процедура может подключиться обратно к экземпляру SQL Server; однако это
не следует пытаться присоединиться к той же транзакции, что и функция,
вызвал расширенную хранимую процедуру.
Так как нам нужна функция для возврата результатов поиска, ESP не поможет.
Я действительно не хочу вдаваться в расширенный SP: увеличение количества языков программирования в среде усложнит нашу среду разработки больше, чем она того стоит.
Сейчас я могу придумать несколько решений, ни одно из которых не очень удовлетворительно:
- Сначала вызовите SP, который производит необходимые данные и поместит их в таблицу, затем выберите функцию, которая просто считывает результат из таблицы; Это может быть проблемой, если поиск занимает некоторое время, и два пользователя пересекаются. Или,
- Пусть приложение (а не функция) сгенерирует длинный запрос с именем каждой таблицы и имени столбца из БД. Интересно, может ли драйвер JDBC обрабатывать запросы так долго? Или,
- Пусть приложение (не функция) сгенерирует длинный ряд коротких запросов с именами каждой таблицы и имени столбца из БД. Это замедлит общий поиск.
Спасибо за любые предложения.
P.S. После дальнейших поисков я наткнулся на этот вопрос , который тесно связан. У него нет ответов.
Обновление: больше не нужно
Я думаю, что этот вопрос все еще актуален, и у нас может снова возникнуть ситуация, когда нам это нужно. Однако мне больше не нужен ответ для настоящей проблемы. После долгих проб и ошибок мне удалось заставить нашу прикладную среду извлекать результаты строк из RDBMS через драйвер JDBC из хранимой процедуры. Поэтому заставлять вещь работать как функцию не требуется.
Но если кто-нибудь опубликует здесь ответ, который поможет решить указанную проблему, я буду рад объявить и / или принять его соответствующим образом.