0

私はデータ移行ツールに取り組んでいます。ユーザーが UI でエンティティにフィールドを追加すると、データベース スキーマ自体が更新されます。これは、データを移動しようとすると大混乱を引き起こします。

現在、すべてのソース データを含む一時テーブルがありますが、その一時テーブルには、宛先テーブルにはない余分な列が含まれている可能性があります。テーブル スキーマを別のテーブル (この場合は一時テーブル) のスキーマで更新する方法はありますか? テーブルには制約とインデックスがあるため、新しいテーブルを選択して古いテーブルに名前を変更することはできません。

私は .NET 4.0 で作業しています (SMO はありません) が、SQL ソリューションは問題ありません。

4

1 に答える 1

0

これには、ストアド プロシージャ内で動的 SQL を使用することをお勧めします。

やりたいことは、一時テーブルのスキーマを理解することです。#nameoftemptable という名前の一時テーブルを作成すると仮定すると、これは開始に役立つはずです。

SELECT t.name, c.name as colname, types.name, types.max_length
FROM tempdb.sys.tables t 
   JOIN tempdb.sys.columns c on t.object_id = c.object_id
   JOIN sys.types on c.system_type_id = types.system_type_id
WHERE t.name like '#nameoftemptable%'

「tempdb」の使用に注意してください。これは、一時テーブルが保存される場所です。これにより、一時テーブルのすべての列とそのデータ型が返されます。

次に、同様のクエリで同じデータを返す必要がありますが、tempdb をクエリする代わりに、データベース名とテーブル名をクエリする必要があります。

SELECT t.name, c.name as colname, types.name, types.max_length
FROM dbname.sys.tables t 
   join dbname.sys.columns c on t.object_id = c.object_id
   join dbname.sys.types on c.system_type_id = types.system_type_id
where t.name = 'TableName'

ALTER TABLEこれで、どの列が新しいかを比較し、それに応じてコマンドを使用できるようになります。

これがお役に立てば幸いです。

于 2013-01-29T03:09:57.303 に答える