2014-02-05 4 views
0

레코드가 발견되지 않으면 업데이트 또는 삽입하는 병합 쿼리가 있습니다. 내 결과에서 레코드가 존재하지 않고 삽입 될 때 문제가 발생합니다. 쿼리는 모두 '업데이트 됨'(빈 상태)과 '삽입 됨'(적절한 값 포함)을 반환합니다.MERGE 쿼리에서 하나의 OUTPUT 결과를 반환합니다.

아이디어가 없으면 업데이트가없는 경우 비어있는 '업데이트 됨'을 반환 하시겠습니까?

ALTER PROCEDURE [dbo].[spInsOrUpdApplicant] 
    -- Add the parameters for the stored procedure here 
    @Name nvarchar(50), 
    @Surname nvarchar(50), 
    @Position nvarchar(50), 
    @NationalID int, 
    @ApplicantID int 

AS 
BEGIN 
    SET NOCOUNT ON; 
-- Update the row if it exists.  
    UPDATE tbApplicant 
    SET Name = @Name, Surname = @Surname, Position = @Position, NationalID = @NationalID 

     OUTPUT INSERTED.ApplicantID AS 'Result' 

    WHERE ApplicantID = @ApplicantID; 

-- Insert the row if the UPDATE statement failed. 
    IF (@@ROWCOUNT = 0) 
    BEGIN 
     INSERT INTO tbApplicant (Name, Surname, Position, NationalID) 
     OUTPUT INSERTED.ApplicantID AS 'Result' 
     VALUES (@Name, @Surname, @Position, @NationalID) 
    END 

END; 

답변

2

'출력'은 실제 행이 업데이트되지 않은 경우에도 항상 발생합니다. 트리거에서 동일한 동작을 볼 수 있습니다. 다음 작업을 수행하는 것이 좋습니다.

ALTER PROCEDURE [dbo].[spInsOrUpdApplicant] 
    -- Add the parameters for the stored procedure here 
    @Name nvarchar(50), 
    @Surname nvarchar(50), 
    @Position nvarchar(50), 
    @NationalID int, 
    @ApplicantID int 

AS 
BEGIN 
    SET NOCOUNT ON; 
-- Check if the row exists.  
    IF EXISTS (SELECT 1 FROM tbApplicant WHERE ApplicantID = @ApplicantID) BEGIN 
-- update if the row exists.  
     UPDATE tbApplicant 
     SET Name = @Name, Surname = @Surname, Position = @Position, NationalID = @NationalID 
     OUTPUT INSERTED.ApplicantID AS 'Result' 
     WHERE ApplicantID = @ApplicantID; 
    END 
    ELSE BEGIN 
-- Else Insert. 
     INSERT INTO tbApplicant (Name, Surname, Position, NationalID) 
     OUTPUT INSERTED.ApplicantID AS 'Result' 
     VALUES (@Name, @Surname, @Position, @NationalID) 
    END 

END; 
0

나는 아주 비슷한 것을합니다.

DECLARE @mergeResults TABLE (mergeAction varchar(10), tableName varchar(50)); 
OUTPUT $action, 'Table Name' INTO @mergeResults; 

당신이 당신이 보는 것을 기준으로 데이터를 이동하는 방법을 결정하고 테이블 변수에 삽입 할 수 있습니다 : 내 저장 프로 시저 내부

,이 있나요?

병합 쿼리가 있지만 병합을 사용하고 있지 않다는 것을 언급했는데 더 많은 "upsert"를 사용하고 있습니다.

병합 T-SQL : http://msdn.microsoft.com/en-us/library/bb510625.aspx

관련 문제