2011-10-20 14 views
1

SQL Server 2008では、OBJECT_IDに基づいてオブジェクトにアクセスする方法はありますか?OBJECT_IDに基づいてデータベースオブジェクトを取得する方法は?

[編集]下記の例は、Andrewの提案をコメントに使って解決しましたが、私はまだ一般的なケースについては興味があります。 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 

DebugTempTable#TempTableOBJECT_IDを実際のテーブルに変換できるかどうかによって異なります(上記のコードでは<>)。これは可能ですか?

[編集] 明示的な表の代わりに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 
+2

代わりに文をsp_executesqlして、それを元に戻す心配はありませんか?あなたは文字列として名前を持つように見えるので、stmtを生成して実行するか、問題の一部が欠落していますか? – Andrew

+0

@Andrew、はい、あなたは正しいことができます。私は明らかに逃した:)ありがとう – WileCau

+0

Np、質問probsは、私はあなたがそれを削除することをお勧めしますので、維持する価値が限られています。 – Andrew

答えて

2

object_idは、さまざまなメタデータビューのキーとして使用されています。 object_idに基づいてオブジェクトを取得(または別の方法で操作)した場合、SELECTにはTSQLの構文はありません。あなたはobject_idを持っている場合は

は、一般的には、オブジェクトの2パーツ名を取得するには

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

を使用することができますが、#tempテーブルに対して、これは、長い内部名ではなく、あなたが実際にできる短いものを返します。クエリで使用します。

関連する問題