имена переменных таблицы или столбца в функции - PullRequest
1 голос
/ 10 декабря 2011

Я пытаюсь найти все таблицы и столбцы в базе данных, а здесь . Предлагаемый метод состоит в том, чтобы создать строки 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 из хранимой процедуры. Поэтому заставлять вещь работать как функцию не требуется.

Но если кто-нибудь опубликует здесь ответ, который поможет решить указанную проблему, я буду рад объявить и / или принять его соответствующим образом.

1 Ответ

0 голосов
/ 14 декабря 2011

Sp - это в основном предопределенный SQL-статус с некоторыми дополнениями.

Так что, если у вас было ПСЕВДОКОД

Create SP_DoSomething As
  Select * From MyTable
END

И вы не можете использовать SP

Затем вы просто выполняете SQL как в «Select * From MyTable»

Что касается кода Naff SQL. Для начала вы можете присоединить таблицу к столбцу с предложением where, которое избавится от этой строки построчно, если что-то будет.

Задайте другой вопрос. Например, Как это можно улучшить, есть много возможностей для большего количества попыток, чем у меня.

...