Пример:
USE AnotherDB
-- This works - same ID as from other DB
SELECT OBJECT_ID('AnotherDB.ASchema.ATable')
-- This works
SELECT OBJECT_NAME(OBJECT_ID('AnotherDB.ASchema.ATable'))
USE ThisDB
-- This works - same ID as from other DB
SELECT OBJECT_ID('AnotherDB.ASchema.ATable')
-- Gives NULL
SELECT OBJECT_NAME(OBJECT_ID('AnotherDB.ASchema.ATable'))
Очевидно, что функции метаданных ожидают текущую базу данных. Записи BOL обычно имеют такой язык для таких функций, как OBJECT_NAME
и т.д.:
База данных Microsoft SQL Server 2005 Engine предполагает, что object_id находится в контекст текущей базы данных. запрос, ссылающийся на object_id в другая база данных возвращает NULL или неправильные результаты.
Причины, по которым мне нужно это сделать:
-
Я не могу использовать другую базу данных из SP
-
Я не могу создать прокси UDF-заглушку (или изменить что-либо) в других базах данных или в master (или любой другой базе данных, кроме моей), чтобы помочь мне.
Итак, как я могу получить базу данных из OBJECT_ID('AnotherDB.ASchema.ATable')
, когда я в ThisDB?
Моя цель - взять возможно частично квалифицированное имя из таблицы конфигурации, разрешив его в текущем контексте на полное имя, использовать PARSENAME для получения имени базы данных, а затем динамического SQL для создания script, чтобы иметь возможность для непосредственного доступа к таблицам метаданных с помощью database.sys.*
или USE db; sys.*