对于某些特定数据类型,是否有任何可能'cyclic arithmetic operation'的想法?



在基于整数的数据类型中,如tinybit,smallbit,bigint,int,uint...有时,当结果超出该数据类型的范围时,可能会发现算术溢出。

我使用的表达式,"循环算术运算",意思是,(-1( 2 -> 1 -> 0 -> 255 -> 254 ...(微小(或(+2( 65533 -> 65535 -> 1 -> 3 ...(小位(等。。

换句话说,我希望 0 - 1 = 255 在微小列中。

我知道这有点尴尬,每个人都避免了这种情况,但有没有人对此有解决方案?我问的原因不仅是为了避免算术溢出,而且是实际需要。因此,"考虑扩展或更改列数据类型!"不适合我的情况。

应用位掩码似乎是执行此操作的最直接方法:

SELECT -10 & 255; -- Results in 246
SELECT 513 & 255; -- Results in 1

https://learn.microsoft.com/en-us/sql/t-sql/language-elements/bitwise-operators-transact-sql

SQL Server确实有一个模运算符%,这可能在这里有所帮助。使用它,您可以执行以下操作:

DECLARE @inputValue INT = -1;
DECLARE @outputValue TINYINT;
DECLARE @minValue INT = 0;
DECLARE @maxValue INT = 255;
DECLARE @maxValues INT = 256;
SELECT @outputValue =
    CASE
        WHEN @inputValue < @minValue THEN @inputValue % @maxValues + @maxValues
        ELSE @inputValue % @maxValues
    END;
SELECT @outputValue; -- Results in 255

https://learn.microsoft.com/en-us/sql/t-sql/language-elements/modulo-transact-sql

最新更新