2016-06-01 4 views
1

宣言された変数に応じて、動的SQLを使用して複数のサーバーのいずれかからのデータで一時テーブルを埋めようとしています。ソースデータに将来追加される列が増えている可能性があるので、明示的に定義する必要はなく、現在の列が何であるかに基づいて宛先テンポラリテーブルを作成できます。select intoを使用してオンザフライでテーブルを作成する

Select top 1 * into #tempTable from MyTable 
Delete from #tempTable 

または::私が使用して、適切な列を持つ空のテーブルを作成しようとした

Select * into #tempTable from MyTable where 1 = 0 

の両方が空のテーブルを作成するために働いたが、私はそれに挿入しようとすると:

declare @sql varchar(max) = 'Select * from ' 
+ case when @server = '1' then 'Server1.' else 'Server2.' end 
+ 'database.dbo.MyTable' 

Insert into #tempTable 
    exec(@sql) 

私はこのエラーを取得する:

Msg 213, Level 16, State 7, Line 1 Column name or number of supplied values does not match table definition.

exec(@sql)は単独で問題ありません。このエラーは、同じサーバーで同じテーブルを両方の手順で使用しても発生します。これを修正することは可能ですか、またはcreate tableでテーブルを明示的に定義する必要がありますか?

+0

は、あなたが接続しているユーザーがそれにテーブル「MYTABLE」を持っていますサーバー1またはサーバー2に比べて構造的に異なっているスキーマ? – xQbert

+0

いいえ、私は 'select into'と' into into'の両方で同じサーバーとテーブルでこれを試してみました。そして比較する#tempTableとMyTableから選択するだけでした。彼らは同一であるように見えます。 – APH

+1

私はあなたがインサートとエグゼクティブを組み合わせることはできないとは思わなかった。それはすべて動的SQLでなければならず、まったく同じでなければなりません。 'exec( '#tempTable' + @sqlに挿入する)' – xQbert

答えて

1

グローバルテンポラリテーブルの使用はどうですか?複数のユーザーやデータベースからアクセスできるため、グローバルな一時表を使用することにはいくつかの欠点があります。 REF http://sqlmag.com/t-sql/temporary-tables-local-vs-global

DECLARE @sql nvarchar(max) = 'SELECT * INTO ##tempTable FROM ' 
+ case when @server = '1' THEN 'Server1.' ELSE 'Server2.' END 
+ 'database.dbo.MyTable' 

EXECUTE sp_executesql (@sql) 

SELECT * FROM ##tempTable 
+0

ありがとう!私はグローバルな一時テーブルが動的SQLでこのように働いたことを認識しませんでした。 – APH

1

(人コメント投稿@XQbertおかげ)

が意図したとおりに機能するだけint原因

Insert into #tempTable 
    exec(@sql) 

たカラムを一時テーブルにIDカラム(Int, Identity)を置き換えます。

その構文と

declare @sql varchar(max) = 'Insert into #tempTable Select * from ' 
+ case when @server = '1' then 'Server1.' else 'Server2.' end 
+ 'database.dbo.MyTable' 

exec(@sql) 

の両方が働いたが、動的SQLのinsert一部を作ることは、トラブルシューティングのためのはるかに有用なエラーメッセージを生成します。

関連する問題