У меня было три таблицы 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.
Какова цель разделения на три таблицы? Я думаю, что есть проблема с вашей моделью данных. Учитывая одну запись в Person, сколько связанных записей вы ожидаете иметь в других таблицах? Если ответ равен нулю или единице, то вся эта информация должна быть в одной таблице, и вы просто слишком усложняете текущий подход.
Я работаю над сервисом записи на прием, мне нужны только customerID и Status. Я хочу разделить стол.
Вы пометили свой вопрос как 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. Это позволяет нам фиксировать значения строки, вставленные в таблицу.
Теперь нам просто нужно вставить значения в свои таблицы со статусами.
Это отвечает на ваш вопрос, хотя вам рекомендуется настроить схему. Мы не знаем всех причин, по которым вы можете захотеть это сделать, может быть, где-то в требованиях это становится необходимым, мы не знаем.
Наконец, несколько слов о сценарии, в котором вы, возможно, захотите использовать подобную схему. Учитывайте контактную информацию. Вы можете сохранить несколько разных значений для одного человека (мобильный телефон, электронная почта, домашний телефон, рабочая электронная почта и т. д.). Поскольку у вас есть отношение «один ко многим», имеет смысл отделить его от родительской таблицы (мой комментарий о подсвойствах ранее).
Пожалуйста, прочтите инструкцию Как написать хороший вопрос T-SQL в информации тега t-sql и отредактируйте свой вопрос соответствующим образом.