Создание хранимой процедуры SQL Server для отношения Person/Customer/Worker

У меня было три таблицы SQL Server. Я попытался создать хранимую процедуру, в которой Person таблица, в которой я храню информацию о человеке, Customer таблица, которая берет информацию из таблицы людей, но содержит статус человека, и то же самое для таблицы данных рабочего.

Образец данных:

Таблицы:

Person                          Customer                     Worker
ID(BigInt)                      ID(BigInt)                   ID(BigInt)
FirstName(nvarchar(100))        PersonID(BigInt)             PersonID(BigInt)
MiddleNameS(nvarchar(100))      Status(nvarchar(100))        Status(nvarchar(100))
Surname(nvarchar(100))              
Phone(varchar(20))              
EMail(nvarchar(100))                

Хранимая процедура: InsertCustomer имеет всю информацию о человеке при выполнении процедуры, она должна взять информацию о человеке и сохранить ее в таблице Person, а таблица Customer должна хранить customerID, personID и status.

Пожалуйста, прочтите инструкцию Как написать хороший вопрос T-SQL в информации тега t-sql и отредактируйте свой вопрос соответствующим образом.

Zohar Peled 21.11.2022 08:16

Какова цель разделения на три таблицы? Я думаю, что есть проблема с вашей моделью данных. Учитывая одну запись в Person, сколько связанных записей вы ожидаете иметь в других таблицах? Если ответ равен нулю или единице, то вся эта информация должна быть в одной таблице, и вы просто слишком усложняете текущий подход.

Nick.McDermaid 21.11.2022 09:09

Я работаю над сервисом записи на прием, мне нужны только customerID и Status. Я хочу разделить стол.

cagatay.beser 21.11.2022 10:02
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
3
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пометили свой вопрос как TSQL, поэтому я предполагаю, что это то, что вы хотите, несмотря на использование недопустимого синтаксиса для описания таблиц.

Во-первых, давайте поговорим о предоставлении демонстрационных данных и объектов. Это простой способ сделать это, любой может просто скопировать и вставить:

DECLARE @Person TABLE (ID BIGINT IDENTITY, FirstName NVARCHAR(100), MiddleNameS NVARCHAR(100), Surname NVARCHAR(100), Phone VARCHAR(20), EMail NVARCHAR(100));
DECLARE @Customer TABLE (ID BIGINT IDENTITY, PersonID BIGINT, Status NVARCHAR(100));
DECLARE @Worker TABLE (ID BIGINT IDENTITY, PersonID BIGINT, Status NVARCHAR(100));

Вы можете легко вставить демонстрационные данные в эти таблицы, но в данном случае они нам не нужны.

К вопросу. Предыдущий комментарий правильный. Судя по вашему описанию, это должна быть одна таблица, а не три. CustomerStatus и WorkerStatus — это просто свойства вашего объекта Person. У них нет других свойств, и они не будут существовать несколько раз.

Это делает правильный ответ для содержимого вашей хранимой процедуры примерно таким:

INSERT INTO @Person (FirstName, MiddleNameS, Surname, Phone, EMail, CustomerStatus, WorkerStatus) VALUES
(@FirstName, @MiddleNameS, @Surname, @Phone, @Email, @CustomerStatus, @WorkerStatus);

Это просто вставляет значения (при условии, что они будут переданы в sproc) в таблицу.

Если вы настаиваете на том, что хотите использовать схему с тремя таблицами, вы столкнетесь с некоторой дополнительной сложностью, но есть довольно стандартный способ сделать это.

DECLARE @holder TABLE (PersonID BIGINT, CustomerStatus NVARCHAR(100), WorkerStatus NVARCHAR(100))
INSERT INTO @Person (FirstName, MIddleNameS, Surname, Phone, Email) 
OUTPUT INSERTED.ID, @CustomerStatus, @WorkerStatus INTO @holder  (PersonID, CustomerStatus, WorkerStatus) VALUES 
(@FirstName, @MiddleNameS, @Surname, @Phone, @Email);

INSERT INTO @Customer (PersonID, Status)
SELECT PersonID, CustomerStatus
  FROM @holder;

INSERT INTO @Worker (PersonID, Status)
SELECT PersonID, WorkerStatus
  FROM @holder;

Давайте посмотрим, что здесь происходит. Сначала мы объявляем табличную переменную для хранения сгенерированного идентификатора, а также значений статуса работника и клиента.

Затем мы выполняем вставку в Person, используя предложение OUTPUT. Это позволяет нам фиксировать значения строки, вставленные в таблицу.

Теперь нам просто нужно вставить значения в свои таблицы со статусами.

Это отвечает на ваш вопрос, хотя вам рекомендуется настроить схему. Мы не знаем всех причин, по которым вы можете захотеть это сделать, может быть, где-то в требованиях это становится необходимым, мы не знаем.

Наконец, несколько слов о сценарии, в котором вы, возможно, захотите использовать подобную схему. Учитывайте контактную информацию. Вы можете сохранить несколько разных значений для одного человека (мобильный телефон, электронная почта, домашний телефон, рабочая электронная почта и т. д.). Поскольку у вас есть отношение «один ко многим», имеет смысл отделить его от родительской таблицы (мой комментарий о подсвойствах ранее).

Другие вопросы по теме