在SQL Server存储过程中使用十进制到二进制转换

时间:2017-12-07 06:19:14

标签: sql-server binary

我需要能够将int列转换为二进制形式。此列表示在一列中存储多个值的位值组合。我找到了一个解决方案,它创建了一个将int值更改为二进制形式的函数,但我无法在此数据库中创建其他函数,并希望在我的过程中实现它。

select @StoreFlags = r.StoreFlags
from insert I, StorageRule r
where r.Active = 1 and I.Active = 0 

PRINT CONVERT(VARBINARY(16),@StoreFlags)

IF(@StoreFlags = 11)  
    insert into StoreQueue (TimeToExecute, Operation, Parameter, StorageID, StoreFlags)
       select  
           DateAdd(mi, @Time, getutcdate()), 1, I.ID, r.ID, r.StoreFlags 
       from 
           insert I, StorageRule r
       where 
           r.Active = 1 and I.Active = 0 

上面的print语句显示了我最初尝试转换为二进制文件的位置,但这似乎是十六进制形式。下面的函数做我需要的但我需要对变量@StoreFlags应用它,并特别使用If语句中返回的答案而不是整数常量。此后,我需要操作这些位以将其转换为新值。

CREATE FUNCTION dbo.Int2Binary (@i INT) 
RETURNS NVARCHAR(16) 
AS 
BEGIN
    RETURN
        CASE WHEN CONVERT(VARCHAR(16), @i & 32768 ) > 0 THEN '1' ELSE '0'     END 
        CASE WHEN CONVERT(VARCHAR(16), @i & 16384 ) > 0 THEN '1' ELSE '0'   END 
        CASE WHEN CONVERT(VARCHAR(16), @i &  8192 ) > 0 THEN '1' ELSE '0'   END 
        CASE WHEN CONVERT(VARCHAR(16), @i &  4096 ) > 0 THEN '1' ELSE '0'   END          
        CASE WHEN CONVERT(VARCHAR(16), @i &  2048 ) > 0 THEN '1' ELSE '0'   END 
        CASE WHEN CONVERT(VARCHAR(16), @i &  1024 ) > 0 THEN '1' ELSE '0'   END 
        CASE WHEN CONVERT(VARCHAR(16), @i &   512 ) > 0 THEN '1' ELSE '0'   END 
        CASE WHEN CONVERT(VARCHAR(16), @i &   256 ) > 0 THEN '1' ELSE '0'   END 
        CASE WHEN CONVERT(VARCHAR(16), @i &   128 ) > 0 THEN '1' ELSE '0'   END 
        CASE WHEN CONVERT(VARCHAR(16), @i &    64 ) > 0 THEN '1' ELSE '0'   END 
        CASE WHEN CONVERT(VARCHAR(16), @i &    32 ) > 0 THEN '1' ELSE '0'   END 
        CASE WHEN CONVERT(VARCHAR(16), @i &    16 ) > 0 THEN '1' ELSE '0'   END 
        CASE WHEN CONVERT(VARCHAR(16), @i &     8 ) > 0 THEN '1' ELSE '0'   END 
        CASE WHEN CONVERT(VARCHAR(16), @i &     4 ) > 0 THEN '1' ELSE '0'   END 
        CASE WHEN CONVERT(VARCHAR(16), @i &     2 ) > 0 THEN '1' ELSE '0'   END 
        CASE WHEN CONVERT(VARCHAR(16), @i &     1 ) > 0 THEN '1' ELSE '0'   END
 END;
 GO

 SELECT dbo.Int2Binary(11)
 GO

有关如何实施此建议的任何建议。

编辑:

只是为了澄清;该函数将返回11:0000000000001011。所以我需要更改一个位以在If后面的插入中使用。在我的情况下,将更改为值9,0000000000001001。

1 个答案:

答案 0 :(得分:2)

您可以使用此查询而不是函数:

DECLARE @StoreFlags int = 11,
        @StoreFlagsBin nvarchar(100) = N''

WHILE @StoreFlags > 0
BEGIN
    SET @StoreFlagsBin = @StoreFlagsBin + CAST(@StoreFlags%2 as nvarchar(1))
    SET @StoreFlags = @StoreFlags/2
END

SELECT REVERSE(@StoreFlagsBin)

输出:

1011