Пример:
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
Двигатель предполагает, что object_id находится в
контекст текущей базы данных.
запрос, который ссылается на object_id в
другая база данных возвращает NULL или
неверные результаты.
Причины, по которым мне нужно это сделать:
Я не могу использовать другую базу данных из SP
Я не могу создать заглушку прокси UDF (или изменить что-либо) в других базах данных или в master (или любой другой базе данных, кроме моей), чтобы выручить меня.
Так как я могу получить базу данных из OBJECT_ID('AnotherDB.ASchema.ATable')
, когда я нахожусь в ThisDB?
Моя цель - взять, возможно, частично определенное имя из таблицы конфигурации, преобразовав его в текущем контексте в полное имя, использовать PARSENAME, чтобы получить имя базы данных, а затем динамический SQL, чтобы построить сценарий, чтобы получить непосредственно к таблицам метаданных с помощью database.sys.*
или USE db; sys.*