【问题标题】:Output Always 1输出总是 1
【发布时间】:2018-12-19 16:55:41
【问题描述】:

我有一个存储过程,并且正在使用 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

【问题讨论】:

  • 你准备好使用合并了吗? There are some things to be aware of 和其他原因,使用 EXISTS 的老式 UPSERT 更容易管理。
  • 我更喜欢使用合并,但我不必 100% 使用它,因为我宁愿做一些事情,也不愿强迫那些狡猾的事情发生
  • 输出为 1 是什么意思?它说插入的FileId1 但实际上是不同的东西?
  • 您是否将 1 传递给该参数?目标表中的FileID 是什么? Identity 列?您是否在运行此代码之前截断此表,如果它是一个身份字段,它将使其始终为 1?
  • 我只能假设您传递了 1,这意味着您不断更新同一行,因此每次输出相同的值

标签: sql sql-server merge


【解决方案1】:

您获得 1 的原因是因为这就是 UPDATEDINSERTED。当它是UPDATED 值时,它就是传递给@FileID 的值。

With the OUTPUT clause:

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

因此,UPDATED(即@FileID)或INSERTED(无论您的FileID 表逻辑是什么)的值都将在您的代码中返回。如果你总是得到 1,那么你必须总是更新 FileID = 1 的列。

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

Check the demo here.

【讨论】:

  • 插入时传入的值为0,我之前没有遇到过,但会将其清空并尝试一下
  • 如果你重复传入相同的值,它将在更新时返回。
  • 表中没有 id 为 0,因此插入时合并永远不会匹配
  • 如果不匹配则插入。
猜你喜欢
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
相关资源
最近更新 更多