Варианта без использования цикла - чистый основой множественного подхода (с рекурсивным КТРОМ) и, следовательно, должен быть достаточно эффективными по сравнению с любым видом цикла. Вы можете использовать эту функцию, чтобы присоединиться или применить его к другим наборам данных (таблицы или представления)
-- function to split binary string to result-set
alter function [dbo].[SplitStringToResultSet] (@value varchar(max), @size int)
returns table
as return
with r as (
select right(value, 1) [bit]
, left(value, len(value)-1) [value]
, 0 [pos]
from (select rtrim(cast(
case
when len(@value) > @size then left(@value, @size)
when len(@value) < @size then @value + replicate('0', @size - len(@value))
else @value
end as varchar(max))) [value]) as j
union all
select right(value, 1)
, left(value, len(value)-1)
, pos + 1
from r where value > '')
select cast([bit] as int) [bit], [pos] from r
-- usage -------------------------------------------------
declare
@OR varchar(20) = '',
@AND varchar(20) = '';
select @OR = @OR + cast(n1.[bit] | n2.[bit] as varchar(1))
, @AND = @AND + cast(n1.[bit] & n2.[bit] as varchar(1))
-- XOR etc
from [dbo].[SplitStringToResultSet] ('11001100', 8) n1
full join [dbo].[SplitStringToResultSet] ('00100110', 8) as n2 on n1.[pos] = n2.[pos]
order by n1.pos desc
select @OR [OR], @AND [AND]
Результат
OR AND
--------------------
11101110 00000100
Почему эти строки вместо двоичных данных? Вы используете байт для представления бит. В любом случае CLR, вероятно, будет наиболее эффективным способом. –
Максимальная длина строки равна миллиону, или количество строк - миллион, а максимальная длина - короткая? – Beth