Вставьте данные в 3 связанных таблицы - PullRequest
2 голосов
/ 02 ноября 2010

Как вставить данные в 3 связанные таблицы (SQL Server)

Например, у меня есть таблицы Customer <- Customer_Address -> Address. После того, как я вставлю данные в Customer и Address, как мне вставитьИдентификаторы от Клиента и Адрес в Customer_Address?(присоединиться к столу)

Спасибо!

Ответы [ 6 ]

3 голосов
/ 02 ноября 2010

Использование SCOPE_IDENTITY , @@ IDENTITY может вернуть значение из любой области:

DECLARE @CustomerId INT
DECLARE @AddressId INT

BEGIN TRANSACTION

  INSERT INTO CUSTOMER (blah, blah) values (blah, blah)
  SET @CustomerId = SCOPE_IDENTITY

  INSERT INTO ADDRESS (blah, blah) values (blah, blah)
  SET @AddressId = SCOPE_IDENTITY 

  INSERT INTO CUSTOMERADDRESS (CustomerId,AddressId) values (@CustomerId,@AddressId)

COMMIT TRANSACTION
1 голос
/ 02 ноября 2010

Если вы хотите вставить более одной строки, вы можете использовать предложение вывода:

declare @insertedAddresses table (OriginalID int, AddressID int);
declare @insertedCustomers table (OriginalID int, CustomerID int);

insert into dbo.Addresses (AddressData)
output source.OriginalID, inserted.AddressID into @insertedAddresses
select AddressData from source;

insert into dbo.Customers (CustomerData)
output source.OriginalID, inserted.CustomerID into @insertedCustomers
select CustomerData from source;

insert into dbo.Customer_Address (AddressID, CustomerID)
select a.AddressID, c.CustomerID
from @insertedAddresses a inner join @insertedCustomers c on c.OriginalID=a.OriginalID;
0 голосов
/ 02 ноября 2010

Если это для приложения, то почему бы просто не использовать Linq, вы можете выполнить такие вещи за несколько минут, в более сжатой форме и с большим упором на модель бизнес-логики.

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

0 голосов
/ 02 ноября 2010

Вот один из способов.

Declare CustomerID int, AddressID int

insert into Customer (list, of, fields) values (list, of, values)
select @CustomerID=scope_Identity()
insert into Address (list, of, fields) values (list, of, values)
select @AddressID =scope_Identity()

insert into Customer_Address (CustomerID, AddressID) values (@CustomerID, @AddressID)
0 голосов
/ 02 ноября 2010

используйте транзакцию и запомните идентификационные данные.в sql server -

declare @CustomerId int
declare @AddressId int

begin tran
    insert into Customer (blah, blah) values (blah, blah)
    set @CustomerId = @@IDENTITY    --assuming there are no triggers
    insert into [Address] (blah, blah) values (blah, blah)
    set @AddressId = @@IDENTITY     --once again, no triggers to mess up the @@IDENTITY
    insert into CustomerAddress(CustomerId,AddressId) values (@CustomerId,@AddressId)
commit
0 голосов
/ 02 ноября 2010

Если идентификаторы из таблиц Customer и Address являются столбцами Identity, новый идентификатор можно сохранить в переменной.

DECLARE @CustomerID int

SELECT @CustomerID = @@IDENTITY FROM TABLE CUSTOMER

Аналогичный синтаксис можно использовать для таблицы Address.Тогда в вашем INSERT заявлении вы можете сделать следующее:

INSERT INTO Customer_Address (CustomerID, AddressID)
VALUES (@CustomerID, @AddressID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...