0

データベースへの 1 回の呼び出しで複数の挿入を行うために、ストアド プロシージャでテーブル値パラメーターを使用することを検討しています。

テーブル値パラメーターには、多かれ少なかれ、挿入先のテーブルの定義を反映する情報が含まれています。ID 列が欠落しているだけです。

次のテーブル定義がある場合:

Create Table Product
(
     ProductID int,
     ProductName varchar(100),
     ProductDesc varchar(4000),
     ProductCost int
)

タイプ定義:

Create Type ProductTable as Table
(
    ProductName varchar(100),
    ProductDesc varchar(4000),
    ProductCost int
)

およびストアド プロシージャの定義:

Create Procedure usp_Product_Insert
    @Products ProductTable READONLY
AS
    INSERT Product
    (
        ProductID,
        ProductName,
        ProductDesc,
        ProductCost
    )
    SELECT
        (Select ISNULL(Max(ProductID),0) + 1 From Product),
        P.ProductName,
        P.ProductDesc,
        P.ProductCost
    FROM
        @Products P

パラメータに複数のデータ セットがある場合、一意の ID を挿入する必要があるものを変更するにはどうすればよいですか?

今、次のステートメントを実行すると

Truncate Table Product
Declare @Products ProductTable
Insert @Products Values ('Playstation', 'Game Console', 300)
exec usp_Product_InsertUpdate_WithOutput @Products

テーブルに以前のレコードがないストアド プロシージャを使用すると、

ProductID   ProductName ProductDesc ProductCost
1           Playstation     Game Console    300

しかし、複数のレコードを実行すると

Truncate Table Product
Declare @Products ProductTable
Insert @Products Values
('Playstation', 'Game Console', 300),
('Xbox', 'Game Console', 200),
('Wii', 'Game Console', 150)
exec usp_Product_InsertUpdate_WithOutput @Products

私は得る

ProductID   ProductDesc     ProductDesc ProductCost
1           Playstation     Game Console    300
1           Xbox            Game Console    200
1           Wii             Game Console    150

私が見たいのは

ProductID   ProductDesc     ProductDesc ProductCost
1           Playstation     Game Console    300
2           Xbox            Game Console    200
3           Wii             Game Console    150

IDを使用せずにこれを効率的に達成するにはどうすればよいですか?

4

2 に答える 2

4

できません。そして、試してはいけません。

ビジネスは、ビジネス キーを定義します。

開発者は代理キーを定義します。

必要なのは代理キーなので、IDENTITY列を使用します。

あなたのビジネスが代理キーを定義する場合、あなたの義務は代理キーを定義してはならないことを彼らに教えることです。

于 2013-03-14T18:50:49.573 に答える
0

さらに検索した後、私はhims056によって提供されたこのアプローチを見つけました:

ストアドプロシージャは次のように書き直されます。

Create Procedure usp_Product_Insert
    @Products ProductTable READONLY
AS
    INSERT Product
    (
        ProductID,
        ProductName,
        ProductDesc,
        ProductCost
    )
    SELECT
        (ROW_NUMBER( ) OVER ( ORDER BY ProductID ASC )) + (Select ISNULL(Max(ProductID),0) From Product),
        P.ProductName,
        P.ProductDesc,
        P.ProductCost
    FROM
        @Products P
于 2013-03-14T18:34:28.977 に答える