4

あるデータベース テーブルから別のデータベース テーブルに大量のデータをコピーする必要があります。列の 1 つが ID 列であるため、SELECT ... INTO を使用できません。また、スキーマにいくつかの変更を加える必要があります。データのエクスポート ウィザードを使用して SSIS パッケージを作成し、それを Visual Studio 2005 で編集して必要な変更を加えました。INSERT INTO よりも確かに高速ですが、データを別のコンピューターにダウンロードして再度アップロードするのはばかげているように思えます。(それがSSISパッケージが行っていることであると私が正しいと仮定します)。サーバー上で直接実行され、ID 値を保持し、テーブルからデータを取得する BULK INSERT に相当するものはありますか? (私が知る限り、BULK INSERT はファイルからデータを取得することしかできません)

編集:IDENTITY_INSERTについては知っていますが、かなりの量のデータが含まれているため、INSERT INTO ... SELECTは少し遅いです。SSIS/BULK INSERT は、インデックスやログなどに関係なく、データをテーブルにダンプするため、高速です。(もちろん、データが入力されたテーブルにクラスター化インデックスを作成するのは高速ではありませんが、最初の試行で試した INSERT INTO...SELECT よりも高速です)

編集 2: スキーマの変更には次のものが含まれます (ただし、これらに限定されません)。 1. 1 つのテーブルを 2 つの新しいテーブルに分割します。将来的には、それぞれが独自の IDENTITY 列を持つようになりますが、移行のためには、元のテーブルの ID を両方の新しいテーブルの ID として使用するのが最も簡単だと思います。移行が完了すると、テーブルの 1 つが他のテーブルと 1 対多の関係になります。2. あるテーブルから別のテーブルへの列の移動。3. 1 対 1 のみを相互参照した相互参照テーブルを削除します。代わりに、参照は 2 つのテーブルのいずれかの外部キーになります。4. いくつかの新しい列がデフォルト値で作成されます。5. 一部のテーブルはまったく変更されていませんが、「すべてを新しい DB に入れる」という要求のためにコピーする必要があります。

4

4 に答える 4

3

IdentityInsertに興味があると思います

于 2009-07-29T00:09:20.953 に答える
2

SELECT...INTOはIDENTITY列で機能するはずだと思います。主キーを再定義する必要がある場合があります。

SELECT * INTO NewTable FROM OldTable
GO
ALTER TABLE NewTable ADD PRIMARY KEY(ColumnName)

それが機能しない場合は、古いテーブルのCREATE TABLEスクリプトを生成し、名前を変更して新しいテーブルを作成してから、IDENTITY_INSERTを使用して、INSERT INTO NewTableSELECTFROMを使用して最初のテーブルから主キーデータをコピーできるようにします。 OLDTABLE。次に、SQLでサーバー上で他の操作を行うことができます。

このスクリプトをローカルまたはテストサーバーでテストでき、必要に応じてスクリプトを再実行するだけでスクリプトを繰り返すことができるという優れた利点があります。

スキーマの変更が複雑すぎて、スクリプトで変更できませんか?

于 2009-07-29T00:07:50.440 に答える
1

こちらをご確認の上、

Select * Into NewTable
From OldTable
Where 1=2

Alter Table NewTable
Add id_col int indentity(1,1)

insert into NewTable(col1,col2,..... ) 
/* do not use id_col */
select col1,col2,..... from OldTable
于 2010-04-05T06:26:04.480 に答える
0

非常に多くの人がこの質問を見ていたので、フォローアップする必要があると思いました.

私はSSISパッケージに固執することになりました。データベースサーバー自体で実行しました。それでも、SQL プロセスから SSIS プロセスにデータをプルしてから送り返すという困難を経験しました。しかし、全体として、調査した他のオプションよりも高速に実行されました。

また、バグに遭遇しました: ビューからデータを取得すると、パッケージがハングするだけでした。SSISの「ソース」オブジェクトの「SQLクエリ」フィールドに、ビューからクエリを直接カットアンドペーストすることになりました。これは、パッケージがサーバーと同じマシンで実行されている場合にのみ発生するようでした。別のマシンから実行している場合、このエラーは発生しませんでした。

もう一度やり直さなければならないとしたら、おそらく新しい ID 値を生成するでしょう。古いものを新しいテーブルの列に移行し、それらの値を使用して他のテーブルの外部キーを関連付け、移行が完了して安定したら列を削除します。一方、SSIS パッケージ メソッドは全体的にうまく機能したため、複雑な移行 (テーブルの分割など) を行う必要がある場合や、ID 値をそのまま維持する必要がある場合は、この方法をお勧めします。

回答してくれたすべての人に感謝します。

于 2010-04-21T17:25:21.903 に答える