2012-05-02 11 views
3

次のコードを実行すると、「無効なオブジェクト名」というエラーが発生します。ストアドプロシージャで参照されると、動的に名前付きtempテーブルが「無効なオブジェクト名」を返します

ストアドプロシージャで使用する動的に名前を付けられた一時テーブルを作成する必要があります。

DECLARE @SQL NVARCHAR(MAX) 
DECLARE @SessionID NVARCHAR(50) 
SET @SessionID = 'tmp5l7g9q3l1h1n5s4k9k7e' 
; 
SET   
@SQL = N'  CREATE TABLE #' + @SessionID + ' ' + 
     N'  (' + 
    N'  CustomerNo NVARCHAR(5), ' + 
    N'  Product NVARCHAR(3), ' + 
    N'  Gross DECIMAL(18,8) ' + 
    N'  )' 
; 
EXECUTE sp_executesql @SQL 
; 
SET   
@SQL = N'  SELECT * FROM #' + @SessionID 
; 
EXECUTE sp_executesql @SQL 

ありがとうございます!

+1

あなたがするので、この必要なぜ、#TEMPテーブルはすでに(舞台裏)、自動的に一意のデータベース・セッションの間に名です?? –

+0

ああ、私はそれを知らなかった!だから、#SumTableのようなものを呼び出すだけで、複数の人が同時に同じ一時テーブルを作成しながらプロシージャを実行しても問題は発生しません。 – Tom

+1

#tempを作成し、TempDBの実際の名前を確認します。それが名前に追加されていることがわかります。 – Paparazzi

答えて

1

あなたは間違っています!

試してみてください。

exec(@SQL) 

の代わり:

EXECUTE sp_executesql @SQL 

sp_executesqlに変数を使用するには、@SessionID引用符内でなければならず、入力パラメータを持って提供されなければなりません。完全な例はthisをチェックしてください!


あなたは動的SQLはSQLインジェクションのために良いのポートであることを認識することがきました!

+0

ええ、ありがとうございます。限り、上記の構文まで、私は動的にカラムとテーブルの名前を参照して動的に参照するために使用することができますなぜ、一時テーブルを作成しないでください? – Tom

+0

@af、 'ダイナミックSQLを使わずにその名前のテンポラリテーブルを作成しようとしましたか?それが可能かどうかを確認する。**何? 「可能ならば」**はありません。あなたの名前を管理します。つまり、それがどのように文書化され、それがどのように動作するかです。 –

1

この構文は、名前の

CREATE TABLE #SessionID (CustomerNo NVARCHAR(5), Product NVARCHAR(3), Gross DECIMAL(18,8)); 
Select COUNT(*) from #SessionID; 
Drop Table #SessionID; 
3

WHY MESSに動作しますか? SQL Serverがあなたのためにこれを管理しますしてみましょう:

Temporary Tables in SQL Server

上記のリンクから: 、

同じルーチンを複数のプロセスで同時に実行されている場合はデータベースエンジンのことができるようにする必要があります別の プロセスによって作成された同じ名前のローカル一時テーブル を区別します。これは、アンダースコア文字で左側に埋め込まれた各ローカル テンポラリテーブル名に数値文字列を追加することで行います。 #MyTempTableのような短い名前を指定しても、実際には がTempDBに格納されているのは、CREATE TABLE文で指定されているテーブル名と接尾辞で構成されています。この接尾辞のため、ローカルの テンポラリ・テーブル名は116文字以下でなければなりません。

何が起こっているのかを知りたい場合は、他のテーブルと同じように、 テーブルをTempDBで表示できます。 TempDBから呼び出す場合にのみ、テンポラリテーブルに対してsp_helpを使用することもできます。

USE TempDB 
go 
execute sp_Help #mytemp 

か、 データベースをswithchingなしのTempDBのシステムビューでそれらを見つけることができます。

SELECT name, create_date FROM TempDB.sys.tables WHERE name LIKE '#%' 
関連する問題