Сохранение не вставленных данных для записи

Я экспериментирую с табличными параметрами (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
Другие вопросы по тегам