2016-09-02 2 views
0

나는 FakeIds 집합을 가지고 있으며, 삽입시 실제 ID로 변환됩니다. 나는 이제 진짜 가짜의 매핑을 얻고 싶다. 내가 Source.DateId가 작동하지 않습니다 알고 삽입 결과와 함께 원본 columnvalue를 새 테이블에 삽입하는 방법은 무엇입니까?

INSERT INTO Data_tbl 
(days) 
OUTPUT inserted.DateID, 0,source.DateID into @mappedIDs(objectId, objectTypeId, fakeId) 
SELECT Days        
FROM @inputTable 

처럼 내 쿼리하지만 난 그래서 당신은 '돈 때 소스 데이터에 매핑 삽입 된 데이터에

+0

가짜에서 진짜로 변환되는 ID는 무엇입니까? –

+0

'일'은 고유합니까? 그렇다면 삽입 후 소스와 대상을 결합하여 매핑을 결정할 수 있습니다. –

+0

-1, -2 -3 등의 가짜 고유 ID를 사용하여 데이터를 전송합니다.이 값을 삽입하면 ID를 추가 처리 할 때 삽입 할 때 실제 ID에 매핑해야합니다. – AnishaJain

답변

2

사용하십시오 MERGE 명령 대신 ... OUTPUT 절에서 당신은 당신이 필요로하는 삽입 소스 열을 언급 할 수있다.

샘플 코드는 다음과 같습니다.

MERGE Data_tbl d 
USING ( SELECT DateID,Days 
      FROM @inputTable 

     ) d1 ON d.DateID = d1.DateID 
WHEN NOT MATCHED 
THEN INSERT 
    ([days]) 
    VALUES (d1.[days]) 
OUTPUT inserted.DateID, 0,d1.DateID INTO @mappedID 
0

트릭을 필요로하는지 설명하기 위해 거기에 넣어 가지고 두 ID를 대상 테이블에 전달하는 것은 까다 롭습니다. 자체 맵을 만들어야합니다. 여기에 자신 만의 스크립트를 만들 수있는 전체 스크립트가 있습니다.

먼저 대상 테이블을 에뮬레이트하기 위해 임시 테이블을 만들었으므로 데모를 여러 번 실행하려는 경우에 대비하여 항상 임시 테이블이 이미 있는지 확인해야합니다.

IF OBJECT_ID('tempdb..#Data_tbl') IS NOT NULL 
    DROP TABLE #Data_tbl 

그런 다음 필요한 두 열만 사용하여 대상 테이블을 만듭니다.

CREATE TABLE #Data_tbl (
     DateID INT IDENTITY(1,1) 
    , [Days] DATE 
) 

그럼 내가 만든 테이블 변수를 만들지 만 열 이름을 변경하여 작업을 덜 복잡하게 만들었습니다. 필자는 생성 된 ID와 삽입 된 날짜 만 캡처하고 있습니다. 삽입 한 날은 나중에 중요하기 때문에 중요합니다.

DECLARE @mappedIDs TABLE (
     InsertedID INT 
    , [Days] DATE 
) 

그런 다음 삽입 할 행을 나타내는 테이블을 설정합니다. 그렇게하면 배치에 둘 이상의 행을 삽입 할 때 일어나는 일을 테스트 할 수 있습니다!

DECLARE @inputTable TABLE (
    FakeID INT 
    , [Days] DATE 
) 

이제 소스에 행을 채우자.

INSERT INTO @inputTable 
VALUES (1, '9/2/2016') 

다음은 삽입 문입니다. 이 예에서는 요일 만 삽입하고 있지만 필요한 경우 더 많이 삽입 할 수 있습니다. 출력 절은 맵을 작성하려고 할 때 동일하게 유지해야하는 중요한 사항입니다. 당신은 목적지 테이블에서 생성 된 DateID와 날짜를 수집해야합니다.

INSERT INTO #Data_tbl 
([Days]) 
OUTPUT inserted.DateID, inserted.[Days] into @mappedIDs(InsertedID, [Days]) 
SELECT Days        
FROM @inputTable source 

이제지도를 보여 드리겠습니다! 나는 (@mappedIDs에) 삽입 된 행을 가져 와서 일 (day)에 내 소스 레코드에 참여시킨다. 이제 FakeID에서 "실제"ID 로의 매핑을 볼 수 있습니다.

SELECT 
    results.InsertedID, src.FakeID, src.[Days] 
FROM @mappedIDs results 
INNER JOIN @inputTable src 
    ON results.[Days] = src.[Days] 
관련 문제