Как определить имя объекта SQL Server по идентификатору объекта и идентификатору базы данных? - PullRequest
2 голосов
/ 29 мая 2010

Мне нужно поведение SQL Server 2005, где функция OBJECT_NAME принимает два аргумента, obj id и db id, тогда как SQL Server 2000 принимает только obj id, поэтому выполнение должно выполняться в контексте базы данных, к которой проверен объект принадлежит.

Решение должно быть возможным для реализации в функции, поэтому его можно использовать в запросе выбора.

Ответы [ 2 ]

5 голосов
/ 30 мая 2010

В 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
0 голосов
/ 13 июня 2017

В SQL 2008 и выше используйте:

OBJECT_NAME ( object_id [, database_id ] )  

например:

SELECT TOP 10
    object_schema_name(objectid, dbid) as [SchemaName], 
    object_name(objectid, dbid) as [ObjectName],
    e.*
    from sys.dm_exec_cached_plans P
    CROSS APPLY sys.dm_exec_query_plan(P.plan_handle) E
...