Tôi có một thủ tục được lưu trữ cần chèn vào ba bảng khác nhau, nhưng tôi cần lấy ID được tạo từ đầu vào và sử dụng để chèn vào bảng tiếp theo. Tôi quen thuộc với cấu trúc INSERT-OUTPUT
, nhưng tôi không chắc chắn về cách sử dụng nó trong trường hợp cụ thể này.INSERT-OUTPUT bao gồm cột từ bảng khác
DECLARE @guids TABLE ([GUID] UNIQUEIDENTIFIER);
DECLARE @contacts TABLE ([ContactID] INT, [GUID] UNIQUEIDENTIFIER);
DECLARE @mappings TABLE ([TargetID] INT, [GUID] UNIQUEIDENTIFIER);
INSERT @guids ([GUID]) ...
INSERT [Contacts] ([FirstName], [LastName], [ModifiedDate])
OUTPUT [inserted].[ContactID], g.[GUID]
INTO @contacts
SELECT [First_Name], [Last_Name], GETDATE()
FROM [SourceTable] s
JOIN @guids g ON s.[GUID] = g.[GUID]
INSERT [TargetTable] ([ContactID], [License], [CreatedDate], [ModifiedDate])
OUTPUT [inserted].[TargetID], c.[GUID]
INTO @mappings
SELECT c.[ContactID], [License], [CreatedDate], [CreatedDate]
FROM [SourceTable] s
JOIN @contacts c ON s.[GUID] = c.[GUID]
INSERT [Mappings] ([TargetID], [SourceGUID])
SELECT [TargetID], [GUID]
FROM @mappings
Nhưng tôi nhận được các lỗi sau đây:
Từ định đa phần "g.GUID" có thể không bị ràng buộc.
Mã định danh nhiều phần "c.GUID" không thể bị ràng buộc.
Tôi sẽ gặp lỗi tương tự nếu tôi sử dụng s.GUID
thay thế. Có thể thực hiện một loại tham gia trong mệnh đề OUTPUT
không?
Bạn đang gặp lỗi bởi vì bạn không thể sử dụng bất cứ điều gì khác hơn là chèn hoặc DELETED tài liệu tham khảo về chèn (có nghĩa là bạn chỉ có thể sử dụng INSERTED, tất nhiên). Với các bản cập nhật và xóa, bạn có thể tham khảo các bảng khác được sử dụng trong truy vấn của bạn. Tùy chọn hợp nhất bên dưới sẽ hoạt động miễn là bạn đang sử dụng SQL Server 2008 trở lên. Cách duy nhất tôi đã tìm thấy để làm điều đó bằng cách khác là tìm một cột không sử dụng trên bảng tôi chèn vào và đặt giá trị (trong trường hợp của bạn, guid) vào cột đó, sau đó quay trở lại và kéo ra khỏi cột sau (và cập nhật nó trở lại null để nó không ở lại đó). –
thử tính năng chèn này.GUID – user123456