从MERGE查询返回一个OUTPUT结果

时间:2014-02-05 17:32:00

标签: sql sql-server-2008 sql-server-2012

我有一个合并查询,如果没有找到记录,则会更新或插入。在我的结果中,当记录不存在并插入时,我遇到了问题。查询返回'已更新'(为空)和'已插入'(具有正确的值)。

如果没有更新,如何避免返回空的'Updated'?

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 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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