2010-10-06 25 views
9

Tôi đang sử dụng MERGE trong truy vấn của mình và tôi đang tạo INSERT trên mệnh đề KHÔNG CHƯA RA, nhưng sau đó tôi muốn lấy danh tính hàng được chèn và tạo một INSERT khác cho một số bàn khác. Truy vấn ngay bây giờ là:Máy chủ sql hợp nhất với nhiều lần chèn khi không khớp với

ALTER PROCEDURE [dbo].[BulkMergeOffers] 
@data ImportDataType READONLY 
AS 
SET NOCOUNT ON; 
DECLARE @cid int = 0 
MERGE dbo.oferta AS target 
USING @data AS source 
ON (target.nr_oferty = source.nr_oferty) 
WHEN NOT MATCHED THEN 
INSERT (nr_oferty,rynek,typ_transakcji, typ_nieruchomosci,cena,powierzchnia, rok_budowy, wojewodztwo, miasto, dzielnica, ulica, opis, wspolrzedne, film, zrodlo, KontaktStore, data, forma_wlasnosci, stan_techniczny, liczba_pokoi, liczba_peter, pietro, material, kuchnia, pow_dzialki, typ_dzialki, woda,gaz, prad,sila, przeznaczenie,lokal_dane) 
     VALUES (source.nr_oferty,source.rynek,source.typ_transakcji, source.typ_nieruchomosci,source.cena,source.powierzchnia, source.rok_budowy, source.wojewodztwo, miasto, source.dzielnica, source.ulica, source.opis, source.wspolrzedne, source.film, source.zrodlo, source.KontaktStore, source.data, source.forma_wlasnosci, source.stan_techniczny, source.liczba_pokoi,  source.liczba_peter, source.pietro, source.material, source.kuchnia, source.pow_dzialki, source.typ_dzialki, source.woda,source.gaz, source.prad,source.sila, source.przeznaczenie,source.lokal_dane); 

Vì vậy, bạn cần phải lấy một số giá trị vào bảng mục tiêu dựa trên dữ liệu nguồn, tôi cần lấy thông tin chèn và chèn vào bảng khác mà còn dựa trên một số nguồn dữ liệu, vì vậy một cái gì đó như thế, ngay sau khi chèn đầu tiên:

SET @cid = SCOPE_IDENTITY(); 
if source.photo is not null 
begin 
insert into dbo.photos(offerID, file) values (@cid, source.photo); 
end 

Nhưng tôi không thể lắp ráp nó, một không có quyền truy cập vào các nguồn không còn nữa, cũng tuyên bố nếu chương trình báo lỗi:

"số nhận dạng nhiều phần source.photo không thể bị ràng buộc "

nhưng nó ở đó. Chỉ cần cho rõ ràng ImportDataType là một tham số có giá trị bảng.

Hãy GIÚP

Trả lời

13

Nếu bạn không cần WHEN MATCHED một phần của báo cáo kết quả MERGE trong truy vấn của bạn, không có lý do thực sự để sử dụng MERGE. Bạn có thể sử dụng INSERT với tuyên bố tham gia bên ngoài hoặc NOT EXISTS.

Trong cả hai trường hợp, bạn có thể sử dụng mệnh đề OUTPUT để truy xuất giá trị nhận dạng được chèn vào để chuyển giá trị đó vào truy vấn thứ hai.

tôi đã mở rộng ví dụ của bạn:

<stored procedure header - unchanged> 

--declare a table variable to hold the inserted values data 
DECLARE @newData TABLE 
(nr_oferty int 
,newid int 
) -- I'm guessing the datatype for both columns 

MERGE dbo.oferta AS target 
USING @data AS source 
ON (target.nr_oferty = source.nr_oferty) 
WHEN NOT MATCHED THEN 
INSERT (nr_oferty,rynek,typ_transakcji, typ_nieruchomosci,cena,powierzchnia, rok_budowy, wojewodztwo, miasto, dzielnica, ulica, opis, wspolrzedne, film, zrodlo, KontaktStore, data, forma_wlasnosci, stan_techniczny, liczba_pokoi, liczba_peter, pietro, material, kuchnia, pow_dzialki, typ_dzialki, woda,gaz, prad,sila, przeznaczenie,lokal_dane) 
     VALUES (source.nr_oferty,source.rynek,source.typ_transakcji, source.typ_nieruchomosci,source.cena,source.powierzchnia, source.rok_budowy, source.wojewodztwo, miasto, source.dzielnica, source.ulica, source.opis, source.wspolrzedne, source.film, source.zrodlo, source.KontaktStore, source.data, source.forma_wlasnosci, source.stan_techniczny, source.liczba_pokoi,  source.liczba_peter, source.pietro, source.material, source.kuchnia, source.pow_dzialki, source.typ_dzialki, source.woda,source.gaz, source.prad,source.sila, source.przeznaczenie,source.lokal_dane) 
OUTPUT inserted.nr_oferty, inserted.<tableId> INTO @newData; 
-- replace <tableId> with the name of the identity column in dbo.oftera 

insert into dbo.photos(offerID, file) 
SELECT nd.newid, pt.photo 
FROM @data AS pt 
JOIN @newData AS nd 
ON  nd.nr_oferty = pt.nr_oferty 
WHERE pt.photo IS NOT NULL 
+0

Tôi đang sử dụng KHI cũng phù hợp cho việc cập nhật, chỉ cần lột nó để làm rõ mẫu, xấu của tôi. Nhưng mẫu của bạn là thú vị tôi sẽ cố gắng phân tích nó và điều chỉnh theo nhu cầu của tôi, đó là một tham khảo tốt. – Programista

+0

Tôi là một lời khuyên tốt thực sự, thx, tôi đã quản lý để làm cho nó hoạt động. – Programista

+1

Lưu ý rằng 'MERGE' vẫn hữu ích nếu bạn cần xuất dữ liệu từ bản ghi nguồn. Câu lệnh 'MERGE'' OUTPUT' có thể trả về cả dữ liệu được chèn lẫn dữ liệu nguồn, trong khi câu lệnh 'INSERT' chỉ có thể trả về các giá trị từ hàng được chèn vào. –

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