0

idProduct = id (1 対 1) で結合する次のテーブルがあります。

製品

  • idProduct
  • 説明

プロダクトキー

  • ID
  • プロダクトキー

製品の説明に基づいて製品の ProductKeys のキーを更新する、単一および一括の挿入と更新のために、Products テーブルにトリガーを作成する必要があります。

製品にキーがある場合は、キーを説明に更新し、そうでない場合は新しいキーを挿入します。

プロダクト キーは、製品ごとに一意である必要があります。

そのため、別の製品のキーが既に存在する場合は、説明に idProduct を追加してキーを作成します。

私の問題:

同じ説明で2つの異なる製品が挿入または更新されるシナリオを除いて、挿入と更新に対してトリガーが機能しています。このシナリオでは、生成されるキーは両方の製品で同じです。

何か案は?

MERGE ステートメントを使用したトリガーは次のとおりです。

CREATE TRIGGER [dbo].[UpdateKey]
ON  [dbo].[Products] 
AFTER  INSERT, UPDATE
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

        MERGE ProductKeys [Target]
        USING 
            (
                SELECT
                    CASE 
                        WHEN pk.id IS NULL 
                            THEN i.description
                        ELSE  
                            i.description + '_' + CAST(i.idProduct AS VARCHAR)
                        END [NewProductKey]
                    , i.idProduct
                FROM
                    INSERTED i
                    LEFT OUTER JOIN ProductKeys pk ON pk.id <> i.idProduct AND pk.ProductKey = i.description
                ) [source]
        ON (target.id = source.idproduct)
        WHEN NOT MATCHED THEN 
            INSERT
                ( 
                    id
                    , ProductKey
                )
            VALUES
                (
                        source.idProduct
                        , source.NewProductKey
                )
        WHEN MATCHED THEN
            UPDATE SET
                ProductKey = source.NewProductKey;
4

1 に答える 1

0

ソースに重複があるかどうかを確認するために、INSERTED に LEFT JOIN を追加しました。ソース クエリは次のようになります。

SELECT
    CASE 
        WHEN pk.id IS NULL AND i2.idProduct IS NULL
            THEN i.description
        ELSE  
            i.description + '_' + CAST(i.idProduct AS VARCHAR)
        END [NewProductKey]
    , i.idProduct
FROM
    INSERTED i
    LEFT OUTER JOIN ProductKeys pk ON pk.id <> i.idProduct AND pk.ProductKey = i.description
    LEFT OUTER JOIN INSERTED i2 ON  i2.description = i.description AND i.idProduct <> i2.idProduct

これは私にとっては問題ありません。ソースに同じ説明を持つ 2 つの製品がある場合、両方の製品の ID がキーに追加されます。

ただし、最初の製品のキーを ID なしで (説明だけで) 保持し、残りを ID で保持する方法があれば、それが理想的です。

于 2013-04-09T18:16:46.227 に答える