SQL Server>>中按位操作的替代方法,列中的位超过62位

SQL Server>>中按位操作的替代方法,列中的位超过62位,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的SQL上有递归脚本,例如: WITH recursive bits AS ( SELECT 0 AS idx UNION ALL SELECT idx + 1 AS idx FROM bits WHERE bits.idx + 1 < 64) select power(2,idx) , idx from bits WHERE (9223372036854775808 >> bits.idx

我的SQL上有递归脚本,例如:

  WITH recursive bits AS (
        SELECT 0 AS idx
        UNION ALL
        SELECT idx + 1 AS idx
        FROM bits
        WHERE bits.idx + 1 < 64)

select power(2,idx) , idx
from bits
WHERE (9223372036854775808 >> bits.idx & 1) = 1
但现在我需要将其转换为SQL Server

我知道功能的力量

    WITH  bits AS (
        SELECT 0 AS idx
        UNION ALL
        SELECT idx + 1 AS idx
        FROM bits
        WHERE bits.idx + 1 < 63
        
    )
select *
from bits
where floor(4611686018427387904/power( cast(2 as bigint) ,idx)) & 1 = 1

但是我需要将power2,idx转换为powercast2作为float,idx,其中power>2,62,在这个操作符之后&不起作用。因为它只处理int类型。

经过一段时间的尝试,找到了任何决定。 最终版本-我们将在这一行中使用varbinary20

对it主题非常有帮助: 函数[DobitMatchFromBinary] 但在那个版本中,我们有一条从左到右的线。我有不同的位线:

预信息:

大端

1 byte  7|6|5|4|3|2|1|0 
2 byte  15|14|13|12|11|10|9|8
3 byte  23|22|21|20|19|18|17|16
..
          
还是小恩迪亚

3 byte  23|22|21|20|19|18|17|16
2 byte  15|14|13|12|11|10|9|8
1 byte  7|6|5|4|3|2|1|0 
  ..
          
          
CREATE FUNCTION [dbo].[DoBitsMatchFromBinaryFromBytes](@bitToCheck INT,@inputBinary VARBINARY(1024))
    RETURNS BIT
        AS
    BEGIN
 
        DECLARE @byte int = (@bitToCheck) / 8
        DECLARE @bit int = @bitToCheck - @byte * 8
        DECLARE @bytemask int = POWER(2, 8-@bit)
        SET @byte = @byte + 1
    
        RETURN floor(CONVERT(int, SUBSTRING(@inputBinary, @byte, 1), 2)/power( cast(2 as bigint),@bit)) & 1 
    END
示例MySQL:

WITH RECURSIVE bits AS (
    SELECT 0 AS idx
    UNION ALL
    SELECT idx + 1 AS idx
    FROM bits
    WHERE bits.idx + 1 < 160)
SELECT *
FROM bits
WHERE (4611686018968453378 >> bits.idx & 1) = 1;
        
它帮助我从big endian varbinary返回正确的位数:

示例MSSQL:

WITH  bits AS (
        SELECT 0 AS idx
        UNION ALL
        SELECT idx + 1 AS idx
        FROM bits
        WHERE bits.idx + 1 < 160)
    SELECT *
    FROM bits
    WHERE [dbo].[DoBitsMatchFromBinaryFromBytes](bits.idx,0x0201402000000040) = 1
    OPTION(MAXRECURSION 160);
如果有人能改进这个版本,那就太好了。
我希望它也能有所帮助。

按位操作并不适合SQL的优点。单独的事实应存储为单独的数据块,而不是全部塞进一个对系统完全不透明、无法索引的值中。这是否回答了您的问题@Damien_The_异教者改变存储信息的类型是一个好主意,但我有我所拥有的,我只需要将sql系统从我的sql更改为ms sql。您需要的范围是什么,即多少位?如果它超过64位BigInt,那么您将使用什么数据类型,因为SQL Server不能将其表示为数字数据类型?我需要使用最多160位的行