そのため、Sybaseでこのクエリが機能しています(signal_data
は列です)が、Microsoft SQL Serverでは機能しません。
HEXTOINT(SUBSTRING((INTTOHEX(signal_data)),5,2)) as Signal
Excelにもあります(A1
には値が含まれています)。
=HEX2DEC(LEFT(DEC2HEX(A1),LEN(DEC2HEX(A1))-2))
誰も私がSQL Serverでこれをどのように行うか知っていますか?
INTを16進数に変換します。
SELECT CONVERT(VARBINARY(8), 16777215)
16進数をINTに変換:
SELECT CONVERT(INT, 0xFFFFFF)
上記の例には、HEX値が整数リテラルとして指定されている場合にのみ機能するという制限があります。完全を期すために、変換する値が16進文字列(varchar列にあるなど)の場合は、次を使用します。
-- If the '0x' marker is present:
SELECT CONVERT(INT, CONVERT(VARBINARY, '0x1FFFFF', 1))
-- If the '0x' marker is NOT present:
SELECT CONVERT(INT, CONVERT(VARBINARY, '1FFFFF', 2))
注:文字列には、偶数の16進数が含まれている必要があります。奇数の桁はエラーになります。
詳細については、 CASTおよびCONVERT(Transact-SQL) の「Binary Styles」セクションを参照してください。 SQL Server 2008以降が必要だと思います。
実際、組み込み関数の名前はmaster.dbo.fn_varbintohexstrです。
したがって、たとえば:
SELECT 100, master.dbo.fn_varbintohexstr(100)
あなたにあげる
100 0x00000064
Excelの文字列ベースのDEC2HEX、HEX2DEC関数に相当するSQL Server:
--Convert INT to hex string:
PRINT CONVERT(VARCHAR(8),CONVERT(VARBINARY(4), 16777215),2) --DEC2HEX
--Convert hex string to INT:
PRINT CONVERT(INT,CONVERT(VARBINARY(4),'00FFFFFF',2)) --HEX2DEC
Intを16進数に変換します。
SELECT FORMAT(512+255,'X')
SQL Server 2012以降で利用可能なFORMAT関数を使用することができます
select FORMAT(10,'x2')
結果:
0a
従来の4ビットの16進数はかなり直接的なものです。 16進文字列から整数(値はFHexStringというフィールドに格納されていると仮定):
CONVERT(BIGINT,CONVERT(varbinary(4),
(SELECT master.dbo.fn_cdc_hexstrtobin(
LEFT(FMEID_ESN,8)
))
))
整数から16進数文字列(値はFIntegerというフィールドに格納されていると仮定):
(SELECT master.dbo.fn_varbintohexstr(CONVERT(varbinary,CONVERT(int,
FInteger
))))
特にIntelマシン上でレジスタ共有を引き起こすビットサイズを使用し始めると、Intelのリトルエンディアンの性質により、レジスタのHighとLow、LeftとRightsが入れ替わることに注意することが重要です。たとえば、varbinary(3)を使用する場合、6文字の16進数について話します。この場合、ビットは右から左への次のインデックス「54,32,10」としてペアリングされます。インテルシステムでは、「76,54,32,10」が期待されます。 8つのうち6つしか使用していないため、自分でスワップを行うことを忘れないでください。 「76,54」が左に、「32,10」が右になります。コンマは高値と安値を区切ります。 Intelは高値と安値、次に左と右を入れ替えます。したがって、変換を行うには...ため息をつくために、たとえば、8文字の16進数の最初の6桁を変換します。
(SELECT master.dbo.fn_replvarbintoint(
CONVERT(varbinary(3),(SELECT master.dbo.fn_cdc_hexstrtobin(
--intel processors, registers are switched, so reverse them
----second half
RIGHT(FHex8,2)+ --0,1 (0 indexed)
LEFT(RIGHT(FHex8,4),2)+ -- 2,3 (oindex)
--first half
LEFT(RIGHT(FHex8,6),2) --4,5
)))
))
少し複雑なので、8文字の16進数(varbinary(4))への変換を維持しようとします。
要約すると、これはあなたの質問に答えるはずです。包括的に。
以下は、整数値をvarcharとしての16進表現に変換するSQLサーバーの関数です。他のデータベースタイプに簡単に適応できる必要があります
例えば:
SELECT dbo.ToHex(4095) --> FFF
SQL:
CREATE FUNCTION ToHex(@value int)
RETURNS varchar(50)
AS
BEGIN
DECLARE @seq char(16)
DECLARE @result varchar(50)
DECLARE @digit char(1)
SET @seq = '0123456789ABCDEF'
SET @result = SUBSTRING(@seq, (@value%16)+1, 1)
WHILE @value > 0
BEGIN
SET @digit = SUBSTRING(@seq, ((@value/16)%16)+1, 1)
SET @value = @value/16
IF @value <> 0 SET @result = @digit + @result
END
RETURN @result
END
GO
master.dbo.fnbintohexstr(16777215)
を使用して、varchar
表現に変換します。
Declare @Dato xml
Set @Dato = Convert(xml, '<dato>FF</dato>')
Select Cast( rw.value( 'xs:hexBinary( text()[1])' , 'varbinary(max)' ) as int ) From @Dato.nodes('dato') as T(rw)
Maksym Kozlenkoの答えはニースであり、数値を任意のコード形式にエンコードするために少し変更することができます。例えば:
CREATE FUNCTION [dbo].[IntToAlpha](@Value int)
RETURNS varchar(30)
AS
BEGIN
DECLARE @CodeChars varchar(100)
SET @CodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
DECLARE @CodeLength int = 26
DECLARE @Result varchar(30) = ''
DECLARE @Digit char(1)
SET @Result = SUBSTRING(@CodeChars, (@Value % @CodeLength) + 1, 1)
WHILE @Value > 0
BEGIN
SET @Digit = SUBSTRING(@CodeChars, ((@Value / @CodeLength) % @CodeLength) + 1, 1)
SET @Value = @Value / @CodeLength
IF @Value <> 0 SET @Result = @Digit + @Result
END
RETURN @Result
END
したがって、1億5000万のような大きな数字は6文字のみになります(150,000,000 = "MQGJMU")
暗号化デバイスとして、異なるシーケンスで異なる文字を使用することもできます。または、コード文字と文字の長さを渡し、暗号化のソルティング方法として使用します。
そしてその逆:
CREATE FUNCTION [dbo].[AlphaToInt](@Value varchar(7))
RETURNS int
AS
BEGIN
DECLARE @CodeChars varchar(100)
SET @CodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
DECLARE @CodeLength int = 26
DECLARE @Digit char(1)
DECLARE @Result int = 0
DECLARE @DigitValue int
DECLARE @Index int = 0
DECLARE @Reverse varchar(7)
SET @Reverse = REVERSE(@Value)
WHILE @Index < LEN(@Value)
BEGIN
SET @Digit = SUBSTRING(@Reverse, @Index + 1, 1)
SET @DigitValue = (CHARINDEX(@Digit, @CodeChars) - 1) * POWER(@CodeLength, @Index)
SET @Result = @Result + @DigitValue
SET @Index = @Index + 1
END
RETURN @Result
指定:
declare @hexStr varchar(16), @intVal int
IntToHexStr:
select @hexStr = convert(varbinary, @intVal, 1)
HexStrToInt:
declare
@query varchar(100),
@parameters varchar(50)
select
@query = 'select @result = convert(int,' + @hb + ')',
@parameters = '@result int output'
exec master.dbo.Sp_executesql @query, @parameters, @intVal output
Maksym Kozlenkoにはすてきな解決策があり、他のものは可能性を最大限に引き出すに近づきますが、文字のシーケンスを定義できることに完全に気づかない、そしてseそれはベースとしての長さです。これが彼のソリューションのこのわずかに修正されたバージョンが好きな理由です。なぜなら、それはベース16やベース17などで動作するからです。
たとえば、文字と数字が必要であるが、0のように見えるのが1でOが見えるのが好きではない場合はどうでしょう。この方法で任意のシーケンスを定義できます。以下は、IとOをスキップして「修正ベース34」を作成する「ベース36」の形式です。代わりに16進数として実行するには、16進数行のコメントを外します。
declare @value int = 1234567890
DECLARE @seq varchar(100) = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ' -- modified base 34
--DECLARE @seq varchar(100) = '0123456789ABCDEF' -- hex
DECLARE @result varchar(50)
DECLARE @digit char(1)
DECLARE @baseSize int = len(@seq)
DECLARE @workingValue int = @value
SET @result = SUBSTRING(@seq, (@workingValue%@baseSize)+1, 1)
WHILE @workingValue > 0
BEGIN
SET @digit = SUBSTRING(@seq, ((@workingValue/@baseSize)%@baseSize)+1, 1)
SET @workingValue = @workingValue/@baseSize
IF @workingValue <> 0 SET @result = @digit + @result
END
select @value as Value, @baseSize as BaseSize, @result as Result
値、BaseSize、結果
1234567890、34、T5URAA
また、私は価値を実際の価値に移し、個人的な好みとして、実際の価値のコピーから仕事をしています。
以下は、シーケンスの長さとして定義されたベースで、変換の反転の追加です。
declare @value varchar(50) = 'T5URAA'
DECLARE @seq varchar(100) = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ' -- modified base 34
--DECLARE @seq varchar(100) = '0123456789ABCDEF' -- hex
DECLARE @result int = 0
DECLARE @digit char(1)
DECLARE @baseSize int = len(@seq)
DECLARE @workingValue varchar(50) = @value
DECLARE @PositionMultiplier int = 1
DECLARE @digitPositionInSequence int = 0
WHILE len(@workingValue) > 0
BEGIN
SET @digit = right(@workingValue,1)
SET @digitPositionInSequence = CHARINDEX(@digit,@seq)
SET @result = @result + ( (@digitPositionInSequence -1) * @PositionMultiplier)
--select @digit, @digitPositionInSequence, @PositionMultiplier, @result
SET @workingValue = left(@workingValue,len(@workingValue)-1)
SET @PositionMultiplier = @PositionMultiplier * @baseSize
END
select @value as Value, @baseSize as BaseSize, @result as Result
IIF(Fields!HIGHLIGHT_COLOUR.Value="","#FFFFFF","#" & hex(Fields!HIGHLIGHT_COLOUR.Value) & StrDup(6-LEN(hex(Fields!HIGHLIGHT_COLOUR.Value)),"0"))
フォント色の表現として私のために働いています
16進数の文字列をINTに変換するために、過去にこれを使用しました。実際には、任意のベースをINTに変換するように変更できます(オクタル、バイナリなど)
Declare @Str varchar(200)
Set @str = 'F000BE1A'
Declare @ndx int
Set @ndx = Len(@str)
Declare @RunningTotal BigInt
Set @RunningTotal = 0
While @ndx > 0
Begin
Declare @Exponent BigInt
Set @Exponent = Len(@Str) - @ndx
Set @RunningTotal = @RunningTotal +
Power(16 * 1.0, @Exponent) *
Case Substring(@str, @ndx, 1)
When '0' then 0
When '1' then 1
When '2' then 2
When '3' then 3
When '4' then 4
When '5' then 5
When '6' then 6
When '7' then 7
When '8' then 8
When '9' then 9
When 'A' then 10
When 'B' then 11
When 'C' then 12
When 'D' then 13
When 'E' then 14
When 'F' then 15
End
Set @ndx = @ndx - 1
End
Print @RunningTotal
以下に、dbo.HexToIntとdbo.IntToHexの2つの関数を示します。これらを変換に使用します。
if OBJECT_ID('dbo.HexToInt') is not null
drop function dbo.HexToInt
GO
create function dbo.HexToInt (@chars varchar(max))
returns int
begin
declare @char varchar(1), @len int, @i int, @r int, @tmp int, @pow int
set @chars = RTRIM(LTRIM(@chars))
set @len = LEN(@chars)
set @i = 1
set @r = 0
while @i <= @len
begin
set @pow = @len - @i
set @char = SUBSTRING(@chars, @i, 1)
if @char = '0'
set @tmp = 0
else if @char = '1'
set @tmp = 1
else if @char = '2'
set @tmp = 2
else if @char = '3'
set @tmp = 3
else if @char = '4'
set @tmp = 4
else if @char = '5'
set @tmp = 5
else if @char = '6'
set @tmp = 6
else if @char = '7'
set @tmp = 7
else if @char = '8'
set @tmp = 8
else if @char = '9'
set @tmp = 9
else if @char = 'A'
set @tmp = 10
else if @char = 'B'
set @tmp = 11
else if @char = 'C'
set @tmp = 12
else if @char = 'D'
set @tmp = 13
else if @char = 'E'
set @tmp = 14
else if @char = 'F'
set @tmp = 15
set @r = @r + @tmp * POWER(16,@pow)
set @i = @i + 1
end
return @r
end
そして2つ目:
if OBJECT_ID('dbo.IntToHex') is not null
drop function dbo.IntToHex
GO
create function dbo.IntToHex (@val int)
returns varchar(max)
begin
declare @r varchar(max), @tmp int, @v1 int, @v2 int, @char varchar(1)
set @tmp = @val
set @r = ''
while 1=1
begin
set @v1 = @tmp / 16
set @v2 = @tmp % 16
if @v2 = 0
set @char = '0'
else if @v2 = 1
set @char = '1'
else if @v2 = 2
set @char = '2'
else if @v2 = 3
set @char = '3'
else if @v2 = 4
set @char = '4'
else if @v2 = 5
set @char = '5'
else if @v2 = 6
set @char = '6'
else if @v2 = 7
set @char = '7'
else if @v2 = 8
set @char = '8'
else if @v2 = 9
set @char = '9'
else if @v2 = 10
set @char = 'A'
else if @v2 = 11
set @char = 'B'
else if @v2 = 12
set @char = 'C'
else if @v2 = 13
set @char = 'D'
else if @v2 = 14
set @char = 'E'
else if @v2 = 15
set @char = 'F'
set @tmp = @v1
set @r = @char + @r
if @tmp = 0
break
end
return @r
end