我需要能够将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。
答案 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