2017-02-09 53 views
0

の外にそれを参照する以下のコードを参照してください。私は、すなわち一つの行は、動的SQLによって返される期待どおり動的SQLで動的テーブルを作成し、動的SQL

select top 1 * into #dbusers from dbusers 

declare @tsql as varchar(1000) 
set @tsql = 'select * from #dbusers' 
exec (@tsql) 

この作品。これを実行することが可能です:

ここ
declare @tsql as varchar(1000) 
set @tsql = 'select top 1 * into #dbusers from dbusers' 
exec (@tsql) 

select * from #dbusers 

私はエラーを取得する:

Invalid object name '#dbusers'

は、回避策はありますか?

私は、動的SQLで出力パラメータを使用できることを認識しています。ただし、ストアドプロシージャを使用するときは、出力パラメータとしてテーブルを返すことはできません。

これは可能ですか?回避策はありますか(物理テーブルの作成を除く)?

+0

##を使用してgloval tempテーブルを作成し、他のセッションとの衝突を避けるために2つの方法を使用できます。テーブルに一意の名前(たとえばguid)を付けるか、spid/user nameをPK列として追加します。 – ajeh

+0

テーブル値関数はオプションですか? – Serg

+1

実際の問題を最初に解決するかもしれません。なぜ、最初に動的SQLで#tempテーブルを作成する必要がありますか? –

答えて

2

一時テーブルは、それらを作成したセッション内でのみ使用できます。動的SQLでは、動的SQLの実行後は使用できません。 、グローバル一時表を作成します

  1. それが明示的に二重のハッシュ使用して、別の方法を落としたかのTempDBの外にクリアされるまで、あなたのセッション外で存続することを::ここにあなたのオプションは、にあるこのテーブルが解消されないのでcreate table ##GlobalTemp
    をセッションの外に2つ作成したり、2つの異なるプロセスがデータを処理しようとしていないことを確認する必要があります。対処したいグローバル・テンポラリ・テーブルを一意に識別する方法が必要です。
  2. 通常の表を作成し、後でそれを再度ドロップすることができます。
  3. しかし、あなたは、単に選択されたデータから、あなたのテーブル構造を生成しますselect intoを実行するオフ最高です、あなたの特定のインスタンスのための動的SQLスクリプト内

を一時テーブルを参照する必要のあるものは何でもロジックを含めます。

+0

グローバルtempテーブルを参照してくれてありがとう。 +1。 – w0051977