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是用於跟蹤的對象從應用程序向數據庫和背部一路的能力。

+1

我想你會需要添加'CorrelationId'到'Phone'表,如果你想要的'output'子句來提供匹配的「PhoneID」/「CorrelationId」值。或者,如果電話號碼始終爲唯一_,則可以在'PhoneNumber'上使用'內部連接'在'插入'後匹配它們。 – HABO 2013-04-10 03:27:11

回答

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 
+0

根據電話號碼是唯一的,你可以省略'output',只需將'@ Input'加入'Phone'。性能將取決於'Phone'是否由'PhoneNumber'索引以及'@ Input'的典型大小。 – HABO 2013-04-10 16:45:39

+0

我同意你可以並且在這個給定的用例中它可能是有意義的。但是,使用輸出子句可爲您提供加入較少數據的好處(數據庫表可能包含數百萬條記錄,並且可能有更多列要加入)。此外,這種方法依賴於數據是唯一的,但是通過使用輸出表,數據只需要在傳入的數據集中是唯一的。最後一個考慮是從輸出表中讀取信息可以讓您不必重新訪問表。 – scottmgerstl 2013-04-10 18:07:39