始终输出1

时间:2018-12-19 16:55:42

标签: sql sql-server merge

我有一个存储过程,正在使用Merge语句进行插入和更新。这方面是我需要的。

但是,插入记录时的输出始终为1,我看不出为什么?如果有人可以复查此程序并让我知道我可能做错了,我将不胜感激。

CREATE PROCEDURE [dbo].[FileAdd]

@FileId int, 
@FileData varbinary(max), 
@ContentType Varchar(100),
@OperatorId int

AS
BEGIN
--In Memory Table to 
DECLARE @MergeOutput TABLE
(
  Id INT
);

--Merge needs a table to Merge with so using a CTE
WITH CTE AS (
SELECT @FileId as FileId)

--Merge
MERGE INTO [dbo].[Files] as T
USING CTE AS S
ON T.FileId = S.FileId
WHEN NOT MATCHED THEN 
    INSERT (
    FileData,
    ContentType,
    OperatorIdCreated, 
    OperatorIdUpdated
    ) 
    VALUES(
    @FileData,
    @ContentType,
    @OperatorId, 
    @OperatorId
    )
WHEN MATCHED THEN 
    UPDATE SET 
    FileData = @FileData, 
    ContentType= @ContentType,
    OperatorIdUpdated = @OperatorId, 
    Updated = GetDate()

OUTPUT
INSERTED.FileId
INTO @MergeOutput;

SELECT * FROM @MergeOutput;
END
GO

1 个答案:

答案 0 :(得分:2)

您获得1的原因是因为这就是UPDATEDINSERTED。当它是UPDATED的值时,则该值将传递到@FileID中。

With the OUTPUT clause

  

INSERTED是列前缀,用于指定由   插入或更新操作。

因此,无论值是UPDATED(即@FileID)还是INSERTED(即您的FileID表逻辑是什么),它将在您的计算机中返回码。如果您始终获得1,那么您必须始终更新FileID = 1的列。

将底部更改为inserted.*会向您显示,就像OUTPUT会更新行一样。

Check the demo here.