2016-05-19 6 views
0

私は次のクエリを持っている:更新テーブルの行

INSERT INTO dbo.Products 
     (Code , 
      ProducerCode , 
      CustomerId , 
      EanCode , 
      ChangedDateTime , 
      ChangedById , 
      Deleted 
     ) 
SELECT Code , 
     ProducerCode , 
     CustomerId , 
     EanCode , 
     GETDATE(), 
     GETDATE(), 
     0 
FROM dbo.BulkProducts 
WHERE ProductId is NULL AND BulkProducts.BulkId = @BulkId 

Productsテーブルインサート上に自動的に割り当てられIDENTITY IDカラムを有します。私が達成したいのは、Productsに挿入した後に、BulkProductsという行の製品のIDが割り当てられていることです。 @@IDENTITYIDENT_CURRENTSCOPE_IDENTITYについて少し読んだことがありますが、私の例ではうまくいかないようです。どんな助けもありがたい。私はこのように、あなたがOutput句を使用してそれを達成することができますSQL Serverのに2012

+0

selectが2つ以上の行を返すと仮定すると、最近挿入されたレコードIDを取得するには、insert文にoutput句を追加する必要があります。 –

+0

構文についての簡単な例を共有しますか? –

+0

明確な例がMSDNのリファレンスで提供されています。これを見て、それが役立つかどうかを見てください。 https://msdn.microsoft.com/en-us/library/ms187342.aspx –

答えて

0

を使用しています -

DECLARE @OutProduct TABLE 
(
    ProductID INT, 
    Code INT 
) 

INSERT INTO dbo.Products 
     (Code , 
      ProducerCode , 
      CustomerId , 
      EanCode , 
      ChangedDateTime , 
      ChangedById , 
      Deleted 
     ) 
OUTPUT INSERTED.ID, INSERTED.Code INTO @OutProduct (ProductID, Code) 
SELECT Code , 
     ProducerCode , 
     CustomerId , 
     EanCode , 
     GETDATE(), 
     GETDATE(), 
     0 
FROM dbo.BulkProducts 
WHERE ProductId is NULL AND BulkProducts.BulkId = @BulkId 

だから今、すべての挿入されたデータは@OutProduct表です。これで、以下のような一時テーブルを使用してBulkProductsテーブルを更新できます。

UPDATE bprod 
    SET productID = tmp.ProductID 
FROM BulkProducts bprod 
INNER JOIN @OutProduct tmp 
    ON bprod.Code = tmp.Code 
WHERE bprod.ProductId is NULL AND bprod.BulkId = @BulkId 
+0

'OUTPUT INSERTED.INIT @OutProduct(ProductID、BulkId)'は、現在のちょうど挿入されたIDとBulkIdの両方 –

+0

しかし、 'BulkId'フィールドが挿入されていないのが分かるので、' INSERTED'からアクセスできないと思います。 'OUTPUT INSERTED.ID、BulkProducts.BulkId INTO @OutProduct(ProductID 、BulkId) 'しかし、それは動作していないようです。 –

+0

あなたは 'Code'でそれを変更しましたが、まだ' BulkId'が必要です:D –

0

これは明らかにMERGEがなければ解決できません。最終的な解決策は、次のようになります。

MERGE INTO dbo.Products 
USING dbo.BulkProducts AS src 
    ON 1 = 0 -- Never match 
WHEN NOT MATCHED THEN 
    INSERT(EanCode, ChangedDateTime, ChangedById, Deleted) 
    VALUES(src.EanCode, GETDATE(), GETDATE(), 0) 
OUTPUT 
    inserted.Id, 
    src.Id 
INTO @OutProduct; 

そして、このように、私の@OutProductテーブルは、私はその後、私のBulkProductsテーブルを更新するために使用することができますBulkProductIdProductIdのタプルが含まれています。