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
と#TempTable
のOBJECT_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
代わりに文をsp_executesqlして、それを元に戻す心配はありませんか?あなたは文字列として名前を持つように見えるので、stmtを生成して実行するか、問題の一部が欠落していますか? – Andrew
@Andrew、はい、あなたは正しいことができます。私は明らかに逃した:)ありがとう – WileCau
Np、質問probsは、私はあなたがそれを削除することをお勧めしますので、維持する価値が限られています。 – Andrew