在T-SQL

时间:2016-12-20 14:35:12

标签: sql-server tsql

我需要在十六进制数字的字符串表示中重新排列字符。这是一个输入(上部字符串)和所需结果(下部字符串)的示例。 enter image description here

我在这里借用了这个人的代码: http://dpatrickcaldwell.blogspot.hr/2009/05/converting-decimal-to-hexadecimal-with.html 谢了,兄弟们!这应该照顾我的十进制到十六进制转换,并且它有效,我已经测试过了。

现在这里是我的T-SQL代码,应该处理部件的移动:

CREATE FUNCTION DecodeDecKeyCard
(
    @value AS BIGINT
) RETURNS CHAR(8) AS BEGIN
    DECLARE @convertedNum VARCHAR(MAX),
            @result CHAR(8) = '',
            @flag INT = 1,
            @loop INT = 4;
    SELECT @convertedNum = dbo.ConvertToBase(@value, 16);
    WHILE @loop > 0
        BEGIN
            SELECT @result = @result + SUBSTRING(@convertedNum, (@loop*2) - @flag, 1);
            IF(@flag = 1)
                SET @flag = 0;
            ELSE
                SET @flag = 1;
                SET @loop = @loop -1;
        END
    RETURN @result
END

由于我在SQL方面是一个完整的菜鸟,我不知道如何调试它。我已经用Google搜索了一些关于它的东西,但结果一直指的是VS的付费版本和一些黑客或诸如此类的东西......坦率地说,我很难按时(和金钱)自己设置这个此刻。

与上述代码相关的一些事情:

  • 我知道我总会收到一个10位十进制数作为参数
  • 我知道它总会产生8位十六进制数
  • dbo.ConvertToBase是前面提到的“借来的”功能

编辑: 我目前的代码导致没有返回数据...十六进制数从一开始就被视为一个字符串。

我想说明为什么我的代码不起作用?

2 个答案:

答案 0 :(得分:3)

二进制风格:

declare @value         int       = 1234567890
declare @value_bytes   binary(4) = cast(@value as binary(4))
declare @swapped_bytes binary(4) = cast(reverse(@value_bytes) as binary(4))

select 
    @value_bytes   [Input],
    @swapped_bytes [Output], 
    convert(char(8), @swapped_bytes, 2) [As text]

有关:

Input       Output      As text
0x499602D2  0xD2029649  D2029649

UDF:

create function DecodeDecKeyCard ( @value as int ) returns char(8)
as 
begin 
    return convert(char(8), cast(reverse(cast(@value as binary(4))) as binary(4)), 2)
end

(如果可以使用bigintbinary(8)char(16)

,则预计该值不会超过32位整数的最大值

答案 1 :(得分:1)

--10 CHARACTER INPUT
declare @input varchar(10) = '0xD2CF901A'

SELECT RIGHT(RIGHT(@input,8),2) + SUBSTRING(RIGHT(@input,8),5,2) + SUBSTRING(RIGHT(@input,8),3,2) + LEFT(RIGHT(@input,8),2)

--8 CHARACTER INPUT
declare @input varchar(10) = 'D2CF901A'

SELECT RIGHT(@input,2) + SUBSTRING(@input,5,2) + SUBSTRING(@input,3,2) + LEFT(@input,2)