ISの管理者は、SQL Serverに「00010000」(真と偽のみ)などの8つのフラグをとして格納します。この形式では、データは '0x1000'のような値を持ちます。SQL Server:バイナリをintに変換する方法
このバイナリを '00010000'に変換することはできますか?
Convert
Cast
Substring
は機能しません。
ISの管理者は、SQL Serverに「00010000」(真と偽のみ)などの8つのフラグをとして格納します。この形式では、データは '0x1000'のような値を持ちます。SQL Server:バイナリをintに変換する方法
このバイナリを '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
元のデータは失われている可能性が最も高いです。 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)を使用することは良いアイデアだと思って、その責任を負うという決定をテストしませんでした。
私はあなたのサンプル '10010010'をテストするとき結果 '0x9200'が表示される場合、sqlに挿入する前にsometingsをコード化する必要がありますか?それはなぜ彼らが元の「配列」にデータを回復できるかを説明するでしょう。 –
保存された値をオリジナルの8桁の値に100%成功させたプログラムがあれば、入力とデータベースの間に翻訳レイヤーがなければなりません。 – Kamikazi
をマスクとして、はい、
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
'0x1000'は実際に '00010000'と同じ値ですか? – jarlh
はい。私がIS '00010000'からの値を持つとき、SQLの値は '0x1000'です。しかし、例えば '00110000'の場合、値は '0x3000'です。 –