2016-09-19 9 views
0

PK/FK関係として共通の「MasterId」を持つ2つのテーブル#tblMasterと#tblUniqueKeysデータがあります。#tblMasterのIDと共に既存の#tblUniqueKeysデータを更新する方法

create Table #tblMaster (MasterId INT IDENTITY(100,1), Details VARCHAR(10), DetectDate DATE, UpdateBy VARCHAR(10)); 
insert into #tblMaster(Details,DetectDate,UpdateBy) values ('DT12', '01/14/2016', 'XYZ') 

create Table #tblUniqueKeys (UqId INT IDENTITY(10,1), MasterId INT, UniqueKey VARCHAR(10), DetectDate DATE); 
insert into #tblUniqueKeys(MasterId, UniqueKey, DetectDate) values (100, 'uq1', '01/14/2016') 

ここでは、「Uniquekey」列とともにデータとともに#tblDataという表があります。

Create Table #tblData (Id int, Details VARCHAR(10), UniqueKey VARCHAR(10), DetectDate DATE, UpdateBy VARCHAR(10)); 
insert into #tblData values (1, 'DT1', 'uq1', '01/15/2016', 'abc') 

"UNIQUEKEY"(UQ1) "#tblUniqueKeys" "#tblMaster" テーブルからID "MasterId" と共に表中に既に存在します。

"#tblMaster"に "#tblData"データを挿入する必要があります。その後、IDが生成され、 "MasterId"と共に既存の#tblUniqueKeys列データを更新する必要があります。テーブルの

電流出力#tblMasterと#tblUniqueKeys出力以下を求めて

enter image description here

enter image description here

カーソルを通じ、私が取得することができています私の出力、しかし私はそう探しています私のような他のソリューションは、マージのような...

デモのデータとして、私は各テーブルに1-1レコードがありますが、私の実際のケースでは、100-10Kのデータが可能です。ありがとう!!!!あなたが希望する結果を達成することができますOutput句の助けを借りて

Create Table #tblData (Id int, Details VARCHAR(10), UniqueKey VARCHAR(10), DetectDate DATE, UpdateBy VARCHAR(10)); 
insert into #tblData values (1, 'DT1', 'uq1', '01/15/2016', 'abc') 

create Table #tblMaster (MasterId INT IDENTITY(100,1), Details VARCHAR(10), DetectDate DATE, UpdateBy VARCHAR(10)); 
insert into #tblMaster(Details,DetectDate,UpdateBy) values ('DT12', '01/14/2016', 'abc') 

create Table #tblUniqueKeys (UqId INT IDENTITY(10,1), MasterId INT, UniqueKey VARCHAR(10), DetectDate DATE); 
insert into #tblUniqueKeys(MasterId, UniqueKey, DetectDate) values (100, 'uq1', '01/14/2016') 

DECLARE @Details VARCHAR(10), @DetectDate DATE, @UpdateBy VARCHAR(10), @UniqueKey VARCHAR(10) 
DECLARE @iIdentity INT, @UqId INT 
DECLARE db_cursor CURSOR FOR 
SELECT Details, UniqueKey, DetectDate, UpdateBy FROM #tblData ORDER BY Id 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @Details, @UniqueKey, @DetectDate, @UpdateBy 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    --#tblMaster TABLE INSERT-- 
    INSERT INTO #tblMaster(Details, DetectDate, UpdateBy) VALUES (@Details, @DetectDate, @UpdateBy) 
    SELECT @iIdentity=SCOPE_IDENTITY() 

    --#tblUniqueKeys TABLE UPDATE-- 
    IF EXISTS(SELECT 1 FROM #tblUniqueKeys WHERE UniqueKey = @UniqueKey) 
    BEGIN 
    SELECT @UqId = UqId FROM #tblUniqueKeys WHERE UniqueKey = @UniqueKey 
    UPDATE #tblUniqueKeys SET MasterId = @iIdentity, DetectDate = @DetectDate WHERE UqId = @UqId 
    END 

    FETCH NEXT FROM db_cursor INTO @Details, @UniqueKey, @DetectDate, @UpdateBy 
    END 

CLOSE db_cursor 
DEALLOCATE db_cursor 

select * from #tblMaster 
select * from #tblUniqueKeys 

DROP TABLE #tblData; 
DROP TABLE #tblMaster; 
DROP TABLE #tblUniqueKeys; 

答えて

0

。 以下の手順に従ってください。与えられたデータを使用して、更新後

--Creating temp table for storing the Merge output 

CREATE TABLE #Output 
(
    [Action] NVARCHAR(10), 
    InsertedMasterID INT, 
    UniqueKey VARCHAR(10), 
    DetectDate DATE, 
    Tablename VARCHAR(50) 
); 

GO 

-- Inserting data into #tblmaster using #tblData and getting the required details to #Output table 

MERGE INTO #tblMaster a 
USING #tblData b 
    On a.Details=b.details 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (Details,Detectdate,UpdateBy) 
    VALUES(b.Details,b.DetectDate,b.UpdateBy) 
    OUTPUT $action,Inserted.MasterID,b.UniqueKey,b.DetectDate,'tblMaster' 
    INTO #Output; 

--Updating the new masted id and DetectDate in the table #tblUniqueKeys using the information from #Output table 

UPDATE a 
SET a.MasterId=b.InsertedMasterID 
    ,a.DetectDate=b.DetectDate 
FROM #tblUniqueKeys a 
    JOIN #Output b 
     On a.UniqueKey=b.UniqueKey 

出力:

enter image description here

関連する問題