1

我正在试验表值参数 (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 的原因是能够跟踪从应用程序到数据库并返回的对象。

4

1 回答 1

0

根据我关于内部连接的问题下的评论,我找到了这个解决方案,它看起来工作得很好。只有当插入的数据在集合中是唯一的时,这种方法才有效。

修改表、类型和存储过程来满足我对相关 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
于 2013-04-10T15:34:24.043 回答