Выход всегда 1 - PullRequest
       13

Выход всегда 1

0 голосов
/ 19 декабря 2018

У меня есть хранимая процедура, и я использую оператор слияния для вставки и обновления.Этот аспект работает так, как мне нужно.

Однако вывод при вставке записи всегда равен 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 голосов
/ 19 декабря 2018

Причина, по которой вы получаете 1, в том, что это то, что есть UPDATED или INSERTED.Когда это значение UPDATED, то это значение переходит в @FileID.

С предложением OUTPUT :

INSERTED - префикс столбца, который указывает значение, добавленное операцией вставки или обновления .

Таким образом, любое значение, равное UPDATED (что составляет @FileID) или INSERTED (которое будет соответствовать вашей логике таблицы FileID), будет возвращено в вашем коде.,Если вы всегда получаете 1, то вы должны всегда обновлять столбец для FileID = 1.

Если вы измените свое значение на inserted.*, вы увидите это, как если бы OUTPUT обновил строку.

Проверьте демо здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...