В SQL 2005 и выше это, конечно, тривиально. Проблема в SQL 2000. Я использовал 2000 много лет назад, но больше не имел доступа ни к каким его установкам; остальное это в основном из памяти, и может быть неточным.
Ключевым моментом является то, как извлечь данные из базы данных, отличной от «текущей» базы данных, когда вы не можете знать, какой будет эта другая база данных (или базы данных) во время написания кода. (Да, параметр db_id очень удобен!) Для этой проблемы и для аналогичных проблем общим обходным решением является создание динамического кода, что-то вроде:
SET @Command = 'select name from ' + @dbname + '.dbo.sysobjects where object_id = ' + @ObjectId
EXECUTE (@Command)
Проблема в том, что я уверен, что вы не можете запустить динамический код внутри функций (или, возможно, только внутри функций SQL 2000).
Возможно, вам придется прибегнуть к созданию временной таблицы, заполнить ее динамическим запросом, а затем использовать ее в «основном» запросе, который вы пытаетесь написать. Код Psuedo будет выглядеть так:
CREATE #TempTable
IF SQL2000 or earlier
INSERT #TempTable EXECUTE (select data from TargetDb.dbo.sysobjects)
-- Note that the entire insert may need to be in the dynamic statement
ELSE
INSERT #TempTable SELECT [from query based on object_id]
SELECT [the data you need]
from YourTable
join #TempTable