![](/img/trans.png)
[英]TSQL Use record currently being inserted to select data in another table
[英]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.