【发布时间】: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 是什么意思?它说插入的
FileId是1但实际上是不同的东西? -
您是否将 1 传递给该参数?目标表中的
FileID是什么?Identity列?您是否在运行此代码之前截断此表,如果它是一个身份字段,它将使其始终为 1? -
我只能假设您传递了 1,这意味着您不断更新同一行,因此每次输出相同的值
标签: sql sql-server merge