2013-05-14 3 views
0

MS SQL Server에서 다음과 같은 MERGE 연산을 수행합니다.병합 후 삽입 또는 업데이트

DECLARE @data as xml 
DECLARE @id as int 
DECLARE @version as rowversion 
SET @data = ? 
SET @id = ? 
<# if (tw.local.enableOptimisticLocking == true) { #> 
SET @version = CAST(? as rowversion) 
<# } #> 
MERGE [<#=tw.local.dbSchema#>].[<#=tw.local.tableName#>] AS target 
USING (Select @id as id, @version version) as source ON target.id = source.id 
WHEN MATCHED <# if (tw.local.enableOptimisticLocking == true) { #> AND target.version = source.version <# } #> THEN 
    UPDATE SET data = @data 
WHEN NOT MATCHED THEN 
    INSERT (data) VALUES (@data) 
OUTPUT $action as _action<# if (tw.local.enableOptimisticLocking == true) { #>, CAST(inserted.version as BigInt) as [version]<# } #>, inserted.id; 

나는 위의 MERGE의 결과에 따라 일부 열을 업데이트 할 INSERT/UPDATE의 다른 DB에 문 및 테이블을 가지고 싶습니다.

머지 안에 다른 INSERT/UPDATE를 할 수 있는지 또는 출력을 사용하여 병합에서 INSERT/UPDATE 할 모든 데이터를 가져와야하는지 잘 모르겠습니다. 귀하의 시간과 도움을 사전에 ....

DECLARE @data as xml 
DECLARE @id as int 
DECLARE @version as rowversion 
SET @data = ? 
SET @id = ? 
<# if (tw.local.enableOptimisticLocking == true) { #> 
SET @version = CAST(? as rowversion) 
<# } #> 
MERGE [<#=tw.local.dbSchema#>].[<#=tw.local.tableName#>] AS target 
USING (Select @id as id, @version version) as source ON target.id = source.id 
WHEN MATCHED <# if (tw.local.enableOptimisticLocking == true) { #> AND target.version = source.version <# } #> THEN 
    UPDATE SET data = @data 
WHEN NOT MATCHED THEN 
    INSERT (data) VALUES (@data) 
OUTPUT $action as _action<# if (tw.local.enableOptimisticLocking == true) { #>, CAST(inserted.version as BigInt) as [version]<# } #>, inserted.id, inserted.version, inserted.data; 

IF EXISTS (SELECT INSERTED.* FROM INSERTED LEFT JOIN DELETED ON INSERTED.ID = DELETED.id WHERE DELETED.ID IS NULL) 
    BEGIN 
     INSERT INTO [EMEAworkflowBPM].[cmf].[BusinessContextReporting] (id, version, data, updatedOn, toProcess) 
     SELECT i.id, i.version, i.data, GETDATE(), 1 
     FROM Inserted i 
     LEFT JOIN [EMEAworkflowBPM].[cmf].[BusinessContextReporting] bcr 
     ON i.id = bcr.id AND i.version = bcr.version 
     WHERE bcr.id IS NULL; 
    END 
ELSE IF EXISTS (SELECT INSERTED.* FROM INSERTED INNER JOIN DELETED ON INSERTED.ID = DELETED.ID) 
    BEGIN 
     UPDATE [EMEAworkflowBPM].[cmf].[BusinessContextReporting] 
     SET version = i.version, data = i.data, updatedOn = GETDATE(), toProcess = 1 
      FROM Inserted AS i 
      LEFT JOIN [EMEAworkflowBPM].[cmf].[BusinessContextReporting] AS bcr 
      ON i.id = bcr.id; 
    END 

많은 감사를

나는 다음과 같은 시도했지만 작동하지 않습니다.

답변

1

OUTPUT을 INTO 절과 결합하여 MERGE 다음에 나오는 UPDATE 및 INSERT를 새로운 명령문으로 사용해야합니다.

이 질문에 허용 대답을 살펴보십시오 :

Using merge..output to get mapping between source.id and target.id

+0

하이 올레 당신이 날 임시 "로 (즉, 병합 후) 출력 결과를 저장하기 위해이 개 임시 테이블을 사용하는 것 같다 준 링크 "테이블을 선택한 다음 추가 선택 로직을 수행합니다. 출력을 사용하여 원하는 테이블을 채우고 원시 데이터가 없지만 함수 호출 (예 : GETDATE())이있는 곳에서 열을 추가 할 수 있습니까? – VasilisP

+0

또한 MERGE가 INSERT 또는 UPDATE를 수행했는지 여부에 따라 OUTPUT을 수정할 수 있습니까? – VasilisP

+0

$ action을 사용하여 결과물의 출처를 확인할 수 있습니다. OUTPUT $ action, deleted. *, inserted. * –

관련 문제