Исключение при обновлении строки с помощью 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
колонны.
Вам нужно будет найти другой способ передачи значений таблицы в эту хранимую процедуру для работы.