关于下一键定义
下一键功能可让长时间运行的处理获取列条目的下一个值,使用或不使用前缀,且不会阻碍正在执行相同操作的其他处理。这类存储过程调用可以使用“应用程序架构列元数据”表单的“生成器”字段设置。
下一键定义的工作原理
下一键调用的根存储过程如下所示:
EXEC @Severity = dbo.Next2SubKeySp
@TableName = @TableName
, @ColumnName = @ColumnName
, @Prefix = @Prefix
, @KeyLength = @KeyLength
, @SubKey = @SubKey
, @Increment = @Increment
, @KeyVal = @KeyVal OUTPUT
, @Infobar = @Infobar OUTPUT
例如:应用程序代码可能包含“客户订单号”列,该列可能使用或可能不使用前缀。因此,前缀为“TG”的客户订单号可能是 TG00000109,而不使用任何前缀的客户订单号可能是 0000000547。
如果存在两个处理,则同时调用 CustomerOrder 表的 Next2SubKeySp 代码和 CoNum 列,请求前缀 TG 的下一键,处理将从 NextKeys 表获取下两个值(TG00000110 和 TG00000111)。不会存在阻塞且两个值都将存储在 NextKeys 表中。
同步下一键值需要系统返回到基本表以确定每个前缀的当前高值。这是下一键定义发挥作用的位置。这些定义包含元数据,用于指明具有下一键关联的表和列。
关于主要和次要规范
在某些情况下,用户可能具有包括与其他表相同的下一键关联的存档表。例如,用户可能具有名为 CustomerOrderHistory 的表,其中保存了从 CustomerOrder 表存档的历史数据。那么,CustomerOrder 表将视为“主”表。CustomerOrderHistory 表将视为“辅助”表,在同步下一键时,也需要检查该表,因为两者中的任何一个表都可能包含当前最大键值。
关于子键
子键列允许根据其他列的值对下一键进行分组。
例如,“InteractionID”基于“DayOfInteraction”子键列可能存储在 DailyInteraction 表中。在此情况下,需要将“InteractionID”以 1 开始并随每个额外条目递增,但仅适用于指定的“DayOfInteraction”值。要查看指定日期的当前最大值,则将更改下一键请求中的子键值。
DayOfInteraction | InteractionID |
---|---|
07/04/1776 | 1 |
07/04/1776 | 2 |
07/04/1776 | 3 |
07/05/1776 | 1 |
07/05/1776 | 2 |
在此情况下,下一键同步将查看 DailyInteraction 表,并确定每个“DayOfInteraction”值的当前最大“InteractionID”。在本例中,有两组值:07/04/1776, 3 和 07/05/1776, 2。这些值将插入 NextKeys 表,以便可以正确处理该表和列的下一键处理。
关于主表和主要列
“主表”和“主要列”选项仅用于子键处理的只有整数的特殊情况。下一键通常基于字符,但在特定情况下,下一键基于整数且子键列在单独的表中定义。
例如,假设日记帐表包含“BatchID”列和“顺序”列,而“顺序”列基于整数。在此情况下,必须定义包含“BatchID”值(即子键值)列表的单独表。非主子键数据总是基于字符,而主子键数据总是基于整数。