2010-07-02 33 views
5

Tôi đang chèn bản ghi từ một máy chủ sql db vào một máy chủ khác. Tôi cần lấy id mới được chèn vào và cập nhật một trường trên bảng nguồn. Tôi có thể nhận được ID mới với tùy chọn INSERTED không có vấn đề gì. Tuy nhiên, tôi dường như không thể nhận được ID từ bảng nguồn. Bảng đích không có trường cho ID của nguồn. Bảng nguồn là một bảng chuyển đổi và tôi không muốn gây ô nhiễm bảng đích với các trường chuyển đổi. Điều này có thể là không thể nhưng tôi nghĩ tôi sẽ kiểm tra với các bạn lần đầu tiên.Chèn SQL Server bằng cách sử dụng INSERTED để lấy ID mới và ID hiện tại

drop table #Table1 
CREATE TABLE #Table1 
(
    Table1ID INT, 
    Table2ID INT, 
    NAME VARCHAR(32) 
) 

INSERT INTO #Table1 
VALUES 
     (1, NULL, 'Fred') 
    ,(2, NULL, 'Tom') 
    ,(3, NULL, 'Sally')  

--ok, im inserting into #Table2 
drop table #Table2 
CREATE TABLE #Table2 
(
    [Table2ID] [int] IDENTITY(1,1) NOT NULL, 
    NAME VARCHAR(32) 
) 

--THE RUB, I want to insert Table2ID into table3 
--along with Table1ID. I cannot seem to reference table1 
--Any Ideas? 
insert into #Table2(NAME) 
OUTPUT INSERTED.Table2ID, T.Table1ID into #Table3 
select Name from #Table1 T 

Trả lời

5

Bạn không thể làm điều đó với INSERT (sin nó thiếu một mệnh đề FROM của riêng nó) nhưng bạn có thể làm điều đó với MERGE:

MERGE INTO #Table2 as t2 
USING #Table1 as t1 ON 0=1 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (NAME) VALUES (t1.NAME) 
OUTPUT INSERTED.Table2ID, t1.Table1ID ; 
+0

Nó hoạt động như một nhà vô địch ... Cảm ơn Remus! – Steve

1

Đặt trường id chuyển đổi trong bảng. Điều này không gây ô nhiễm bảng, nó đang xử lý vấn đề đúng cách. Thêm vào đó bạn có thể lấy lại nó trong mệnh đề đầu ra. Và nó sẽ làm cho nó đơn giản hơn để cập nhật bảng con là tốt. Tôi thấy không có lý do gì để không làm điều này trừ khi bạn có các nhà phát triển kém sử dụng Select * trong mã sản xuất.

+0

Chúng tôi đang tạo ra một mô hình từ db và tôi đã cố gắng để tránh việc thực hiện thêm bước để không hiển thị id chuyển đổi trên mô hình. Tôi nghĩ đề xuất của bạn có lẽ là cách thích hợp nhất để xử lý chuyển đổi. – Steve

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