Сохранение не вставленных данных для записи
Я экспериментирую с табличными параметрами (TVP) и как их использовать из кода C#. Один из специфических аспектов TVP вызывает у меня проблемы: при передаче списка данных в хранимую процедуру и при желании обновить этот список после того, как данные возвращаются из базы данных.
Вот пример класса, который будет содержаться в списке:
public class Phone
{
int _phoneID;
string _phoneNumber;
Guid _correlationID;
}
При передаче этого списка хранимой процедуре, использующей TVP, как я смогу вставить _phoneID и _phoneNumber в базу данных и после вставки обновить список телефонов с помощью _phoneID на основе _correlationID?
Вот пример таблицы, тип и хранимая процедура:
Create Table PhoneTable
(
PhoneID int identity(1,1),
PhoneNumber varchar(20)
)
GO
Create Type PhoneType As Table
(
PhoneNumber varchar(20),
CorrelationID uniqueidentifier
)
GO
Create Procedure usp_Phone_Insert
@Input PhoneType ReadOnly
AS
Declare @Output Table (PhoneID int, PhoneNumber varchar(20))
Insert Phone (PhoneNumber)
Output
inserted.PhoneID,
inserted.PhoneNumber
Into @Output
Select
PhoneNumber
From
@Input
Select PhoneID, PhoneNumber From @Output
GO
Причиной идентификатора корреляции является возможность отслеживать объекты на всем пути от приложения до базы данных и обратно.
1 ответ
Основываясь на комментарии под моим вопросом о внутренних соединениях, я пришел к этому решению, и оно выглядит очень хорошо. Этот подход будет работать, только если вставляемые данные уникальны в наборе.
Измененная таблица, тип и хранимая процедура для удовлетворения моих потребностей в идентификаторе корреляции:
Create Table PhoneTable
(
PhoneID int identity(1,1),
PhoneNumber varchar(20)
)
GO
Create Type PhoneType As Table
(
PhoneNumber varchar(20),
CorrelationID bigint
)
GO
Create Procedure usp_Phone_Insert
@Input PhoneType ReadOnly
AS
Declare @Output Table (
PhoneID int,
PhoneNumber varchar(20),
CorrelationID bigint)
Insert Phone (PhoneNumber)
Output
inserted.PhoneID,
inserted.PhoneNumber
Into @Output
Select
PhoneNumber
From
@Input
Select
O.PhoneID,
O.PhoneNumber,
I.CorrelationID
From
@Output O
Inner Join @Input I on I.PhoneNumber = O.PhoneNumber
GO