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
많은 감사를
나는 다음과 같은 시도했지만 작동하지 않습니다.
하이 올레 당신이 날 임시 "로 (즉, 병합 후) 출력 결과를 저장하기 위해이 개 임시 테이블을 사용하는 것 같다 준 링크 "테이블을 선택한 다음 추가 선택 로직을 수행합니다. 출력을 사용하여 원하는 테이블을 채우고 원시 데이터가 없지만 함수 호출 (예 : GETDATE())이있는 곳에서 열을 추가 할 수 있습니까? – VasilisP
또한 MERGE가 INSERT 또는 UPDATE를 수행했는지 여부에 따라 OUTPUT을 수정할 수 있습니까? – VasilisP
$ action을 사용하여 결과물의 출처를 확인할 수 있습니다. OUTPUT $ action, deleted. *, inserted. * –