根据以下链接: 按位运算符(Transact-SQL), 我们可以在二进制与int,smallint,tinyint或反之亦然之间进行按位运算。
但是,如何在两个二进制类型之间的SQL Server中进行按位异或运算呢?还是如果不可能,如何将二进制/ varbinary拆分为单个字节?
我要求这样做的原因是因为我需要对大于max int值的两个数字进行异或运算。谢谢。
代码块中的所有注释
-- variables declare @vb1 binary(16), @vb2 binary(16), @lo binary(8), @hi binary(8) -- 2 guids to compare declare @guid1 uniqueidentifier set @guid1 = '96B4316D-1EA7-4CA3-8D50-FEE8047C1329' declare @guid2 uniqueidentifier set @guid2 = 'FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF' -- split every 8 bytes into a binary(8), which is a bigint, the largest size usable with XOR select @vb1 = @guid1, @vb2 = @guid2 -- xor the high and low parts separately select @hi = convert(binary(8), substring(@vb1,1,8)) ^ convert(bigint, substring(@vb2,1,8)) select @lo = convert(binary(8), substring(@vb1,9,8)) ^ convert(bigint, substring(@vb2,9,8)) -- the final result, concatenating the bytes using char(8) - binary -> uniqueidentifier select 'A', @guid1 union all select 'B', @guid2 union all select 'A XOR B = ', convert(uniqueidentifier, convert(binary(16),convert(char(8),@hi) + convert(char(8),@lo)))