将1和0的32位二进制字符串转换为SQL Server中的带符号十进制数字

问题描述:

我正在使用SQL Server 2012 Express。我有一个1和0的32位长度的字符串。将1和0的32位二进制字符串转换为SQL Server中的带符号十进制数字

01010010000100010111001101110011 

如何将其转换为SQL脚本中的带符号的十进制数?

目前我在网上使用了一个Web工具来回答我的问题,而我目前的搜索并没有将我引导到我需要的答案。

+0

http://improve.dk/converting-between-base-2-10-and-16-in-t -sql/ –

您可以尝试像下面 -

DECLARE @Binary VARCHAR(100) = '01010010000100010111001101110011'; 
DECLARE @characters CHAR(36), 
     @result BIGINT, 
     @index SMALLINT, 
     @base BIGINT; 
SELECT @characters = 'abcdefghijklmnopqrstuvwxyz', 
     @result = 0, 
     @index = 0, 
     @base = 2;  
WHILE @index < LEN(@Binary) 
BEGIN 
    SELECT @result = @result + POWER(@base, @index) * (CHARINDEX(SUBSTRING(@Binary, LEN(@Binary) - @index, 1), @characters) - 1); 
    SET @index = @index + 1; 
END 
SELECT @result; 

这将帮助你从任何碱转化(我用@base as 2二进制)立足10.从最右边开始,移动到左边,直到我们用完数字。转换是(base^index)*数字。

+1

我要感谢你Abhishek和Giorgos Betsos。我最终在我的代码中使用了Abhishek的例子。这两个例子都产生了相同的结果,但结果没有签名,它们是无符号的。所以我在Abhishek的代码末尾添加了这样的代码来获得我的结果。 – Skozzy

如果使用帐簿桌可以执行与一个T-SQL语句转换:

;WITH Tally(i) AS (
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS i 
    FROM (VALUES (0), (0), (0), (0), (0), (0), (0), (0)) a(n) 
    CROSS JOIN (VALUES (0), (0), (0), (0)) b(n) 
) 
SELECT SUM(t.v) AS DecimalNumber 
FROM (
    SELECT POWER(CAST(SUBSTRING(x.d, i, 1) AS DECIMAL(10,0)) * 2, 32 - i) 
    FROM (VALUES ('01010010000100010111001101110011')) x(d) 
    CROSS JOIN Tally) AS t(v) 

说明:

  • Tally是表表达式1返回所有值-32。
  • 使用这些值,我们可以使用SUBSTRING从二进制字符串中提取每个数字。
  • 通过使用POWER数学函数,我们可以将每个单独的二进制数字转换为十进制数字。
  • 使用SUM我们可以将所有单独的十进制数加起来以得到预期的结果。

Demo here

我不得不将此代码添加到阿布舍克的代码示例月底获得签名的数字我需要的。 DECLARE @MyNewExValue INT IF @result > 2147483647 BEGIN SET @result = @result - (2147483648 * 2) END SET @MyNewExValue = @result SELECT @MyNewExValue

除了Giorgos Betsos的答复 见下文ITVF功能:

CREATE FUNCTION [dbo].[udf_BinaryToDecimal] 
(
@Binary VARCHAR(31) 
) 
    RETURNS TABLE AS RETURN 

    WITH Tally (n) AS 
(
--32 Rows 
    SELECT TOP (LEN (@Binary)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 
    FROM (VALUES (0),(0),(0),(0)) a(n) 
    CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0)) b(n) 
) 
SELECT 
SUM(SUBSTRING(REVERSE(@Binary),n+1,1) * POWER(2,n)) TenBase 
FROM Tally 

/*How to Use*/ 
SELECT TenBase 
FROM udf_BinaryToDecimal ('01010010000100010111') 

/*Result -> 336151*/