bteraberry (10/2/2012)
I'm not sure how logical this project is, but it seemed interesting to do this without looping. It was fun.
declare @b-2 bigint = 31;
declare @out varbinary(128) = 0x;
-- simple inline tally table
with cteTen as
( select N from (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) as t(N) ),
cteNums as
( select N = 0
union all
selecttop (63) -- the 64th bit would be bigger than a bigint max value
N = row_number() over(order by (select null))
from cteTen as cte1
cross join cteTen as cte2 ),
-- the meat of the query
cteInit as
( selectcte.N
,ValThis = power(convert(decimal(20,0), 2), N)
,ValNext = power(convert(decimal(20,0), 2), N + 1)
from cteNums as cte )
select@out = @out + convert(varbinary(1), case when (@b - (floor(@b / cte.ValNext)) * cte.ValNext) >= cte.ValThis then 1 else 0 end)
from cteInit as cte
where cte.ValThis <= @b-2
order by cte.N desc;
select @out;
This is verified to work with the largest possible bigint. I did not code it with negative numbers in mind.
Wow this is way over my head 🙂 It works, I will runs it against the database and see how faster compare to the original code.
Thanks for spending time on this. alot to learn from this code. btw, can you help me understand the logics behind this query?