Как вставить столбец из другой таблицы при вставке его из userdefined datatable?

#sql-server

#sql-сервер

Вопрос:

     CREATE PROC [dbo].[usp_InsertBulkShipmentData]
   (
     @RetVal                VARCHAR(1000) OUTPUT,
     @ship dbo.ShipmentData READONLY
   )

  AS

 DECLARE @ShipmentID            BIGINT
 Declare @Output table (id int)
 BEGIN

INSERT INTO 
dbo.Shipment (ShipmentType,scaccode,ShipmentControl,countryLoading,PortLoading,ShipperName,ShipperAddressOne,ShipperCity,ShipperCountry,ShipperProvince,
                    ShipperZip,ShipperPhone,ShipperEmail,ConsigneeName,ConsigneeAddressOne,ConsigneeCity,ConsigneeCountry,ConsigneeState,ConsigneeZip,
                    ConsigneePhone,ConsigneeEmail,ResponseCode,astrayExportDate,bondType,bondDestPort,bondOnwardscac,bondCarrierIRS,
                    bondNumber,bondTransferIRS,bondForeignPort,bondDepartureDate,MexiPediNumber)
                    OUTPUT Inserted.id into @Output
    SELECT sh.DDcode,s.SCACCode,s.ShipmentControl,s.CountryLoading,s.ProvinceLoading,s.ShipperName,s.ShipperAddress,s.ShipperCity,s.ShipperCountry,s.ShipperProvince,
             s.ShipperZip,s.ShipperPhone,s.ShipperEmail,s.ConsigneeName,s.ConsigneeAddressOne,s.ConsigneeCity,s.ConsigneeCountry,s.ConsigneeState,s.ConsigneeZip,
             s.ConsigneePhone,s.ConsigneeEmail,s.CustomControl,s.DateShipmentLeft,s.InbondEntryType,s.InbondDestination,s.OnwardCarrier,s.BondCarrier,
             s.Inbond,s.bondTransfer,s.ForeignPortDestination,s.EstimatedDeparture,s.MexiPediNumber
       FROM @ship s INNER JOIN ShipmentTypeDropDown sh on sh.DisplayName=s.ShipmentType

     
       select id from @Output 
SET @RetVal = 'true|Record Inserted Successfully|'
END
BEGIN

SELECT @ShipmentID=id;


INSERT INTO dbo.Ship_commodity([Description],Quantity,manifestUnitCode, 
[weight],weightUnitCode,countryCode,customsShipmentValue,commodityCode,MarksNumbers)                    

SELECT  sp.CommoditiesDescription,sp.Quantity,qu.DDCode,sp. 
[Weight],wu.DDCode,sp.CountryOrigin,sp.Value,sp.HarmonizedCode,sp.MarksNumbers
FROM @ship sp INNER JOIN WeightUnitDropDown wu on wu.DisplayName=sp.WeightUnitCode
INNER JOIN  QuantityUnitDropDown qu on qu.DisplayName=sp.QuantityUnit                                                           

END
 

идентификатор автоматически генерируется в таблице отгрузки. Я хочу вставить этот идентификатор в Ship_commodity, где ShipmentID=id .
Я вставляю записи из определяемой пользователем таблицы данных, для каждой записи идентификатор генерируется в таблице отгрузки. При вставке в
Таблица Ship_commodity я хочу вставить идентификатор отправки для каждой записи, где ShipmentID=id .
Как я должен этого добиться? пожалуйста, предложите.

Комментарии:

1. Присоединиться @output ? Что SELECT @ShipmentID=id; нужно делать, это не имеет смысла

2. Я пытался что-то сделать, я хотел взять идентификатор из таблицы отгрузки для каждой записи и вставить в Ship_commodity в качестве идентификатора доставки для этих записей, но я вставляю через userdefined таблицу. итак, как я могу этого добиться?

3. Что такое уникальный ключ @ship , вам также нужно будет отправить @output его, чтобы присоединиться

4. SCACCode, ShipmentControl — объединение этого уникально для каждой записи. как написать то, что вы говорите

Ответ №1:

Сначала вам insert нужно получить первичный ключ @ship , чтобы иметь возможность присоединять к нему выходную таблицу (обязательно добавьте дополнительные столбцы @output ):

 OUTPUT inserted.id, inserted.scaccode, inserted.ShipmentControl into @Output
 

Затем вы можете присоединиться @output к @ship (я предполагаю Ship_commodity , что у него есть столбец fkShipmentId ):

 INSERT INTO dbo.Ship_commodity
(fkShipmentId, [Description], Quantity, manifestUnitCode, [weight], weightUnitCode,
countryCode, customsShipmentValue, commodityCode, MarksNumbers)                    

SELECT
    i.id,
    sp.CommoditiesDescription,
    sp.Quantity,
    qu.DDCode,
    sp.[Weight],
    wu.DDCode,
    sp.CountryOrigin,
    sp.Value,
    sp.HarmonizedCode,
    sp.MarksNumbers
FROM @ship sp
INNER JOIN WeightUnitDropDown wu on wu.DisplayName=sp.WeightUnitCode
INNER JOIN QuantityUnitDropDown qu on qu.DisplayName=sp.QuantityUnit
INNER JOIN @output i ON i.scaccode = sp.scaccode AND i.ShipmentControl = sp.ShipmentControl;