2017-03-13 6 views
1

に自動生成/更新IDを割り当てるマージ実行するとき、私は、製品TSQLマージテーブル値パラメーターを使用して、バックパラメータ

CREATE TYPE [dbo].[udttProduct] AS TABLE(
[ProductID] [bigint] NOT NULL, 
[ProductDescription] [varchar](500) NOT NULL, 
[ProductCode] [varchar](50) NOT NULL) 

という名前のテーブルの種類とストアドプロシージャ

CREATE PROCEDURE [dbo].[uspCreateOrUpdateProduct] 
    @ProductParam udttProduct READONLY, 
AS 
BEGIN 
    SET NOCOUNT ON; 
    MERGE Product AS [Target] 
    USING @ProductParam AS [Source] 
    ON 
     [Target].ProductCode = [Source].ProductCode 
    WHEN MATCHED THEN 
    UPDATE 
    SET 
      [Target].ProductDescription = [Source].ProductDescription 
      -- i would like to assign the updated ID back to @ProductParam so i can insert to log 
    WHEN NOT MATCHED BY TARGET THEN 
    INSERT 
     (
       ProductDescription 
      , ProductCode 
     ) 
     VALUES 
     (
       [Source].[ProductDescription] 
      , [Source].[ProductCode] 
     ); 
     -- i would like to assign the auto generated ID back to @ProductParam so i can insert to log 

    -- after insert/update, insert to log 
    INSERT INTO [dbo].[ProductLog] 
    (
     ProductId, -- so i can insert id to here 
     ProductDescription, 
     ProductCode 
    ) 
    SELECT 
     ProductID, 
     ProductDescription, 
     ProductCode 
    FROM 
     @ProductParam 


    SET NOCOUNT OFF; 
END 
GO 

をしました、私は@ProductParamに更新された/新しいIDを取得したいので、ProductIDを使ってログに記録することができます。

私は他のストアドプロシージャを使用してマージを使用しており、IDを取得してログに挿入するのと同じことをしたいが、これらのストアドプロシージャは大量のデータを必要とし、トランザクションは10000+レコードに対して1秒のようです。

私は一時テーブルを使ってIDを取得しますが、私はマージがこれを行うことができるかどうか疑問に思っています。 これが良い方法でない場合は、私に助言してください。ありがとう。

PS:私のproductIDキーは、挿入中に自動的に生成されます。

+0

[T-SQL - 親テーブルと子テーブルへのデータの挿入]の可能な複製(http://stackoverflow.com/questions/38213008/t-sql-insert-data-into-parent-and-child-tables) –

答えて

2

あなたは(それが読み取り専用であるので、あなたがとにかく行うことはできません)あなたのテーブル値パラメーターを変更することを心配して、ログテーブルに直接挿入することがMERGE文のOUTPUT句を使用して、することはできません。

MERGE Product AS [Target] 
USING @ProductParam AS [Source] 
ON [Target].ProductCode = [Source].ProductCode 
WHEN MATCHED THEN 
    UPDATE SET [Target].ProductDescription = [Source].ProductDescription 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (ProductDescription, ProductCode) 
    VALUES ([Source].[ProductDescription], [Source].[ProductCode]) 
OUTPUT inserted.ProductID, inserted.ProductDescription, inserted.ProductCode 
    INTO dbo.ProductLog (ProductID, ProductDescription, ProductCode); 

ProductLog.ProductIDProduct.ProductIDの外部キー参照がある場合、この方法は機能しません。新しいテーブルに結果をステージングしてから挿入する必要があります。

DECLARE @tmpProductLog dbo.udttProduct; 

MERGE Product AS [Target] 
USING @ProductParam AS [Source] 
ON [Target].ProductCode = [Source].ProductCode 
WHEN MATCHED THEN 
    UPDATE SET [Target].ProductDescription = [Source].ProductDescription 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (ProductDescription, ProductCode) 
    VALUES ([Source].[ProductDescription], [Source].[ProductCode]) 
OUTPUT inserted.ProductID, inserted.ProductDescription, inserted.ProductCode 
    INTO tmpProductLog (ProductID, ProductDescription, ProductCode); 


INSERT dbo.ProductLog (ProductID, ProductDescription, ProductCode) 
SELECT ProductID, ProductDescription, ProductCode 
FROM @tmpProductLog; 
関連する問題