2

これに対する答えを探してみましたが、役に立ちませんでした。これがセットアップされた方法の背後にある適切なロジックはありません。男は自分が何をしているのか知りませんが、それは私が取り組まなければならないことです (長い話)。

私はSQL Server 2008R2を使用しています。1つのテーブルからレコードを取得し、データを1対1の関係を持つ4つの別々のテーブルに転送する必要があります(私は知っています-スマートではありません)。データが挿入される最初のテーブルの Identity フィールドから値を取得し、他の 3 つのテーブルに同じ ID を入力し、それに応じてデータを分散させる必要があります。例えば:

OldTable: フィールド 1、フィールド 2、フィールド 3、フィールド 4

NewTable1: ID フィールド、フィールド 1 NewTable2: ID、フィールド 2 NewTable3: ID、フィールド 3 NewTable4: ID、フィールド 4

これをストアドプロシージャで処理したいと思います。ループを実行したいのですが、SQL でのループはお勧めできないと読みました。

Loop moving through each record in OldTable... (??)

INSERT INTO NewTable1
  (Field1)
Select Field1 from OldTable

   INSERT INTO NewTable2
     (ID, Field2)
   Select SCOPE_IDENTITY?, Field2 From OldTable Where OldTable.ID = ??

   etc for other 2 tables

Loop to next record in OldTable

SCOPE_IDENTITY の使用方法はわかりませんが、これを達成する方法に関係があると感じています。

また、NewTable1 で新しいレコードが作成されるたびにトリガーをセットアップする必要があるでしょう。わかってるよ、狂気だけど、どうしようもないよ。

だから、私は知っておく必要があります 1: 最初にテーブルにデータを入力する最良の方法 2: 新しいレコードのトリガーを作成する方法

1 の解には 2 が含まれる場合があります。

助けてください!

4

2 に答える 2

2

merge ステートメントの output 句を使用して、 の既存の主キーOldTableと で新しく生成された ID のID間のマッピングを取得できNewTable1ます。

-- Temp table to hold the mapping between OldID and ID
create table #ID
(
  OldID int primary key,
  ID int
);

-- Add rows to NewTable1 and capture the ID's in #ID
merge NewTable1 as T
using OldTable as S
on 1 = 0
when not matched by target then
  insert(Field1) values(S.Field1)
output S.ID, inserted.ID into #ID(OldID, ID);

-- Add rows to NewTable2 using #ID to get the correct value for each row
insert into NewTable2(ID, Field2)
select I.ID, O.Field2
from #ID as I
  inner join OldTable as O
    on I.OldID = O.ID

insert into NewTable3(ID, Field3)
select I.ID, O.Field3
from #ID as I
  inner join OldTable as O
    on I.OldID = O.ID

insert into NewTable4(ID, Field4)
select I.ID, O.Field4
from #ID as I
  inner join OldTable as O
    on I.OldID = O.ID

drop table #ID;

SQL フィドル

merge..output を使用して source.id と target.id 間のマッピングを取得するも参照してください。

于 2013-09-05T16:13:31.960 に答える
0

insert 文の OUTPUT 句を使用してみてはどうでしょうか。Field1 が OldTable の一意のキーであると仮定すると...

Declare @IDinserted table(ID int, Field1 varchar(255));

Insert Into NewTable1(Field1)
Output inserted.ID, inserted.Field1 into @IDinserted
Select OldID, Field1 from OldTable;

Insert Into NewTable2(RowID, Field2)
Select i.ID, o.@Field2 
from @IDinserted i Inner Join OldTable o
  on i.Field1=o.Field1;
于 2013-09-05T16:07:59.377 に答える