如何根据OBJECT_ID获取数据库对象?

时间:2011-10-20 03:19:33

标签: sql-server tsql

在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翻译成实际表格(在上面的代码中以&lt;&gt;显示)。这可能吗?

[编辑] 这是使用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 个答案:

答案 0 :(得分:2)

object_id仅用作各种元数据视图中的键。根据{{​​1}}对象(或以其他方式操纵)对象TSQL没有SELECT语法。

如果您有一个object_id,那么通常可以使用

object_id

要获取对象的2部分名称,但对于SELECT QUOTENAME(OBJECT_SCHEMA_NAME(@object_id[,database_id])) + '.' + QUOTENAME(OBJECT_NAME(@object_id[,database_id]) ) 表,这将返回长内部名称,而不是您可以在查询中实际使用的短名称。