для курса Я пытаюсь создать хранимую процедуру с помощью TSQL, которая должна создать в моей базе данных билет на различные услуги, которые могут быть проведены на транспортном средстве. Эти услуги могут включать в себя general_service (s), ремонт (ы) и осмотр (и), а также некоторую дополнительную информацию о затратах.
В результате, если serviceticket успешно создан после выполнения процедуры, должен быть возвращен номер serviceticket.
Входные параметры:
VehicleId, ticketDate, customerId, serviceTypes (TVP), repairs (TVP), inspections (TVP)
Выходной параметр: ServiceTicket Number
Таблицы в базе данных:
CREATE TABLE dbo.StandardService
(
serviceId CHAR(8) PRIMARY KEY NOT NULL,
leaseNo CHAR(8) NOT NULL,
serviceDate DATE NOT NULL,
includesInspection CHAR(8) NOT NULL,
serviceName VARCHAR(25) NOT NULL DEFAULT '',
serviceDescription VARCHAR(50) NOT NULL DEFAULT '',
currentPrice DECIMAL(8,4) NOT NULL CHECK(currentPrice BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
FOREIGN KEY(includesInspection)
REFERENCES VehicleInspection(inspectionId)
ON DELETE NO ACTION,
FOREIGN KEY(leaseNo)
REFERENCES VehicleLease(leaseNo)
ON DELETE NO ACTION
)
CREATE TABLE dbo.VehicleInspection
(
inspectionId CHAR(8) PRIMARY KEY NOT NULL,
inspectionName VARCHAR(25) NOT NULL DEFAULT '',
currentPrice DECIMAL(8,4) NOT NULL DEFAULT 0.0,
vehicleTypeId CHAR(8) NOT NULL DEFAULT '',
FOREIGN KEY (vehicleTypeId)
REFERENCES VehicleType(vehicleTypeId)
ON UPDATE CASCADE ON DELETE NO ACTION
)
CREATE TABLE dbo.VehicleRepair
(
vehicleRepairId CHAR(8) NOT NULL,
vehiclePrvId CHAR(8),
vehiclePurchId CHAR(8),
ticketIssueNo CHAR(8),
labourCost DECIMAL(8,4) NOT NULL CHECK(labourCost BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
partCost DECIMAL(8,4) NOT NULL CHECK(partsCost BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
PRIMARY KEY(vehicleRepairId),
FOREIGN KEY(vehiclePrvId)
REFERENCES VehiclePrevLeased(vehicleId)
ON DELETE NO ACTION,
FOREIGN KEY(vehiclePurchId)
REFERENCES VehiclePurchased(vehicleId)
ON DELETE NO ACTION,
FOREIGN KEY(ticketIssueNo)
REFERENCES ServiceTicket(ticketIssueNo)
ON DELETE NO ACTION
)
CREATE TABLE dbo.ServiceTicket
(
ticketIssueNo CHAR(8) PRIMARY KEY NOT NULL,
serviceDate DATE NOT NULL,
vehicleId CHAR(8) NOT NULL,
customerId CHAR(8) NOT NULL,
inspectionId CHAR(8) NOT NULL,
serviceCost DECIMAL(8,4) NOT NULL CHECK(serviceCost BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
inspectionCost DECIMAL(8,4) NOT NULL CHECK(inspectionCost BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
repairCost DECIMAL(2,2) NOT NULL CHECK(repairCost BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
GST DECIMAL(8,4) NOT NULL DEFAULT 0.0,
amountDue DECIMAL(8,4) NOT NULL CHECK(amountDue BETWEEN 0.0 AND 99999.0) DEFAULT 0.0,
FOREIGN KEY(vehicleId)
REFERENCES Vehicle(vehicleId)
ON UPDATE NO ACTION,
FOREIGN KEY(inspectionId)
REFERENCES VehicleInspection(inspectionId)
ON UPDATE NO ACTION,
FOREIGN KEY(customerId)
REFERENCES Customer(customerId)
ON UPDATE NO ACTION,
)
У меня нет предыдущего опыта в хранимых процедурах, и я не смог найти хороший пример, который относится к этой более сложной проблеме. Я до сих пор создал три таблицы для значений TVP.
Тип для трех типов услуг
CREATE TYPE ServiceType AS TABLE
(
serviceId CHAR(8),
PRIMARY KEY(serviceId)
)
CREATE TYPE RepairType AS TABLE
(
vehicleRepairId CHAR(8),
PRIMARY KEY(vehicleRepairId)
)
CREATE TYPE InspectionType AS TABLE
(
inspectionId CHAR(8),
PRIMARY KEY(inspectionId)
)
-- Creating stored proc with input parameter to receive data
-- for the table-valued parameter
CREATE PROCEDURE usp_GenerateServiceTicket
@vehicleId CHAR(8),
@serviceDate DATE,
@customerId CHAR(8),
@gst DECIMAL(8,4),
@serviceType ServiceType READONLY,
@repairType RepairType READONLY,
@inspectionType InspectionType READONLY,
-- output parameter for stored procedure
@ticketIssueNo CHAR(8) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
-- How to continue in this case when multiple information needs to be retrieved first
из различных таблиц, прежде чем можно будет вставить его в
Таблица ServiceTicket для создания нового Service Ticket
INSERT INTO ServiceTicket
VALUES (@ticketIssueNo, @serviceDate, @vehicleId, @customerId, @inspectionId)
SELECT *
FROM @serviceType
WHERE ...
END
Как я могу структурировать процедуру в этом случае, если мне нужно запросить несколько таблиц в моей базе данных, собрать всю возвращенную информацию и вставить ее в ServiceTicket? Большое спасибо за любую подсказку / помощь.