我有一个看起来像这样的表:
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
参数类型如下所示:
CREATE TYPE [dbo].[akutlista_sortorder_tabletype] AS TABLE
(
[behandling_id] [int] NULL,
[sort_order] [bigint] NULL,
[rowversion] [timestamp] NULL
)
运行时,我得到SqlException
:
无法将显式值插入时间戳列。将INSERT与列列表一起使用以排除时间戳列,或将DEFAULT插入时间戳列。
根据我的理解,rowversion
列应自动更新为新值,我的理由没有理由将其设置为手动。
答案 0 :(得分:3)
您无法在dbo.akutlista_sortorder_tabletype
中设置rowversion
值,因为它不可更新:它是自动生成的
但是,rowversion
(a.k.a弃用timestamp
)只是一个(var)二进制(8),带有一些特殊规则。您可以在dbo.akutlista_sortorder_tabletype
中定义和设置(var)二进制(8),并在UPDATE中对其进行比较
从第一个链接
不可空的rowversion列在语义上等同于二进制(8)列。可空的rowversion列在语义上等同于varbinary(8)列。
答案 1 :(得分:0)
您似乎在自定义表类型中尝试insert
timestamp
值,然后将其传递给存储过程。如您的错误所示,您无法将insert
显式timestamp
值放入timestamp
列。
您需要找到一种将表值传递给此存储过程的不同方法。