Исключение при обновлении строки с помощью rowversion?

У меня есть таблица, которая выглядит так:

CREATE TABLE [dbo].[akut_prioritering]
(
    [behandling_id] [int] NOT NULL,
    [akutstatus] [int] NOT NULL,
    [nasta_dag] [bit] NOT NULL,
    [sort_order] [bigint] NOT NULL,
    [rowversion] [timestamp] NOT NULL,

    CONSTRAINT [XPKakut_prioritering] 
        PRIMARY KEY CLUSTERED ([behandling_id] ASC)
) ON [PRIMARY]

И тогда у меня есть эта хранимая процедура, которая пытается обновить строки в этой таблице:

ALTER PROCEDURE [dbo].[akutlistaSave] 
    @behandlingSortOrder dbo.akutlista_sortorder_tabletype READONLY
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @behandlingId INT;
    DECLARE @sortOrder BIGINT;
    DECLARE @rowversion ROWVERSION;

    DECLARE sortOrderCursor CURSOR LOCAL SCROLL STATIC FOR
        SELECT behandling_id, sort_order FROM @behandlingSortOrder

    OPEN sortOrderCursor

    BEGIN TRAN

        FETCH NEXT FROM sortOrderCursor INTO @behandlingId, @sortOrder, @rowversion

        WHILE @@FETCH_STATUS = 0
        BEGIN
            IF EXISTS(SELECT * 
                      FROM akut_prioritering ap 
                      WHERE ap.behandling_id = @behandlingId 
                        AND ap.rowversion = @rowversion)
            BEGIN
                UPDATE akut_prioritering
                SET sort_order = @sortOrder
                WHERE behandling_id = @behandlingId;
            END
            ELSE
            BEGIN
                RAISERROR ('Rowversion not correct.', 16, 1);
            END

            FETCH NEXT FROM sortOrderCursor INTO @behandlingId, @sortOrder, @rowversion
        END

        CLOSE sortOrderCursor

        SELECT 
            ap.behandling_id, ap.rowversion 
        FROM 
            akut_prioritering ap 
        INNER JOIN 
            @behandlingSortOrder bso ON ap.behandling_id = bso.behandling_id;

        DEALLOCATE sortOrderCursor
END

Тип Inparameter выглядит следующим образом:

CREATE TYPE [dbo].[akutlista_sortorder_tabletype] AS TABLE 
            (
                [behandling_id] [int] NULL,
                [sort_order] [bigint] NULL,
                [rowversion] [timestamp] NULL
            )

При запуске этого я получаю SqlException:

Невозможно вставить явное значение в столбец отметки времени. Используйте INSERT со списком столбцов, чтобы исключить столбец отметки времени, или вставьте DEFAULT в столбец отметки времени.

Из того, что я понимаю rowversion Столбец должен быть обновлен с новым значением автоматически, в моем случае нет причин устанавливать его вручную.

2 ответа

Решение

Вы не можете установить rowversion значение в dbo.akutlista_sortorder_tabletype потому что он не обновляется: он генерируется автоматически

Тем не мение, rowversion (он же устарел timestamp) - это просто (var) двоичный файл (8) с некоторыми специальными правилами. Вы можете определить и установить двоичный (VAR) (8) в dbo.akutlista_sortorder_tabletype и сравните по этому в ОБНОВЛЕНИИ

С первой ссылки

Необнуляемый столбец обращения строк семантически эквивалентен двоичному столбцу (8). Обнуляемый столбец версии строки семантически эквивалентен столбцу varbinary (8).

Похоже, вы пытаетесь insert timestamp значение в пользовательском типе таблицы, а затем передать его в хранимую процедуру. Как показывает ваша ошибка, вы не можете insert явный timestamp значения в timestamp колонны.

Вам нужно будет найти другой способ передачи значений таблицы в эту хранимую процедуру для работы.

Другие вопросы по тегам