2010-02-10 40 views
5

Tôi đang sử dụng SQL Server 2005.INSERT dữ liệu từ một bảng vào nhiều bảng

Tôi đang di chuyển dữ liệu từ cơ sở dữ liệu hiện tại (bảng đơn) sang cơ sở dữ liệu mới (chuẩn hóa - nhiều bảng). Trong cơ sở dữ liệu mới, tôi có một bảng cơ sở (chúng ta hãy gọi nó là "BaseTable") và nhiều bảng khác (hãy gọi chúng là "DependentA""DependentB"). Một số dữ liệu từ cơ sở dữ liệu cũ sẽ đi đến BaseTable, và một số sẽ đi đến hai cơ sở dữ liệu kia. BaseTable có mối quan hệ một-một với cả DependentA và DependentB, sử dụng Id của chúng như khóa ngoài.

Vì vậy, đây là câu hỏi của tôi. Làm cách nào để di chuyển dữ liệu? Đây là một truy vấn tôi đã cố gắng, đó là làm việc ngoại trừ một điều: các phím nước ngoài trong BaseTable cho hai khác là giống hệt nhau, thay vào đó hoặc có một khác nhau một.

Begin SQL: 

BEGIN TRANSACTION 

DECLARE @dep1Id int 

DECLARE @dep2Id int 

INSERT INTO DependentA (column1, column2) 
SELECT c1, c2 
FROM OldDatabase.OldTable 
SELECT @dep1Id = Scope_Identity() 

INSERT INTO DependentB (column3, column4) 
SELECT c3, c4 
FROM OldDatabase.OldTable 
SELECT @dep2Id = Scope_Identity() 

INSERT INTO BaseTable (column5, dependentTable1Id, dependentTablr2Id) 
SELECT c5, @dep1Id, @dep2Id 
FROM OldDatabase.OldTable 

COMMIT 
+0

Do bất kỳ của các cột trong bảng phụ thuộc giữ giá trị duy nhất mà có thể được tra cứu? (ví dụ: c1 & c3) – CAbbott

+0

Có một khóa chính trong các bảng đó (DependentA và DependentB). – jchapa

Trả lời

7

Vấn đề là @ dep1Id và @ dep1Id là vô hướng và đang giữ lại giá trị cuối cùng chỉ từ hai bộ chèn được đặt.

Vì đây là một off có lẽ bạn nên làm điều đó như một con trỏ

DECLARE CURSOR @curs FOR 
SELECT c1,c2,c3,c4,c5 FROM OldDatebase 

open @curs 
fetch next from @curs into 
@c1,@c2,@c3,@c4,@c5 --declare these! 

while @@fetch_status <> 0 
BEGIN 

INSERT INTO DependentA (column1, column2) VALUES @c1, @c2 

SELECT @dep1Id = Scope_Identity() 

INSERT INTO DependentB (column3, column4) VALUES @c3, @c4 

SELECT @dep2Id = Scope_Identity() 

INSERT INTO BaseTable (column5, department1Id, department2Id) @c5, @dep1Id, @dep2Id  

fetch next from @curs into 
@c1,@c2,@c3,@c4,@c5 
END 
close @curs 
deallocate @curs 

cú pháp con trỏ của tôi có lẽ là thủng với lỗi, nhưng bạn sẽ có được ý tưởng.

+0

Nó hoạt động. Cảm ơn một tấn! Điều đó kết thúc một dự án 8 giờ. ;) – jchapa

+0

con trỏ là không khả thi cho tập dữ liệu lớn thậm chí tồi tệ nhất đối với tôi với 261000 hàng – Shahdat

4

Để tránh con trỏ cho tập hợp dữ liệu lớn, tạm thời bao gồm OldTable_id trong bảng mới.

BEGIN TRANSACTION 

INSERT INTO DependentA (OldTable_id, column1, column2) 
SELECT ot.id, ot.c1, ot.c2 
FROM OldDatabase.OldTable ot 

INSERT INTO BaseTable (OldTable_id, column5) 
SELECT ot.id, ot.c5 
FROM OldDatabase.OldTable ot 

UPDATE BaseTable 
    SET BaseTable.dependentTable1_id = DependentA.id 
    FROM BaseTable 
    INNER JOIN DependentA on DependentA.OldTable_id = BaseTable.OldTable_id 

COMMIT 

Làm tương tự cho bảng DependentB và bất kỳ bảng nào khác được chuẩn hóa khỏi OldTable.

Xóa OldTable_id sau khi di chuyển dữ liệu.

1

[nhập mô tả hình ảnh tại đây] [1] ZeorOne là bảng chính mà bạn muốn lấy dữ liệu và chèn nó vào 0 và một bảng tương ứng.

select idzero,namezero,idone,nameone from zeroone 

insert into zero 
select idzero,namezero from zeroone 

insert into one 
select idone,nameone from zeroone 

hoặc bạn muốn sử dụng con trỏ để chèn dữ liệu với các cột được lựa chọn từ Zeroone vào để hai bảng truy vấn là đây

Declare @idzero int 
Declare @namezero varchar(50) 
Declare @idone int 
Declare @nameone varchar(50) 

Declare Cur Cursor for 
select idzero,namezero,idone,nameone from zeroone 

open Cur 

fetch Cur into @idzero,@namezero,@idone,@nameone 

While @@fetch_status = 0 
begin 

    insert into zero 
    select @idzero,@namezero 

    insert into one 
    select @idone,@nameone 

    fetch Cur into @idzero,@namezero,@idone,@nameone 

end 

close Cur 
Deallocate Cur 
+0

Tôi không chắc chắn rằng câu trả lời này, đến một bài viết 7 tuổi cho biết thêm nhiều giá trị cho các chủ đề ... – Wndrr

Các vấn đề liên quan