2017-01-03 28 views
0

ISの管理者は、SQL Serverに「00010000」(真と偽のみ)などの8つのフラグを​​として格納します。この形式では、データは '0x1000'のような値を持ちます。SQL Server:バイナリをintに変換する方法

このバイナリを '00010000'に変換することはできますか?

ConvertCastSubstringは機能しません。

+0

'0x1000'は実際に '00010000'と同じ値ですか? – jarlh

+0

はい。私がIS '00010000'からの値を持つとき、SQLの値は '0x1000'です。しかし、例えば '00110000'の場合、値は '0x3000'です。 –

答えて

0

クエリは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 
0

元のデータは失われている可能性が最も高いです。 SQLで数値をバイナリに変換すると、そのデータを格納するためのスペースが限られているだけで、スペースはこのフィールドのバイトサイズ(この場合は2)によって決まります。

この問題は、データはデータベースに保存されます。バイナリ(2)を使用すると、保存時にデータが切り捨てられます。つまり、データの最初の4つの "フラグ"が失われたことを意味します。 (バイナリ番号の先頭にある4つの数字)。

は、例えば、以下に番号10010010のためのどのようなSQLストアを示しバイナリ6、4、

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

2.あなたは2があなたの番号からのデータを失うことを意味し、バイナリ使用して見ることができるように。 DBAがバイナリ(2)フィールドを使用してブール値を8ビットブロックとして格納しているとすれば、トランザクションログを保存しない限り、DBを使用して取得することはできません)。申し訳ありませんが、あなたが必要とすることはできません.8桁の数字に対してバイナリ(2)を使用することは良いアイデアだと思って、その責任を負うという決定をテストしませんでした。

+0

私はあなたのサンプル '10010010'をテストするとき結果 '0x9200'が表示される場合、sqlに挿入する前にsometingsをコード化する必要がありますか?それはなぜ彼らが元の「配列」にデータを回復できるかを説明するでしょう。 –

+0

保存された値をオリジナルの8桁の値に100%成功させたプログラムがあれば、入力とデータベースの間に翻訳レイヤーがなければなりません。 – Kamikazi

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 
関連する問題