Динамический доступ к таблицам из другой базы данных внутри пользовательской функции

У меня есть определяемая пользователем табличная функция в SQL Server, которая собирает данные из нескольких таблиц, включая пару таблиц другой базы данных. Это делается жестко запрограммированным именем базы данных в запросах, но мы хотим сделать имя базы данных настраиваемым (поскольку наши базы данных обычно совместно используют сервер с базами данных других приложений).

Я попытался создать строку динамического запроса внутри функции, используя имя базы данных, которое хранится в таблице конфигурации, но:

  1. Когда я попробовал exec(@sqlStatement), SQL Server сказал, что строка выполнения не разрешена внутри функции.
  2. Затем я попробовал exec sp_executesql @sqlStatement, и функция была создана, но когда вы ее выполняете, SQL Server говорит, что внутри функции вы можете запускать только расширенные функции и процедуры.

Итак, вопрос: возможно ли создать функцию или хранимую процедуру, которая обращается к таблице в другой базе данных, без необходимости воссоздавать функцию, когда имя базы данных отличается?

ТИА.


person Alberto Martinez    schedule 17.03.2010    source источник


Ответы (1)


Я действительно рекомендую вам остановиться на фиксированных именах баз данных, чтобы вы могли избежать всей этой проблемы с использованием динамического sql. Вы не можете придумать уникальные имена баз данных, например: your_company_name_XYZ и your_company_name_ABC? если это не вариант, вы будете выполнять много динамического SQL, вам следует прочитать Проклятие и благословения динамического SQL Эрланда Соммарскога

Все ограничения, которые вы упоминаете в вопросе, являются ограничением функций SQL Server. Вы можете без проблем генерировать и выполнять динамический SQL в хранимой процедуре.

person KM.    schedule 17.03.2010
comment
Что касается уникальных имен баз данных, это было бы хорошей идеей, но я не думаю, что они хотят изменить имена существующих баз данных, поскольку это часть второстепенной функции (т.е. не является ключевой частью приложения). - person Alberto Martinez; 17.03.2010