问题描述
|
假设我要创建一个包含一些列的表,这些列要包含64位无符号整数。我可以采用几种不同的方法,其中一些可能无效或有后果:
使用``0''并添加一个检查约束,以确保该值不为负且在64位无符号整数的范围内(即> = 0和<18,446,744,073,709,551,616)。此外,可以将检查约束的逻辑封装在UDF中,以避免冗余。
创建一个CLR用户定义类型来封装此逻辑(并最终包装System.UInt64)。将该类型用于列类型和存储过程参数。这样的类型会给我更大的功能吗(例如,通过防止将无效值传递到调用站点的存储过程中)?
重用BCL System.UInt64类型。甚至有可能吗?
我正在寻找一个在sqlCLR的功能/集成方面有丰富知识的人员来评估我的想法,并就最佳行动方案发表意见。
谢谢
解决方法
使用numeric(20,0)和检查约束来限制
0 <= x <= 18446744073709551615
(在编辑时固定)
SQL Server没有无符号的64,而是整数,因此您必须在客户端中做一些逻辑才能使其显示为整数而不是十进制
需要检查上限,因为19E18比无符号64多,但对于numeric(20,0)可以。如果DB值在客户端中溢出和中断,则可能不希望这样做。
如果您决定需要额外的零,可以更改为numeric (23,0)
或更高。