0

我们的 IS 管理员将 8 个标志,如 '00010000'(只有真假)存储到 SQL Server 为binary(2). 在这种格式中,数据的值类似于“0x1000”。

是否可以将此二进制文件转换回 '00010000' ?

Convert, Cast,Substring不工作。

4

3 回答 3

1

查询返回十六进制数(0x... - 它是十六进制)作为其位掩码

CREATE TABLE #Temp(
    Test    VARBINARY(2)
)

INSERT #Temp
VALUES
    (0x1001),
    (0x3001),
    (0x5000),
    (0x6000),
    (0xf000),
    (0xf250)

SELECT *, REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    CONVERT(VARCHAR(32), Test, 2)
    , '0', '0000')
    , '1', '0001')
    , '2', '0010')
    , '3', '0011')
    , '4', '0100')
    , '5', '0101')
    , '6', '0110')
    , '7', '0111')
    , '8', '1000')
    , '9', '1001')
    , 'a', '1010')
    , 'b', '1011')
    , 'c', '1100')
    , 'd', '1101')
    , 'e', '1110')
    , 'f', '1111')
FROM #Temp

DROP TABLE #Temp
于 2017-01-03T10:19:31.210 回答
0

您的原始数据很可能会丢失。在 SQL 中将数字转换为二进制时,只有有限的“空间”来存储该数据,空间由字段的字节大小决定,在本例中为 2。

将数据保存到数据库时会出现此问题,使用二进制 (2) 意味着数据在保存时被截断,这意味着您至少丢失了数据中的 4 个前“标志”。(二进制数开头的 4 个数字)。

例如,下面显示了 SQL 以二进制 6、4 和 2 存储数字 10010010 的内容。

Binary(6) - 0x00000098BD9A
Binary(4) - 0x0098BD9A
Binary(2) - 0xBD9A

如您所见,使用二进制 2 意味着您丢失了号码中的数据。那已经消失了,并且无法使用 DB 进行检索(除非您保存事务日志,假设您有一个 DBA 使用 binary(2) 字段将布尔值存储为 8 位块,我怀疑您有)。很抱歉这么说,但您根本无法做您需要做的事情,而且无论谁认为使用二进制(2)作为 8 位数字是一个好主意,然后没有测试他们的决定,这都是罪魁祸首。

于 2017-01-03T09:10:13.383 回答
0

是的你可以

BINARY(2)表示 2 个字节,所以 16 位

0x3000 = '0011000000000000'

declare @v int = 0x3000

;WITH
T AS (  SELECT NULL N   UNION ALL   SELECT NULL ),
N as (
    SELECT ROW_NUMBER() OVER (ORDER BY T2.N) N
    FROM T T2, T T4, T T8, T T16
),
V AS (
    select N, POWER(2,N-1) P, CAST(@v as binary(2)) b2, @v V
    from N
),
B AS (
    SELECT N, B2, CAST((V/P) % 2 AS char(1)) B
    from V
)
SELECT B2, [16]+[15]+[14]+[13]+[12]+[11]+[10]+[9]+[8]+[7]+[6]+[5]+[4]+[3]+[2]+[1] BASE2
FROM B
PIVOT ( MIN(B) FOR N IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16]) ) P

输出

B2      BASE2
0x3000  0011000000000000
于 2017-01-03T10:20:58.173 回答