2017-05-18 9 views
0

現在、SQL Server 2012のT-SQLストアドプロシージャで作業しています。別のテーブルのテーブルエントリに更新または挿入しようとしています。TSQL UPDATEまたはINSERT INTOテーブルのテーブル

現在、元のテーブルに1つのエントリしかない場合は、1レコードしか更新できません。インポートするテーブルから10個のエントリを取得したら、1個のエントリを更新し、残りの9個のレコードをテーブルに追加したいと思います。

一時表(新しい値)

#tmpDelivery (VersionId INT, DeliveryModelId INT) 

配達表(更新すべき元、)

[MySchema].[Delivery] (DeliveryId INT, DeliveryModelId INT, VersionId INT) 

私の現在のスクリプトは次のようになります。どういうわけか

UPDATE [MySchema].[Delivery] 
SET DeliveryModelId = [D].DeliveryModelId 
FROM #tmpDelivery [D] 
WHERE [MySchema].[Delivery].VersionId = 1 
AND [D].VersionId = [MySchema].[Delivery].VersionId 

IF @@ROWCOUNT = 0 
    INSERT INTO [MySchema].[Delivery] ([DeliveryModelId], [VersionId]) 
    SELECT DeliveryModelId, VersionId 
    FROM #tmpDelivery  

このクエリ正しく動作しません。たとえば、1つのエントリが存在する場合は、1エントリしか更新されません。

この問題の解決方法をご存知ですか?

ありがとうございました!

+2

この場合、なぜ「MERGE」文を使用しないのですか? –

答えて

1

行数については忘れてください。既存のレコードが挿入されないようにinsertステートメントを変更します。このために外部結合を使用できます。

UPDATE [MySchema].[Delivery] 
SET DeliveryModelId = [D].DeliveryModelId 
FROM #tmpDelivery [D] 
WHERE [MySchema].[Delivery].VersionId = 1 
AND [D].VersionId = [MySchema].[Delivery].VersionId 


INSERT INTO [MySchema].[Delivery] ([DeliveryModelId], [VersionId]) 
SELECT t.DeliveryModelId, t.VersionId 
FROM #tmpDelivery t 
    left join [MySchema].[Delivery] d on t.DeliveryModelId = d.DeliveryModelId 
            and t.VersionId = d.VersionId 
where d.DeliveryModelId is null 
+0

は、魅力のように動作します、ありがとう! :) – TimHorton

関連する問題