0

エラーを表示する単一引用符内で一時テーブルを作成しようとしましたが、テーブルを識別できません#newtable...サポートするのは##table(グローバル一時テーブル)だけですが、グローバル一時テーブルは必要ありません。誰かが説明する理由が欲しいだけですお願いします。

 select 
     column1, column2, column3, ##newtable.columnid as ShipProfile,
     row_number() over (order by Id) as ''RowNumber'' 
 into 
     ##TempProduct 
 from 
     Product 
 left join 
     ##newtable on Product.columnId = ##newtable.ColumnId 
 where 
     MerchantId= ' + convert(varchar(20), @MerchantID) 
4

2 に答える 2

1

有名なThe Curse and Blessings of Dynamic SQLから引用するには:

次に観察することは、動的 SQL がストアド プロシージャの一部ではなく、独自のスコープを構成していることです。動的 SQL のブロックを呼び出すことは、アドホックに作成された名前のないストアド プロシージャを呼び出すことに似ています。これには多くの影響があります。

...

  • 動的 SQL で作成された一時テーブルは、動的 SQL が終了すると削除されるため、呼び出し元のプロシージャからはアクセスできません。(プロシージャを終了すると、ストアド プロシージャで作成された一時テーブルが消えるのと比較してください。)ただし、動的 ​​SQL のブロックは、呼び出し元のプロシージャによって作成された一時テーブルにアクセスできます。

create table #outertemp (col1 INT Primary KEY ...)したがって、文字列を実行するストアド プロシージャで一時テーブル ( ) を定義するか(文字列自体ではありません!)、動的 SQL 内でグローバル一時テーブルを使用することができます。

于 2013-01-08T09:01:27.367 に答える
-1

(文字列自体ではなく) 文字列を実行するストアド プロシージャで一時テーブルを定義するかcreate table #outertemp (col1 INT Primary KEY ...))、動的 SQL 内でグローバル一時テーブルを使用することができます。

于 2013-06-09T14:22:33.777 に答える