1

テーブル値パラメーター (TVP) と、C# コードからそれらを使用する方法を試しています。TVP の 1 つの特定の側面は、私に問題を引き起こしています: データのリストをストアド プロシージャに渡し、データがデータベースから戻ってきた後にそのリストを更新したい場合。

リスト内に含まれるサンプル クラスを次に示します。

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 に答える