繁体   English   中英

保留记录的非插入数据

[英]Preserving non-inserted data for a record

我正在尝试使用表值参数(TVP),以及如何从C#代码中使用它们。 TVP的一个特定方面给我带来麻烦:将数据列表传递给存储过程时,并希望在数据从数据库返回后更新该列表。

这是一个将包含在列表中的示例类:

public class Phone
{
    int _phoneID;
    string _phoneNumber;
    Guid _correlationID;
}

当将此列表传递给使用TVP的存储过程时,如何将_phoneID和_phoneNumber插入数据库中,并在插入后根据_correlationID使用_phoneID更新电话列表?

这是一个示例表,类型和存储过程:

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

相关ID的原因是能够跟踪从应用程序到数据库并一直追溯到对象的对象。

基于我对内部联接的疑问,我得出了这个解决方案,它看起来工作得很好。 仅当要插入的数据在集合中唯一时,此方法才有效。

修改的表,类型和存储过程可以满足我对相关ID的需求:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM