使用rowversion更新行时出现异常?

时间:2017-07-14 09:34:38

标签: sql-server 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

参数类型如下所示:

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

运行时,我得到SqlException

  

无法将显式值插入时间戳列。将INSERT与列列表一起使用以排除时间戳列,或将DEFAULT插入时间戳列。

根据我的理解,rowversion列应自动更新为新值,我的理由没有理由将其设置为手动。

2 个答案:

答案 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列。

您需要找到一种将表值传递给此存储过程的不同方法。

相关问题