Мне нужна помощь того, кто знает SQL, потому что это проблема, выходящая за рамки моих навыков работы с SQL. Это мои таблицы:
CREATE TABLE [dbo].[Orders]
(
id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
customerName VARCHAR(30) NOT NULL,
customerAddress VARCHAR(30) NOT NULL,
submitDate DATE NOT NULL,
realizationDate DATE,
deliveryTypeId INT NOT NULL
FOREIGN KEY(deliveryTypeId) REFERENCES deliveryTypes(id)
);
CREATE TABLE [dbo].[OrderItems]
(
id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
orderId INT NOT NULL,
productId INT NOT NULL,
productQuantity INT,
FOREIGN KEY(orderId) REFERENCES Orders(id),
FOREIGN KEY(productId) REFERENCES Products(id)
);
Мне нужно создать хранимую процедуру, которая вставляет в две таблицы базы данных связанные записи «один ко многим» (на самом деле это действительно часть привязки «многие ко многим», но мне нужно добавить только к этим двум таблицам). В моем приложении (.NET) мне нужно передать одну запись «Заказы» и одну или несколько записей «Заказы».
Мои проблемы:
- Если я вставлю «Заказ», я не буду знать, какое значение установить в
OrderItems -> orderId
. Я нашел функциюSCOPE_IDENTITY
, но не очень понимаю, как ее использовать в моем случае. - Как мне вставить
OrderItems
записей в таблицу, если я не знаю, сколько их будет? Я знаю только, что их может быть один или несколько. - Я не знаю, как вызвать процедуру, получающую много
OrderItems
с уровня приложения, и какие аргументы я должен объявить в хранимой процедуре.
Я очень ценю всю помощь, потому что я несколько часов сталкиваюсь с этой проблемой, и я действительно не знаю, как это сделать.
РЕДАКТИРОВАТЬ: это код, который я придумал до сих пор:
CREATE PROCEDURE spAddOrder
(@customerName VARCHAR(30),
@customerAddress VARCHAR(30),
@submitDate DATE,
@deliveryTypeId INT
-- I don't know how to pass many OrderItems rows as argument
)
AS
BEGIN
INSERT INTO Orders(customerName, customerAddress, submitDate, deliveryTypeId)
VALUES (@customerName, @customerAddress, @submitDate, @deliveryTypeId)
SELECT SCOPE_IDENTITY() AS orderId
-- I don't know how to do it for unknown number of rows
INSERT INTO OrderItems(orderId, productId, productQuantity)
VALUES (@orderId, @productId, @productQuantity)
END;
GO
orderId int
(это необнуляемый столбец int в таблице@Ids
. Ответ исправлен. 12.11.2018