T-SQL:如何在二进制字段中添加位?

时间:2014-06-11 04:35:00

标签: sql-server binary

我有一张桌子

create table t (id int, b binary(128))

insert into t(id, b) values (1, 0x010000)
insert into t(id, b) values (1, 0x000204)
insert into t(id, b) values (2, 0x000004)
insert into t(id, b) values (2, 0x010204)
insert into t(id, b) values (2, 0x010004)

我需要最后收到汇总表包含2条记录 其中b是OR'ed位

create table result (id int, b binary(128)) 

1 0x010204
2 0x010004

似乎我需要这样做

通过id

从t组中选择id,FUN(b)

问题是:我需要创建并使用SQLCLR聚合函数FUN。 还有另一种方式吗?

1 个答案:

答案 0 :(得分:2)

不需要SQLCLR,但它更具可读性;-)。我能够通过下面的方法做到这一点,这需要一个游标,但我无法找到解决方法(APPLY会很好,但在这种情况下不能很好地工作)。

/* given sample data but as temp table and BINARY(5) instead of BINARY(128) */
CREATE TABLE #T (ID INT, B BINARY(5));  --DROP TABLE #t
INSERT INTO #t VALUES (1, 0x010000); INSERT INTO #t VALUES (1, 0x000204);
INSERT INTO #t VALUES (2, 0x000004); INSERT INTO #t VALUES (2, 0x010204);
INSERT INTO #t VALUES (2, 0x010004);
SELECT *, CONVERT(BIGINT, b) AS [converted] from #t
------------------------
DECLARE @Totals TABLE (ID INT, B BIGINT);
DECLARE @ID INT, @B BIGINT;

DECLARE curs CURSOR FAST_FORWARD LOCAL
FOR  SELECT src.id, CONVERT(BIGINT, src.b) FROM #t src;

OPEN curs;
FETCH NEXT FROM curs INTO @ID, @B;

WHILE (@@FETCH_STATUS = 0)
BEGIN
    UPDATE ttl
    SET    ttl.B |= @B
    OUTPUT INSERTED.*, @B AS [CurrentB] -- debug
    FROM   @Totals ttl WHERE  ttl.ID = @ID;

    IF (@@ROWCOUNT = 0)
    BEGIN
        INSERT INTO @Totals (ID, B) VALUES (@ID, @B);
    END;

    FETCH NEXT FROM curs INTO @ID, @B;
END;

CLOSE curs; DEALLOCATE curs;

SELECT 'Result' AS [~~], ttl.ID, ttl.B, CONVERT(BINARY(5), ttl.B) AS [FinalB]
FROM @Totals ttl;

当然,如果您确实需要BINARY(128),那么这可能无效。