ТСКЛ.Получить побитовую сумму для многих столбцов подряд
-
03-07-2019 - |
Вопрос
У меня есть таблица, содержащая 4 набора по 25 столбцов в концепции BIT.На самом деле поле имеет формат smallint, но в его данных указано либо 0, либо 1.
Вот мой код, который представляет собой попытку получить сумму для первой группы из 25 столбцов.
Declare @rows int
, @ID uniqueidentifier
, @LocTotal bigint
select @rows = ( select count(*) from #t1 )
while @rows > 0
begin
print @rows
-- get that rowID
select @ID = (select top 1 recid from #t1)
select @LocTotal =
(select top 1
case when cbHPILoc1 = 1 then 1 else 0 end +
case when cbHPILoc2 = 1 then 2 else 0 end +
case when cbHPILoc3 = 1 then 4 else 0 end +
< snip >
case when cbHPILoc25 = 1 then 16777216 else 0 end
as Total
from dbo.MyTest_BitMap
where RecKey = @ID
)
print @ID
print @LocTotal
Мой результат:
(5 row(s) affected)
5
67A16306-B27D-4882-88A2-1146CBAAA8D9
(1 row(s) affected)
4
F94929B9-3DA7-4AA3-96F6-728EF025B21C
Мне не удается получить общую сумму @LocTotal
ТИА
Решение
Я думаю, что у Томалака оно есть, поэтому я его модифицировал, но если сделать это еще или один раз, раз уж весь этот бардак:
cbHPILoc1
+ cbHPILoc2 * 2
+ cbHPILoc3 * 4
+ ...
+ cbHPILoc25 * 16777216
это утомительно и подвержено ошибкам, почему бы не сделать это один раз и тщательно протестировать?
Тогда просто select total from viewname where reckey = ?
.
Другие советы
Почему так сложно?
SELECT
RecKey,
cbHPILoc1
+ cbHPILoc2 * 2
+ cbHPILoc3 * 4
+ ...
+ cbHPILoc25 * 16777216
AS Total
FROM
dbo.MyTest_BitMap
WHERE
RecKey = @ID
Не связан с StackOverflow