宣言された変数に応じて、動的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
でテーブルを明示的に定義する必要がありますか?
は、あなたが接続しているユーザーがそれにテーブル「MYTABLE」を持っていますサーバー1またはサーバー2に比べて構造的に異なっているスキーマ? – xQbert
いいえ、私は 'select into'と' into into'の両方で同じサーバーとテーブルでこれを試してみました。そして比較する#tempTableとMyTableから選択するだけでした。彼らは同一であるように見えます。 – APH
私はあなたがインサートとエグゼクティブを組み合わせることはできないとは思わなかった。それはすべて動的SQLでなければならず、まったく同じでなければなりません。 'exec( '#tempTable' + @sqlに挿入する)' – xQbert