Как получить объект базы данных на основе OBJECT_ID? - PullRequest
1 голос
/ 20 октября 2011

В SQL Server 2008 есть ли способ доступа к объекту на основе OBJECT_ID?

[Редактировать] Пример, описанный ниже, был решен с использованием предложения Эндрю в комментарии, но мне все еще интересно узнать об общем случае. Может ли сам объект быть получен с помощью OBJECT_ID, или к нему можно получить косвенный доступ только с помощью имени объекта через sp_executesql?

Мой конкретный случай - это хранимая процедура, которая использует несколько временных таблиц. В конце процедуры я хочу выгрузить данные из временных таблиц в реальные таблицы для анализа (только если включен переключатель отладки).

Код для сброса данных похож на этот:

IF OBJECT_ID('tempdb..#MyTempTable', 'U') IS NOT NULL
BEGIN
    IF OBJECT_ID('Debug_MyTempTable', 'U') IS NOT NULL
        DROP TABLE Debug_MyTempTable
    SELECT * INTO Debug_MyTempTable FROM #MyTempTable
END

Этот блок кода повторяется для каждой временной таблицы, поэтому я бы предпочел поместить его в процедуру и вызвать ее с именем таблицы:

EXEC [dbo].[CreateDebugTable]
    @tableName = 'MyTempTable'

Я полагаю, что процедура будет выглядеть примерно так:

CREATE PROCEDURE [dbo].[CreateDebugTable]
    @tableName VARCHAR(50)
AS
BEGIN
    IF OBJECT_ID('tempdb..#' + @tableName, 'U') IS NOT NULL
    BEGIN
      IF OBJECT_ID('dbo.Debug_' + @tableName, 'U') IS NOT NULL
          DROP TABLE <Debug_TempTable>
      SELECT * INTO <Debug_TempTable> FROM <#TempTable>
    END
END

Процедура зависит от возможности перевести OBJECT_ID из DebugTempTable и #TempTable в фактические таблицы (показанные с помощью <> в приведенном выше коде). Это возможно?

[Изменить] Это измененная процедура, использующая sp_executesql вместо явных таблиц.

CREATE PROCEDURE [dbo].[CreateDebugTable]
    @tableName VARCHAR(50)
AS
BEGIN
    DECLARE @tmpTable VARCHAR(50) = '#' + @tableName
    DECLARE @dboTable VARCHAR(50) = 'Debug_' + @tableName
    DECLARE @sql NVARCHAR(100)

    IF OBJECT_ID('tempdb..' + @tmpTable, 'U') IS NOT NULL
    BEGIN
        IF OBJECT_ID('dbo.' + @dboTable, 'U') IS NOT NULL
        BEGIN
            SET @sql = 'DROP TABLE ' + @dboTable
            EXECUTE sp_executesql @sql
        END

        SET @sql = 'SELECT * INTO ' + @dboTable + ' FROM ' + @tmpTable
        EXECUTE sp_executesql @sql
    END
END

1 Ответ

2 голосов
/ 20 октября 2011

object_id просто используется в качестве ключа в различных представлениях метаданных.Не существует синтаксиса TSQL для SELECT от (или иным образом манипулирования) объектов на основе их object_id.

Если у вас есть object_id, то в целом вы можете использовать

SELECT QUOTENAME(OBJECT_SCHEMA_NAME(@object_id[,database_id])) + 
       '.' + 
       QUOTENAME(OBJECT_NAME(@object_id[,database_id]) )

Чтобы получить имя объекта из 2 частей, но для таблиц #temp, возвращается длинное внутреннее имя, а не короткое, которое вы можете использовать в запросах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...