私たちの IS の管理者は、'00010000' のような 8 つのフラグ (true と false のみ) を として SQL Server に保存しましbinary(2)
た。この形式のデータには、「0x1000」のような値があります。
このバイナリを '00010000' に戻すことはできますか?
Convert
、Cast
、Substring
動作しません。
私たちの IS の管理者は、'00010000' のような 8 つのフラグ (true と false のみ) を として SQL Server に保存しましbinary(2)
た。この形式のデータには、「0x1000」のような値があります。
このバイナリを '00010000' に戻すことはできますか?
Convert
、Cast
、Substring
動作しません。
クエリは、ビット マスクとして 16 進数 (0x... - 16 進数) を返します。
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
はい、できます
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