Установка значения столбца в SQL Server на основе scope_identity () вставки - PullRequest
1 голос
/ 16 мая 2019

У меня есть хранимая процедура в программе, которая работает неправильно.Его усеченная версия следует.Таблица MyQuotes имеет столбец IDENTITY с именем QuoteId.

CREATE PROCEDURE InsertQuote 
    (@BinderNumber VARCHAR(50) = NULL,
     @OtherValue VARCHAR(50))
AS
    INSERT INTO MyQuotes (BinderNumber, OtherValue) 
    VALUES (@BinderNumber, @OtherValue);

    DECLARE @QuoteId INT 
    SELECT @QuoteId = CONVERT(INT, SCOPE_IDENTITY());

    IF @BinderNumber IS NULL 
        UPDATE MyQuotes 
        SET BinderNumber = 'ABC' + CONVERT(VARCHAR(10),@QuoteId)
        WHERE QuoteId = @QuoteId;

        SELECT @QuoteId AS QuoteId;

Мне кажется, что раздел, в котором мы получаем номер связующего из scope_identity(), можно сделать намного, намного чище.И я думаю, что мы должны были делать это в коде C #, а не в SQL, но, поскольку этот кубик брошен, я хотел получить больше изученных мнений, чем мое собственное, о том, как вы измените этот запрос, чтобы заполнить это значение.

Ответы [ 2 ]

3 голосов
/ 16 мая 2019
  1. В следующем обновлении не требуется идентификатор:
    UPDATE MyQuotes SET
      BinderNumber = 'ABC' + CONVERT(VARCHAR(10), QuoteId)
    WHERE BinderNumber is null;
Если требуется выбрать QuoteId в качестве запроса на возврат, тогда использование scope_identity() так же хорошо, как и любое другое.
1 голос
/ 16 мая 2019

Ответ Дейла лучше, но это также может быть полезно:

DECLARE @Output TABLE (ID INT);
INSERT INTO MyQuotes (BinderNumber, OtherValue) VALUES (@BinderNumber, @OtherValue)  OUTPUT inserted.ID INTO @Output (ID);
UPDATE q SET q.BinderNumber = 'ABC' + CONVERT(VARCHAR(10),o.ID)
FROM MyQuotes q
INNER JOIN @Output o ON o.ID = q.ID
;

Также, если BinderNumber всегда связан с ID, было бы лучше просто создать вычисляемый столбец

AS 'ABC' + CONVERT(VARCHAR(10),ID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...