我有一个合并查询,如果没有找到记录,则会更新或插入。在我的结果中,当记录不存在并插入时,我遇到了问题。查询返回'已更新'(为空)和'已插入'(具有正确的值)。
如果没有更新,如何避免返回空的'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;
答案 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