Ω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)
并且触发器会自动查看最后一个值并生成所需序列中的下一个值?
我会使用这样的东西:
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)
| 归档时间: |
|
| 查看次数: |
4107 次 |
| 最近记录: |