Предположим, у меня есть хранимая процедура, которая с некоторыми изменениями дублируется в нескольких базах данных. И я хочу сослаться на базу данных, в которой хранится хранимая процедура, даже если она выполняется в другой базе данных.
Есть ли способ получить полный путь (..) или иным образом получить базу данных, в которой хранится хранимая процедура, а не текущую базу данных?
sql-server
stored-procedures
Джим Кларк
источник
источник
Ответы:
Просто используйте одночастные или двухкомпонентные имена в хранимой процедуре, и она будет ссылаться на объекты в базе данных, содержащей хранимую процедуру. В частности,
Для статического SQL в хранимой процедуре:
Неквалифицированные имена объектов разрешаются относительно схемы, содержащей хранимую процедуру.
Имена из двух частей будут сопоставляться с базой данных, содержащей хранимую процедуру.
Для динамического SQL в хранимой процедуре:
Неквалифицированные имена объектов разрешаются относительно схемы по умолчанию идентификатора пользователя, выполняющего хранимую процедуру (по умолчанию вызывающая сторона).
Имена из двух частей будут сопоставляться с базой данных, содержащей хранимую процедуру.
Функция db_name () будет возвращать имя базы данных, содержащей хранимую процедуру, в обоих случаях.
источник
Вот небольшой пример, который я собрал, показывающий общие функции, используемые для того, чтобы приблизиться к тому, что вы ищете.
источник
Добавление к отличному ответу Дэвида Брауна :
Вам повезло, потому что именно так обычные / постоянные несистемные хранимые процедуры уже работают таким образом, и вам действительно нужно приложить все усилия, чтобы заставить объекты работать в текущей БД. Так работают функции, просто у хранимых процедур у вас есть опции - помечать их как «системные хранимые процедуры» или создавать временные хранимые процедуры - чего у вас нет с функциями / представлениями / триггерами / и т. Д.
Поскольку встроенные функции ведут себя несколько иначе, чем статический SQL во временных хранимых процедурах, в следующем примере используется временная таблица для ссылки как в UDF, так и в Inline-TVF. Правда, следующий пример на самом деле не тестирует временные хранимые процедуры, но причина, по которой я использовал невременную таблицу, заключается в том, что, поскольку у нас есть один экземпляр отличающегося поведения, мы должны убедиться, что такого поведения здесь не происходит. В следующем примере, если какой-либо тип функции знал о «текущей» базе данных, то ссылка на временную таблицу вызвала бы ошибку.
НАСТРОИТЬ
ТЕСТОВОЕ ЗАДАНИЕ
источник