列 生成用于按位比较的标志值

Ωme*_*Man 2 sql-server bitwise-comparison

我们正在创建一个新应用程序,其中使用各种表来保存枚举。由于这些表中的 ID 将用于按位比较,我们希望确保插入的新行将自动使用与“设置”的下一位相对应的十进制数。

例如,如果我们有一个闹钟应用程序,我们可能会包含一个“工作日”表,可以按以下方式使用:

CREATE TABLE dbo.Weekdays
(
    WeekdayID INT NOT NULL 
        CONSTRAINT PK_Weekdays PRIMARY KEY CLUSTERED
    , WeekdayName VARCHAR(20)
);

INSERT INTO dbo.Weekdays
VALUES (1, 'Sunday')
    , (2, 'Monday')
    , (4, 'Tuesday')
    , (8, 'Wednesday')
    , (16, 'Thursday')
    , (32, 'Friday')
    , (64, 'Saturday');

CREATE TABLE dbo.AlarmsDefined
(
    AlarmID INT NOT NULL
        CONSTRAINT PK_AlarmsDefined PRIMARY KEY CLUSTERED
    , Weekdays INT NOT NULL
);

INSERT INTO dbo.AlarmsDefined (AlarmID, Weekdays)
VALUES (1, 50);

SELECT W.WeekdayName
FROM dbo.AlarmsDefined AD
    INNER JOIN dbo.Weekdays W ON (AD.Weekdays & W.WeekdayID) = W.WeekdayID
Run Code Online (Sandbox Code Playgroud)

上面SELECT查询的结果:

在此处输入图片说明

我希望能够在上面的示例中定义 Weekdays 表,这样如果我们向表中添加另一行,下一WeekdayID行将自动设置为 128,这是可用于按位比较的下一个十进制数。

这当然可以通过手动将值放入主键列来完成。

但是有没有办法指定一个自动递增的值来遵守标志值?例如,这些将是生成的唯一 PK 值:

ID
--
1
2
4
8
16
32
...
Run Code Online (Sandbox Code Playgroud)

并且触发器会自动查看最后一个值并生成所需序列中的下一个值?

Mis*_*goo 5

我会使用这样的东西:

CREATE TABLE #test 
(
    id INT IDENTITY(0,1) NOT NULL
    , val AS (POWER(2,id)) PERSISTED
    , CONSTRAINT pk_test PRIMARY KEY
        (
            val
        )
);
GO

INSERT #test DEFAULT VALUES;
GO 15

SELECT * FROM #test;
Run Code Online (Sandbox Code Playgroud)