В 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