8

現在のメソッドの疑似コードの例を示します。一度に 1 行ずつ動作しないメソッドを誰かが知っている場合は、非常に感謝しています。MS SQL Server 2008 を使用しています。

define cursor for the data to be inserted (about 3 million records)
loop
(
    insert record into table 1
    use scope_identity() to get key
    insert record into table 2 that references table 1
)

カーソルとループが遅いため、両方のテーブルに同時に何らかの挿入を行いたいと思います。

1 対 1 の関係を持つ 2 つの別々のテーブルに何かを挿入する理由について誰かが怒る前に、最初のテーブルは変更できず、後でデータ変換操作を参照するために 2 番目の (一時) テーブルの情報が必要だからです。 .

いいえ、変更できないため、変更できないテーブルに参照データを保持する一時的な列を追加できません。これは稼働中のシステムであり、テーブルを変更する権限がありません。


追加情報:

Source:

1 a big  monkey
2 a tall elephant
3 a big  giraffe
4 a tiny cow
5 a tall cow

Dest:

Table 1       Table 2
monkey        1 big
elephant      2 tall
giraffe       3 big
cow           4 tiny
cow           5 tall
4

4 に答える 4

2

と のマージTable1への出力を使用できますTable2

merge Table1
using SourceTable
on 0 = 1
when not matched then
  insert (Animal) values (SourceTable.Animal)
output inserted.ID, SourceTable.Size into Table2(ID, Size);

SQL フィドル

注:Table2に対して外部キーが定義されている 場合Table1、 に直接出力することはできませんTable2。その場合、一時テーブルを出力のターゲットとして使用し、一時テーブルから挿入できTable2ます。

于 2012-10-01T05:35:26.177 に答える
0

それだけの量のデータがある場合、最適なオプションは、システム上の更新を分離し、identity insert挿入する前にキーを許可して事前設定することです。


または、最初の挿入を行ってから、(一時テーブルからの) 2 番目の挿入を変更して元のデータに結合し、キーを見つけることができます。

于 2010-07-15T14:29:30.437 に答える
0
insert into table1
select substring(src.data, 8 /* assuming fixed length as exampled */, len(src.data))
from source src

insert into table2
select t1.id, substring(src.data, 3 /* skip 'a ' */, 7)
from
    table1 t1
        inner join source src
        on substring(src.data, 8, len(src.data)) = t1.data

与えられた例では、私はもっとうまくやることはできません...

于 2012-09-30T05:44:47.137 に答える
0

IDENTITY_INSERT、VIEW および INSTEAD OF トリガー、事前入力された ID 値を挿入で使用します。

この SQL Fiddle を参照してください

INSTEAD OFトリガーでT1のidentity列をT2に使えるように色々と弄ってみましたが、結局ダメでした。

于 2012-09-18T02:57:53.910 に答える