1

使用 SQL Server 2008。

假设我有 3 个数字要存储。

  • 第一个数字是任何 6 位数字
  • 二是任意4bit
  • 第三也是任何6位数字

例如:

declare @firstNumber_6bit  tinyint = 50
declare @secondNumber_4bit tinyint = 7
declare @thirdNumber_6bit  tinyint = 63

我需要将这 3 个数字存储在2 byte binary(16 位)变量中。因此,该示例的二进制值为:

  • 50 是110010
  • 7 是0111
  • 63 是111111
  • 要存储的 2 个字节是11001001 11111111

因此,以下任一行都应存储这些值:

declare @my3NumbersIn2Bytes binary(2) = 51711

或者

declare @my3NumbersIn2Bytes binary(2) = 0xC9FF

(对不起,如果我在大/小端弄乱了字节顺序,但这不是重点)。

使用 .net CLR 存储和检索这些数字是一项微不足道的任务,但我试图在纯 T-SQL 中解决这个问题,我们知道bit shiftingSQL Server 中没有。我看到了很多使用内存表来解决此类问题的示例,但是对于进行简单的位移位来说,这似乎完全是多余的……我在想更像substringfor bits 的东西可以解决问题。我只是想确定在过度杀伤之前没有其他方法可以解决这个问题。

所以我的问题是,存储这 3 个数字并恢复它们的最有效方法是什么?

谢谢。-

4

1 回答 1

2
declare @firstNumber_6bit  tinyint = 50
declare @secondNumber_4bit tinyint = 7
declare @thirdNumber_6bit  tinyint = 63

declare @my3NumbersIn2Bytes binary(2)

select @my3NumbersIn2Bytes = @firstNumber_6bit*1024 + @secondNumber_4bit *64 + @thirdNumber_6bit
--extract values
select @firstNumber_6bit = @my3NumbersIn2Bytes/1024
select @secondNumber_4bit = (@my3NumbersIn2Bytes%1024)/64
select @thirdNumber_6bit = (@my3NumbersIn2Bytes%1024)%64

select convert(varchar(max), @my3NumbersIn2Bytes, 1) -- just for display
, @firstNumber_6bit
, @secondNumber_4bit
, @thirdNumber_6bit

SQL 小提琴演示

于 2013-02-15T04:57:24.033 回答