Нет необходимости зацикливаться и вставлять по одной строке за раз.Это просто способ замедлить ваш код.Поскольку таблицы не имеют какого-либо порядка в них, вам необходимо добавить один столбец, чтобы определить порядок.Ваш тип будет выглядеть следующим образом:
CREATE TYPE VarcharArray AS TABLE(ID int, Item VARCHAR(100));
Затем вы можете переписать вашу процедуру как один оператор INSERT.
CREATE PROCEDURE SomeProcedure(
@FatherId AS VARCHAR, --This might need a length or will be defaulted to length 1
@Barcode AS VarcharArray READONLY,
@ItemId AS VarcharArray READONLY
)
AS
INSERT INTO CAMPAIGN_SAMPLES(Id, Barcode, ItemId)
SELECT NEXT VALUE FOR SAMPLE_SEQUENCE,
bc.Item,
i.Id
FROM ITEM i
JOIN @ItemId ii ON i.CampaignItemId = ii.Item
JOIN @Barcode bc ON ii.ID = bc.ID
WHERE i.FatherId = @FatherId;
Вы также можете создать таблицу с обоими значениями и предотвратить любыепроблемы с заказом, которые могут возникнуть.
CREATE TYPE BarcodeItems AS TABLE(Item VARCHAR(100), Barcode VARCHAR(100));
GO
CREATE PROCEDURE SomeProcedure(
@FatherId AS VARCHAR, --This might need a length or will be defaulted to length 1
@BarcodeItems AS BarcodeItems READONLY
)
AS
INSERT INTO CAMPAIGN_SAMPLES(Id, Barcode, ItemId)
SELECT NEXT VALUE FOR SAMPLE_SEQUENCE,
bi.Item,
i.Id
FROM ITEM i
JOIN @BarcodeItems bi ON i.CampaignItemId = bi.Item
WHERE i.FatherId = @FatherId;