<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblog.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results matching tags 'T-SQL' and 'SQL'</title><link>http://sqlblog.com/search/SearchResults.aspx?o=DateDescending&amp;tag=T-SQL,SQL&amp;orTags=0</link><description>Search results matching tags 'T-SQL' and 'SQL'</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Bit-Twiddling in SQL</title><link>http://sqlblog.com/blogs/michael_coles/archive/2010/04/03/bit-twiddling-in-sql.aspx</link><pubDate>Sun, 04 Apr 2010 03:40:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:24024</guid><dc:creator>Mike C</dc:creator><description>&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;Someone posted a question to the SQL Server forum the other day asking how to count runs of zero bits in an integer using SQL.&amp;nbsp; Basically the poster wanted to know how to efficiently determine the longest contiguous string of zero-bits (known as a&amp;nbsp;run of bits) in any given&amp;nbsp;32-bit&amp;nbsp;integer.&amp;nbsp; Here are a couple of&amp;nbsp;examples to demonstrate the idea:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';FONT-SIZE:11pt;"&gt;Decimal = Binary = Zero Run&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';FONT-SIZE:11pt;"&gt;&lt;BR&gt;999,999,999 decimal = &lt;B style="mso-bidi-font-weight:normal;"&gt;&lt;U&gt;&lt;SPAN style="COLOR:#0070c0;"&gt;00&lt;/SPAN&gt;&lt;/U&gt;&lt;/B&gt;111011 1&lt;B style="mso-bidi-font-weight:normal;"&gt;&lt;U&gt;&lt;SPAN style="COLOR:#0070c0;"&gt;00&lt;/SPAN&gt;&lt;/U&gt;&lt;/B&gt;11010 11&lt;B style="mso-bidi-font-weight:normal;"&gt;&lt;U&gt;&lt;SPAN style="COLOR:#0070c0;"&gt;00&lt;/SPAN&gt;&lt;/U&gt;&lt;/B&gt;1&lt;B style="mso-bidi-font-weight:normal;"&gt;&lt;U&gt;&lt;SPAN style="COLOR:#0070c0;"&gt;00&lt;/SPAN&gt;&lt;/U&gt;&lt;/B&gt;1 11111111 binary = 2 contiguous zero bits&lt;BR&gt;666,666,666 decimal = 00100111 10111100 1&lt;B style="mso-bidi-font-weight:normal;"&gt;&lt;U&gt;&lt;SPAN style="COLOR:#0070c0;"&gt;0000&lt;/SPAN&gt;&lt;/U&gt;&lt;/B&gt;110 10101010 binary = 4 contiguous zero bits&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';FONT-SIZE:11pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;My first reaction was that SQL is not my first choice of a go-to language for bit twiddling hacks.&amp;nbsp; These types of calculations are generally most efficient in C-style compiled procedural languages with plenty of bit manipulation instructions that map almost directly one-for-one to low-level machine language instructions.&amp;nbsp; In all fairness, SQL does have some bit-level operators (&amp;amp;, |, etc. operators), but the performance isn’t as optimized as a language like C#.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;At any rate, a few different ideas were tossed around, like the simplistic loop-and-count procedural method.&amp;nbsp; Using this method you just keep a running total of the longest zero-bit run and keep looping over the bits, adjusting your running total, comparing to your largest run of zero bits, and shifting your integer one bit right each time.&amp;nbsp; But this being SQL, I decided to attack the problem from a set-based perspective.&amp;nbsp; To start with I built a 1,000,000 row table to hold random integers:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;FONT-SIZE:11pt;"&gt;CREATE&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';FONT-SIZE:11pt;"&gt; &lt;SPAN style="COLOR:blue;"&gt;TABLE&lt;/SPAN&gt; TempNum &lt;SPAN style="COLOR:gray;"&gt;&lt;BR&gt;(&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Num &lt;SPAN style="COLOR:blue;"&gt;BIGINT&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;NOT&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;NULL&lt;BR&gt;);&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;GO&lt;BR&gt;&lt;BR&gt;WITH&lt;/SPAN&gt; GenerateRandom&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;AS&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&lt;/SPAN&gt; 1 &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; n&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:fuchsia;"&gt;ABS&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:fuchsia;"&gt;CONVERT&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;BIGINT&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:fuchsia;"&gt;CONVERT&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;BINARY&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:fuchsia;"&gt;CHECKSUM&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:fuchsia;"&gt;NEWID&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;())))&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;%&lt;/SPAN&gt; 4294967296&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; Random&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNION&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;ALL&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&lt;/SPAN&gt; n &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:fuchsia;"&gt;ABS&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:fuchsia;"&gt;CONVERT&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;BIGINT&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:fuchsia;"&gt;CONVERT&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;BINARY&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:fuchsia;"&gt;CHECKSUM&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:fuchsia;"&gt;NEWID&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;())))&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;%&lt;/SPAN&gt; 4294967296&lt;SPAN style="COLOR:gray;"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&lt;/SPAN&gt; GenerateRandom&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&lt;/SPAN&gt; n &lt;SPAN style="COLOR:gray;"&gt;&amp;lt;&lt;/SPAN&gt; 1000000&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;INSERT&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;INTO&lt;/SPAN&gt; TempNum &lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Num&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;SELECT&lt;/SPAN&gt; Random&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;FROM&lt;/SPAN&gt; GenerateRandom&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;OPTION &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;MAXRECURSION 0&lt;SPAN style="COLOR:gray;"&gt;);&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;GO&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';FONT-SIZE:11pt;"&gt;&lt;SPAN style="COLOR:blue;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;Note that I used SQL Server’s BIGINT data type (64-bit integer) since I wanted to deal only in unsigned 32-bit integers.&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/SPAN&gt;For my initial crack at a solution I split the 32-bit integer up into individual bits and treated the whole thing like a classic Gaps and Islands problem.&amp;nbsp; Essentially the 1 bits are islands, the 0's are gaps, and the length of the longest gap is the correct answer.&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;FONT-SIZE:11pt;"&gt;DBCC&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';FONT-SIZE:11pt;"&gt; FREEPROCCACHE&lt;SPAN style="COLOR:gray;"&gt;;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;DBCC&lt;/SPAN&gt; DROPCLEANBUFFERS&lt;SPAN style="COLOR:gray;"&gt;;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;GO&lt;BR&gt;&lt;BR&gt;WITH&lt;/SPAN&gt; Powers&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;AS&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&lt;/SPAN&gt; 0 &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; id&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:fuchsia;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CAST&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;1 &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;BIGINT&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; pwr&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNION&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;ALL&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&lt;/SPAN&gt; p&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;id &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:fuchsia;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; POWER&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:fuchsia;"&gt;CAST&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;2 &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;BIGINT&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;),&lt;/SPAN&gt; p&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;id &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&lt;/SPAN&gt; Powers p&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&lt;/SPAN&gt; p.id &lt;SPAN style="COLOR:gray;"&gt;&amp;lt;&lt;/SPAN&gt; 33&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;),&lt;BR&gt;&lt;/SPAN&gt;Islands&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;AS&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&lt;/SPAN&gt; &lt;SPAN style="COLOR:fuchsia;"&gt;ROW_NUMBER&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;()&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;OVER &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;PARTITION&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;BY&lt;/SPAN&gt; tn&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num &lt;SPAN style="COLOR:blue;"&gt;ORDER&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;BY&lt;/SPAN&gt; id&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; RowNum&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tn&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;id&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;pwr&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&lt;/SPAN&gt; Powers p&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CROSS&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;JOIN&lt;/SPAN&gt; TempNum tn&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&lt;/SPAN&gt; p&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;pwr &lt;SPAN style="COLOR:gray;"&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;((&lt;/SPAN&gt;tn&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num &lt;SPAN style="COLOR:gray;"&gt;*&lt;/SPAN&gt; 2 &lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;|&lt;/SPAN&gt; &lt;SPAN style="COLOR:fuchsia;"&gt;CAST&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;8589934593 &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;BIGINT&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;))&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;&amp;lt;&amp;gt;&lt;/SPAN&gt; 0&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;SELECT&lt;/SPAN&gt; c&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; Num&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:fuchsia;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MAX&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;n&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;id &lt;SPAN style="COLOR:gray;"&gt;-&lt;/SPAN&gt; c&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;id &lt;SPAN style="COLOR:gray;"&gt;-&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; ZeroBitRun&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;INTO&lt;/SPAN&gt; #Temp&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;FROM&lt;/SPAN&gt; Islands &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; c&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;INNER&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;JOIN&lt;/SPAN&gt; Islands &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; n&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ON&lt;/SPAN&gt; n&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;RowNum &lt;SPAN style="COLOR:gray;"&gt;=&lt;/SPAN&gt; c&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;RowNum &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; 1&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND&lt;/SPAN&gt; n&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num &lt;SPAN style="COLOR:gray;"&gt;=&lt;/SPAN&gt; c&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;WHERE&lt;/SPAN&gt; n&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;id &lt;SPAN style="COLOR:gray;"&gt;-&lt;/SPAN&gt; c&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;id &lt;SPAN style="COLOR:gray;"&gt;&amp;gt;&lt;/SPAN&gt; 1&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;GROUP&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;BY&lt;/SPAN&gt; c&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; n&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num&lt;SPAN style="COLOR:gray;"&gt;;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;GO&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';FONT-SIZE:11pt;"&gt;&lt;SPAN style="COLOR:blue;"&gt;&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;One interesting aside on this solution - to ensure that leading and trailing zeroes were counted for&amp;nbsp;every 32-bit number I had to shift the number left one bit (multiply by 2) and do&amp;nbsp;a bitwise OR (| operator) with 8589934593, setting both the lowest bit (bit 0) and the highest bit (bit 33) to 1.&amp;nbsp; Basically this means you’re now dealing with a 34-bit integer, with the highest and lowest bits counted as islands. &lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/SPAN&gt;This ensures that for the 32 bits in between leading and trailing gaps are correctly identified.&amp;nbsp; On my PC this query took an average of just over 360 seconds (6 minutes) to identify the largest run of zero bits in 1,000,000 random numbers.&amp;nbsp; Another solution posted to the group used logarithms combined with bit-shifting in a recursive CTE.&amp;nbsp; This one completed 1,000,000 iterations in about 17.5 minutes.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;I couldn't help but think that when you get down to it, a solution to this problem should play to SQL’s strengths.&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/SPAN&gt;I decided that what I really need for an efficient SQL solution to this problem is a lookup table.&amp;nbsp; Granted, a lookup table of 4+ billion rows (one row for each and every 32 bit number) would take a long time to build and probably wouldn't lend itself to IO efficiencies in SQL Server.&amp;nbsp; So I opted for a scaled down version and built a lookup table of 65,536 rows with one row representing every possible 16 bit number.&amp;nbsp; There are a lot of clever ways to grab bit-level pattern information (Google "de Bruijn sequence", for instance), but to be honest this lookup table is a one-time build and static population so I decided to keep it simple.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;FONT-SIZE:11pt;"&gt;CREATE&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';FONT-SIZE:11pt;"&gt; &lt;SPAN style="COLOR:blue;"&gt;TABLE&lt;/SPAN&gt; #Nybbles&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Num &lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;primary&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;key&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;not&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;null,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String &lt;SPAN style="COLOR:blue;"&gt;varchar&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;4&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;not&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;null,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Leading &lt;SPAN style="COLOR:blue;"&gt;tinyint&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;not&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;null,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Trailing &lt;SPAN style="COLOR:blue;"&gt;tinyint&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;not&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;null&lt;BR&gt;);&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;GO&lt;BR&gt;&lt;BR&gt;INSERT&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;INTO&lt;/SPAN&gt; #Nybbles&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Num&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Leading&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Trailing&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;VALUES &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;0&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'0000'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 4&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 4&lt;SPAN style="COLOR:gray;"&gt;),&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;1&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'0001'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 3&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;),&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;2&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'0010'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 2&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;),&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;3&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'0011'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 2&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/SPAN&gt;4&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'0100'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 2&lt;SPAN style="COLOR:gray;"&gt;),&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;5&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'0101'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;),&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;6&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'0110'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;),&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;7&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'0111'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/SPAN&gt;8&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'1000'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 3&lt;SPAN style="COLOR:gray;"&gt;),&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;9&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'1001'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;),&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;10&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'1010'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;),&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;11&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'1011'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/SPAN&gt;12&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'1100'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 2&lt;SPAN style="COLOR:gray;"&gt;),&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;13&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'1101'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;),&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;14&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'1110'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;),&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;15&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:red;"&gt;'1111'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; 0&lt;SPAN style="COLOR:gray;"&gt;);&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;GO&lt;BR&gt;&lt;BR&gt;CREATE&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;TABLE&lt;/SPAN&gt; #BitMask&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Length&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;tinyint&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mask &lt;SPAN style="COLOR:blue;"&gt;varchar&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;16&lt;SPAN style="COLOR:gray;"&gt;)&lt;BR&gt;);&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;GO&lt;BR&gt;&lt;BR&gt;WITH&lt;/SPAN&gt; GetMasks&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;AS&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&lt;/SPAN&gt; 0 &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Length&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:fuchsia;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CAST&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;''&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;varchar&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;16&lt;SPAN style="COLOR:gray;"&gt;))&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; Mask&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNION&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;ALL&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Length&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:fuchsia;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CAST&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:fuchsia;"&gt;REPLICATE&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;'0'&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Length&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; 1&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;varchar&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;16&lt;SPAN style="COLOR:gray;"&gt;))&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&lt;/SPAN&gt; GetMasks&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Length&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;&amp;lt;&lt;/SPAN&gt; 16&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;INSERT&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;INTO&lt;/SPAN&gt; #BitMask&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Length&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mask&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Length&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mask&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;FROM&lt;/SPAN&gt; GetMasks&lt;SPAN style="COLOR:gray;"&gt;;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;GO&lt;BR&gt;&lt;BR&gt;CREATE&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;TABLE&lt;/SPAN&gt; BitPattern&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Num &lt;SPAN style="COLOR:blue;"&gt;int&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;not&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;null&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;primary&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;key&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Trailing &lt;SPAN style="COLOR:blue;"&gt;tinyint&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Leading &lt;SPAN style="COLOR:blue;"&gt;tinyint&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Seq &lt;SPAN style="COLOR:blue;"&gt;tinyint&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;);&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;GO&lt;BR&gt;&lt;BR&gt;WITH&lt;/SPAN&gt; GetBin&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;AS&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&lt;/SPAN&gt; n1&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num &lt;SPAN style="COLOR:gray;"&gt;*&lt;/SPAN&gt; 4096 &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; n2&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num &lt;SPAN style="COLOR:gray;"&gt;*&lt;/SPAN&gt; 256 &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; n3&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num &lt;SPAN style="COLOR:gray;"&gt;*&lt;/SPAN&gt; 16 &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; n4&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; Num&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n1&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;String &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; n2&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;String &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; n3&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;String &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; n4&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;String &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; String&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&lt;/SPAN&gt; #Nybbles n1&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CROSS&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;JOIN&lt;/SPAN&gt; #Nybbles n2&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CROSS&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;JOIN&lt;/SPAN&gt; #Nybbles n3&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CROSS&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;JOIN&lt;/SPAN&gt; #Nybbles n4&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;INSERT&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;INTO&lt;/SPAN&gt; BitPattern&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Num&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Trailing&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Leading&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Seq&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;SELECT&lt;/SPAN&gt; g&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&lt;/SPAN&gt; &lt;SPAN style="COLOR:fuchsia;"&gt;MAX&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;b1&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;Length&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt;&amp;nbsp;&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&lt;/SPAN&gt; #BitMask b1&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;RIGHT(&lt;/SPAN&gt;g&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;String&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; b1&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;Length&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;=&lt;/SPAN&gt; b1&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Mask&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; Trailing&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&lt;/SPAN&gt; &lt;SPAN style="COLOR:fuchsia;"&gt;MAX&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;b2&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;Length&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt;&amp;nbsp;&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&lt;/SPAN&gt; #BitMask b2&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;LEFT(&lt;/SPAN&gt;g&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;String&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; b2&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;Length&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;=&lt;/SPAN&gt; b2&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Mask&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; Leading&lt;SPAN style="COLOR:gray;"&gt;,&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:fuchsia;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; COALESCE&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&lt;/SPAN&gt; &lt;SPAN style="COLOR:fuchsia;"&gt;MAX&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;b3&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;Length&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&lt;/SPAN&gt; #BitMask b3&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&lt;/SPAN&gt; &lt;SPAN style="COLOR:fuchsia;"&gt;CHARINDEX&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;b3&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Mask&lt;SPAN style="COLOR:gray;"&gt;,&lt;/SPAN&gt; g&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;String&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;&amp;gt;&lt;/SPAN&gt; 0&lt;BR&gt;&lt;SPAN style="COLOR:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),&lt;/SPAN&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; Seq&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;FROM&lt;/SPAN&gt; GetBin g&lt;BR&gt;&lt;SPAN style="COLOR:blue;"&gt;ORDER&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;BY&lt;/SPAN&gt; Num&lt;SPAN style="COLOR:gray;"&gt;;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;GO&lt;BR&gt;&lt;BR&gt;DROP&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;TABLE&lt;/SPAN&gt; #BitMask&lt;SPAN style="COLOR:gray;"&gt;;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;DROP&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;TABLE&lt;/SPAN&gt; #Nybbles&lt;SPAN style="COLOR:gray;"&gt;;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;GO&lt;/SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';FONT-SIZE:11pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;The first part of this script puts all 16 combinations of 4-bit nybbles (nybble = half a byte) and their equivalent binary formatted strings (0 = '0000', 14 = '1110') into a temp table called #Nybbles.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;There’s also a #BitMask temp table with bitmasks representing zero-bit runs.&amp;nbsp; The bitmasks are just strings of consecutive '0' characters of the necessary length (length 1 = '0', length 5 = '00000').&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;The BitPatterns table is the actual 16-bit number lookup table.&amp;nbsp; This table is populated by combining every 16-bit combination of nybbles from the #Nybbles temp table.&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/SPAN&gt;This table has 4 columns:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV style="TEXT-INDENT:-0.25in;MARGIN-LEFT:38pt;mso-list:l1 level1 lfo1;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;Num is the 16-bit number&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV style="TEXT-INDENT:-0.25in;MARGIN-LEFT:38pt;mso-list:l1 level1 lfo1;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;Trailing is the number of zero bits trailing (on the right-hand side) in the number&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV style="TEXT-INDENT:-0.25in;MARGIN-LEFT:38pt;mso-list:l1 level1 lfo1;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;Leading is the number of zero bits leading (on the left-hand side) in the number&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV style="TEXT-INDENT:-0.25in;MARGIN-LEFT:38pt;mso-list:l1 level1 lfo1;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;Seq is the longest sequence of zero bits within the number&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P style="MARGIN-LEFT:2pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN-LEFT:2pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;The total run time to build this lookup table was around 30 seconds on my computer.&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/SPAN&gt;Keep in mind that’s a one-time cost since you never have to build (or modify) the table again.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN-LEFT:2pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN-LEFT:2pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;With the information in this lookup table the query that locates the longest run of zero bits in any given 32-bit number is relatively simple:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN-LEFT:2pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;DBCC&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt; FREEPROCCACHE&lt;SPAN style="COLOR:gray;"&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;DBCC&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt; DROPCLEANBUFFERS&lt;SPAN style="COLOR:gray;"&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;&lt;FONT size=3&gt;GO&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;&lt;o:p&gt;&lt;FONT size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;WITH&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt; CTE&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;&lt;FONT size=3&gt;AS&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:gray;"&gt;&lt;FONT size=3&gt;(&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;SELECT&lt;/SPAN&gt; tn&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num&lt;SPAN style="COLOR:gray;"&gt;,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:gray;"&gt;(&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;SELECT&lt;/SPAN&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;CASE&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;WHEN&lt;/SPAN&gt; l&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Seq &lt;SPAN style="COLOR:gray;"&gt;&amp;gt;&lt;/SPAN&gt; h&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Seq &lt;SPAN style="COLOR:blue;"&gt;THEN&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:gray;"&gt;(&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;CASE&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;WHEN&lt;/SPAN&gt; l&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Seq &lt;SPAN style="COLOR:gray;"&gt;&amp;gt;&lt;/SPAN&gt; h&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Trailing &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; l&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Leading &lt;SPAN style="COLOR:blue;"&gt;THEN&lt;/SPAN&gt; l&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Seq &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;ELSE&lt;/SPAN&gt; h&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Trailing &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; l&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Leading &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;END&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;ELSE&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:gray;"&gt;(&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;CASE&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;WHEN&lt;/SPAN&gt; h&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Seq &lt;SPAN style="COLOR:gray;"&gt;&amp;gt;&lt;/SPAN&gt; h&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Trailing &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; l&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Leading &lt;SPAN style="COLOR:blue;"&gt;THEN&lt;/SPAN&gt; h&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Seq &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;ELSE&lt;/SPAN&gt; h&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Trailing &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; l&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Leading &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;END&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;END&lt;/SPAN&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; Seq&lt;SPAN style="COLOR:gray;"&gt;,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;CASE&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;WHEN&lt;/SPAN&gt; l&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Trailing &lt;SPAN style="COLOR:gray;"&gt;=&lt;/SPAN&gt; 16 &lt;SPAN style="COLOR:blue;"&gt;THEN&lt;/SPAN&gt; h&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Trailing &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; l&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Trailing&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;ELSE&lt;/SPAN&gt; l&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Trailing&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;END&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; Trailing&lt;SPAN style="COLOR:gray;"&gt;,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;CASE&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;WHEN&lt;/SPAN&gt; h&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Leading &lt;SPAN style="COLOR:gray;"&gt;=&lt;/SPAN&gt; 16 &lt;SPAN style="COLOR:blue;"&gt;THEN&lt;/SPAN&gt; h&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Leading &lt;SPAN style="COLOR:gray;"&gt;+&lt;/SPAN&gt; l&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Leading&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;ELSE&lt;/SPAN&gt; h&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Leading&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;END&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;AS&lt;/SPAN&gt; Leading&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;FROM&lt;/SPAN&gt; TempNum tn &lt;SPAN style="COLOR:blue;"&gt;WITH &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;NOLOCK&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;INNER&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;JOIN&lt;/SPAN&gt; BitPattern l &lt;SPAN style="COLOR:blue;"&gt;WITH &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;NOLOCK&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;ON&lt;/SPAN&gt; l&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num &lt;SPAN style="COLOR:gray;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;tn&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num &lt;SPAN style="COLOR:gray;"&gt;&amp;amp;&lt;/SPAN&gt; 65535&lt;SPAN style="COLOR:gray;"&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;INNER&lt;/SPAN&gt; &lt;SPAN style="COLOR:gray;"&gt;JOIN&lt;/SPAN&gt; BitPattern h &lt;SPAN style="COLOR:blue;"&gt;WITH &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;NOLOCK&lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;ON&lt;/SPAN&gt; h&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num &lt;SPAN style="COLOR:gray;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR:gray;"&gt;(&lt;/SPAN&gt;tn&lt;SPAN style="COLOR:gray;"&gt;.&lt;/SPAN&gt;Num &lt;SPAN style="COLOR:gray;"&gt;/&lt;/SPAN&gt; 65536&lt;SPAN style="COLOR:gray;"&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:gray;"&gt;&lt;FONT size=3&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;SELECT&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt; Num&lt;SPAN style="COLOR:gray;"&gt;,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Seq&lt;SPAN style="COLOR:gray;"&gt;,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Leading&lt;SPAN style="COLOR:gray;"&gt;,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Trailing&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;INTO&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt; #Temp&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;FROM&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';"&gt; CTE&lt;SPAN style="COLOR:gray;"&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;&lt;FONT size=3&gt;GO&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;MARGIN:0in 0in 0pt 2pt;mso-layout-grid-align:none;" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY:'Courier New';COLOR:blue;"&gt;&lt;FONT size=3&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN-LEFT:2pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;Basically you join the BitPattern lookup table on the high 16 bits and again on the low 16 bits.&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/SPAN&gt;The first CASE expression in the Seq subquery performs a 3-way maximum calculation.&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/SPAN&gt;It returns the largest of:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN-LEFT:2pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV style="MARGIN-LEFT:2pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;the low word zero-bit run (l.Seq),&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV style="MARGIN-LEFT:2pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;the high word zero-bit run (h.Seq), or&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV style="MARGIN-LEFT:2pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;the count of high word trailing zero-bits + the count of low word leading zero-bits (h.Trailing + l.Leading)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P style="MARGIN-LEFT:4.65pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN-LEFT:4.65pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;The other two CASE expressions return the total number of trailing and leading zero-bits in the 32-bit number.&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/SPAN&gt;The CASE expression is needed to handle the case when the high or low word is all zero-bits.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN-LEFT:4.65pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN-LEFT:4.65pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;This particular solution took an average of about 6 seconds to calculate the longest zero-bit run for 1,000,000 numbers.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN-LEFT:4.65pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN-LEFT:4.65pt;"&gt;&lt;SPAN style="FONT-FAMILY:'Arial','sans-serif';FONT-SIZE:11pt;"&gt;To my earlier point, I created a C# solution (which itself could have been optimized) that performed the exact same calculation for 1,000,000 random 32 bit integers in 2 seconds flat.&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/SPAN&gt;So I guess there are two main points here: (1) Make sure you choose the right tool/language for the job, and (2) Whatever tool/language you choose try to play to its strengths.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;</description></item><item><title>Calculating Holidays in SQL</title><link>http://sqlblog.com/blogs/michael_coles/archive/2010/02/25/calculating-holidays-in-sql.aspx</link><pubDate>Thu, 25 Feb 2010 21:51:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:22626</guid><dc:creator>Mike C</dc:creator><description>&lt;P&gt;Ask about&amp;nbsp;nearly any kind of SQL-based date calculation in the &lt;A title="SQL Public Newsgroup" href="http://groups.google.com/group/microsoft.public.sqlserver.programming/topics?hl=en"&gt;newsgroups&lt;/A&gt;, and you'll likely get responses that include use of an &lt;A title="Auxiliary Calendar Table @ ASPFAQ" href="http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html"&gt;auxiliary calendar table&lt;/A&gt;.&amp;nbsp; It's a really good idea, and something I highly recommend to anyone who has to do date-based calculations on the server.&amp;nbsp; For those who do dimensional modeling, you'll probably notice the auxiliary calendar table closely resembles a Time dimension with one-day intervals.&amp;nbsp; I won't get into too much detail on it, since ASPFAQ and the newsgroups cover it well.&lt;/P&gt;
&lt;P&gt;What I do want to talk about is calculating holidays, which can be important when populating your auxiliary calendar table.&amp;nbsp; When you create an auxiliary calendar table you may need to perform calculations based on business days, for instance; or you may need to schedule activities before, after, or even during certain holidays.&amp;nbsp; There are two types of holidays that I'll address:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Fixed holidays that fall on the same day every year&lt;/LI&gt;
&lt;LI&gt;Floating holidays for which the date can change from year to year&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Fixed holidays include holidays that always fall on the same day each year.&amp;nbsp; Some examples of fixed holidays include &lt;A title="Merry Christmas!" href="http://en.wikipedia.org/wiki/Christmas"&gt;Christmas&lt;/A&gt; (always December 25 in the West), &lt;A title="Oh, Canada!" href="http://en.wikipedia.org/wiki/Canada_Day"&gt;Canada Day&lt;/A&gt; (always July 1), &lt;A title="July 4th!" href="http://en.wikipedia.org/wiki/Independence_Day_(United_States)"&gt;U.S. Independence Day&lt;/A&gt; (always July 4).&amp;nbsp; These are fairly easy to detect and set in your auxiliary calendar table.&amp;nbsp; Just look for the static month + day combinations in your table and update it accordingly.&lt;/P&gt;
&lt;P&gt;Floating holidays are far more interesting and difficult to calculate.&amp;nbsp; Take Easter.&amp;nbsp; Easter actually has two definitions.&amp;nbsp; The popular definition is:&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;"Easter Day is the first Sunday after the full moon that occurs next after the vernal equinox"&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;This&amp;nbsp;is not the exact ecclesiastical definition though.&amp;nbsp; The full moon here is not the astronomical full moon but an "ecclesiastical moon" that's determined&amp;nbsp;through precalculated lookup tables.&amp;nbsp; The ecclesiastical rules are:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Easter falls on the first Sunday following the first ecclesiastical full moon that occurs on or after the day of the vernal equinox&lt;/LI&gt;
&lt;LI&gt;This particular ecclesiastical full moon is the 14th day of a tabular lunation (new moon)&lt;/LI&gt;
&lt;LI&gt;The vernal equinox is fixed as March 21&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;I'm not going to recount the long and painful history leading to the modern definition of Easter--but the details&amp;nbsp;can be found on &lt;A title="Easter Controversy" href="http://en.wikipedia.org/wiki/Easter_controversy"&gt;Wikipedia&lt;/A&gt;&amp;nbsp;if you're interested.&amp;nbsp; The main point is that Easter calculation is fairly complex.&amp;nbsp; The udf_CalculateEaster function below accepts the year (integer) as a parameter and returns the date of Easter for that year (datetime).&amp;nbsp; Notice the large number of calculations required to make this function work:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CREATE FUNCTION dbo.udf_CalculateEaster &lt;BR&gt;(&lt;BR&gt;&lt;/STRONG&gt;&lt;STRONG&gt;&amp;nbsp; @Year INT&lt;BR&gt;)&lt;BR&gt;RETURNS DATETIME&lt;BR&gt;AS&lt;BR&gt;BEGIN&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE @Date DATETIME,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @c INT, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @n INT, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @i INT, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @k INT, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @j INT, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @l INT, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @m INT, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @d INT;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @n = @Year - 19 * (@Year / 19),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @c = @Year / 100,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @k = (@c - 17) / 25,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @i = @c - @c / 4 - (@c - @k) / 3 + 19 * @n + 15,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @i = @i - 30 * (@i / 30),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @i = @i - (@i / 28) * (1 - (@i / 28) * (29 / (@i + 1)) * ((21 - @n) / 11)),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @j = @Year + @Year / 4 + @i + 2 - @c + @c / 4,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @j = @j - 7 * (@j / 7),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @l = @i - @j,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @m = 3 + (@l + 40) / 44,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @d = @l + 28 - 31 * (@m / 4),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Date = CAST&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CAST(@Year AS CHAR(4)) + &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RIGHT&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '0' + CAST&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @m AS VARCHAR(2)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ), 2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) + &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RIGHT&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '0' +CAST&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @d AS VARCHAR(2)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ), 2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) AS DATETIME&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN @Date;&lt;BR&gt;END;&lt;BR&gt;GO&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;If you want the date for Easter 2010, just run a query like the following:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;SELECT dbo.udf_CalculateEaster (2010);&lt;BR&gt;GO&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The result is &lt;EM&gt;2010-04-04&lt;/EM&gt;.&lt;/P&gt;
&lt;P&gt;Another somewhat daunting type of floating holiday is the type that is based on the Nth weekday of the month. These holidays are defined using terms like "the 4th Thursday of November" (&lt;A title="Turkey Day!" href="http://en.wikipedia.org/wiki/Thanksgiving"&gt;U.S. Thanksgiving&lt;/A&gt;), "the&amp;nbsp;3rd&amp;nbsp;Monday in January" (&lt;A title="MLK Day!" href="http://en.wikipedia.org/wiki/Martin_Luther_King_Day"&gt;U.S. Martin Luther King Day&lt;/A&gt;), or even "the *last* Monday in May" (&lt;A title='Formerly "Decoration Day"' href="http://en.wikipedia.org/wiki/Memorial_day"&gt;U.S. Memorial Day&lt;/A&gt;). These floating holidays are not as hard to calculate as Easter, but still a little tricky (particularly Memorial Day).&lt;/P&gt;
&lt;P&gt;To calculate these dates we need a function like udf_nthWeekDay below. This function accepts 4 parameters:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV&gt;@n = integer that represents which instance of the weekday you're looking for.&amp;nbsp; This would be the 4 in "4th Thursday&amp;nbsp;in November".&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV&gt;@weekDay = 3-character day of week ("SUN" = Sunday, "MON" = Monday, etc.)&amp;nbsp; I used character abbreviations instead of numbers just to make it a little easier.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV&gt;@year = integer year for which to calculate&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV&gt;@month = integer month for which to calculate (1 = January, 2 = February, etc.)&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;As you can see below, the Nth weekday calculation is pretty simple.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;CREATE FUNCTION dbo.udf_nthWeekDay&lt;BR&gt;(&lt;BR&gt;&amp;nbsp; @n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT, &lt;BR&gt;&amp;nbsp; @weekDay CHAR(3),&lt;BR&gt;&amp;nbsp; @year&amp;nbsp;&amp;nbsp;&amp;nbsp; INT, &lt;BR&gt;&amp;nbsp; @month&amp;nbsp;&amp;nbsp; INT&lt;BR&gt;)&lt;BR&gt;RETURNS DATETIME&lt;BR&gt;AS&lt;BR&gt;BEGIN&lt;BR&gt;&amp;nbsp; DECLARE @date&amp;nbsp;&amp;nbsp;&amp;nbsp; DATETIME,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @dow&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @wd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp; SELECT @wd = CASE @weekDay&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN 'SUN' THEN 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN 'MON' THEN 2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN 'TUE' THEN 3&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN 'WED' THEN 4&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN 'THU' THEN 5&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN 'FRI' THEN 6&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHEN 'SAT' THEN 7&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @date = CAST&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CAST(@year AS VARCHAR(4)) +&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RIGHT&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '0' + CAST&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @month AS VARCHAR(2)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ), 2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) +&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '01' AS DATETIME&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @dow = DATEPART(dw, @date),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @offset = @wd - @dow,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @date = DATEADD(day, @offset + (@n - CASE WHEN @offset &amp;gt;= 0 THEN 1 ELSE 0 END) * 7, @date);&lt;BR&gt;&amp;nbsp; RETURN @date;&lt;BR&gt;END;&lt;BR&gt;GO&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;To get the date for Thanksgiving 2024 you could call the function like this:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;SELECT dbo.udf_nthWeekDay&lt;BR&gt;&amp;nbsp; (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'THU',&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2024, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11&lt;BR&gt;&amp;nbsp; );&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The result is &lt;EM&gt;2024-11-28&lt;/EM&gt;.&amp;nbsp; Now for a holiday like U.S. Memorial Day ("the last Monday in May") the calculation is a little trickier.&amp;nbsp; You have no idea up front how many Mondays there are in any given May.&amp;nbsp; As an example, in 2010 and 2011 there are 5 Mondays in May; in 2012 and 2013 there are only 4.&amp;nbsp; You could try to figure out the number of Mondays in May of the given year, but that's way too much work.&lt;/P&gt;
&lt;P&gt;There's one thing we know about the last Monday in May with absolute certainty:&amp;nbsp; after the last Monday in May, the next Monday we encounter will *always* be the first Monday in June.&amp;nbsp; So the easier way to figure out the last Monday in May is to calculate the first Monday in June and then back into it (subtract 7 days), like this:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;SELECT DATEADD&lt;BR&gt;(&lt;BR&gt;&amp;nbsp; day, &lt;BR&gt;&amp;nbsp; -7,&lt;BR&gt;&amp;nbsp; dbo.udf_nthWeekDay&lt;BR&gt;&amp;nbsp; (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'MON',&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2012, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&lt;BR&gt;&amp;nbsp; )&lt;BR&gt;);&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;By calculating the date of the first Monday in June 2012, we can then subtract 7 days to get the date of the last Monday of May: &lt;EM&gt;2012-05-28&lt;/EM&gt;.&lt;/P&gt;
&lt;P&gt;You can use the functions to calculate holidays for your auxiliary calendar table.&amp;nbsp; I covered U.S. federal (and some other national) holidays in this one, but it can be extended to cover other national, state, and local holidays.&lt;/P&gt;</description></item><item><title>Parent-Child Build Scripts with SQLCMD</title><link>http://sqlblog.com/blogs/michael_coles/archive/2010/01/10/parent-child-build-scripts-with-sqlcmd.aspx</link><pubDate>Sun, 10 Jan 2010 18:33:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:20821</guid><dc:creator>Mike C</dc:creator><description>&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;On the &lt;A href="http://groups.google.com/group/microsoft.public.sqlserver.programming/browse_thread/thread/7837d5428e6c83fd?hl=en#"&gt;SQL Server public programming newsgroup&lt;/A&gt; someone recently posted a question about an SSMS error (&lt;A href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=269566#details"&gt;"Cannot parse script. 'System.OutOfMemoryException' thrown."&lt;/A&gt;) I hadn’t encountered this error myself, but the workaround is to break up very large scripts (50+ MB) into smaller scripts. Adam Machanic posted a T-SQL Tuesday challenge to post &lt;A href="http://sqlblog.com/blogs/adam_machanic/archive/2010/01/04/invitation-for-t-sql-tuesday-002-a-puzzling-situation.aspx"&gt;a solution to a puzzling situation&lt;/A&gt;, so this actually gives me a good opportunity to share how I structure my own build scripts -- which avoids this issue entirely.&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;When I create database build scripts, I use the&amp;nbsp;&lt;A href="http://msdn.microsoft.com/en-us/library/ms162773.aspx"&gt;SQLCMD&lt;/A&gt; utility to run them from the command line instead of using SSMS or another tool. SQLCMD has its own &lt;A href="http://msdn.microsoft.com/en-us/library/ms162773.aspx#sectionToggle3"&gt;commands&lt;/A&gt;, which it parses separately from SQL/T-SQL statements. These commands are not understood by SQL Server or other scripting tools like SSMS (&lt;I style="mso-bidi-font-style:normal;"&gt;exception: you can run SSMS in &lt;A href="http://msdn.microsoft.com/en-us/library/ms174187.aspx"&gt;SQLCMD mode&lt;/A&gt;, but that’s another story&lt;/I&gt;). These special SQLCMD commands all start with a ":" at the front of the line.&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;The SQLCMD command that makes parent-child structured build-scripts possible is the ":r" or "run" command, which tells SQLCMD to run another script file from within the current script file. In the figure below I’ve set up a local directory structure with database object creation scripts in subdirectories:&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;IMG style="WIDTH:367px;HEIGHT:544px;" src="http://e60ybw.bay.livefilestore.com/y1pbBwOsoJdF21J9eW0lf7zCk782rocpyFX5YFOkwiggop15Lzj9HOBHrhOEoj0jRq7wdUr8BaYFFcpRou_irLDIAXzS_bY7al3/sqlcmd-folders.png" width=367 height=544&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;SPAN style="mso-no-proof:yes;"&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;The &lt;EM&gt;\Scripts&lt;/EM&gt; directory contains a &lt;EM&gt;Create.All.Sql&lt;/EM&gt; script. This script uses the SQLCMD &lt;EM&gt;run&lt;/EM&gt; command to execute the &lt;EM&gt;Database\Create.Database.Sql&lt;/EM&gt; script, the &lt;EM&gt;Create.All.Schemas.Sql&lt;/EM&gt; script, and so on.&lt;SPAN style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/SPAN&gt;The &lt;EM&gt;Create.All.Schemas.Sql&lt;/EM&gt; script calls the &lt;EM&gt;Person.Schema.Sql&lt;/EM&gt; and &lt;EM&gt;Sales.Schema.Sql&lt;/EM&gt; scripts in turn. The other &lt;EM&gt;Create.All.*&lt;/EM&gt; scripts each call the object creation scripts in their subdirectories as well. Here’s what my Create.All.Sql script looks like:&lt;/FONT&gt;&lt;/P&gt;&lt;PRE&gt;/*&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Create All Items&lt;BR&gt;*/&lt;BR&gt;&lt;BR&gt;
:r Database\Create.Database.sql&lt;BR&gt;:r Schemas\Create.All.Schemas.sql&lt;BR&gt;:r Types\Create.All.Types.sql&lt;BR&gt;:r Tables\Create.All.Tables.sql&lt;FONT size=3 face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;Each &lt;EM&gt;:r&lt;/EM&gt; command kicks off the next level of child packages in turn.&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;SQLCMD has another great feature known as scripting variables that you can use to create dynamic scripts. Essentially you define a scripting variable on the command line with SQLCMD's &lt;EM&gt;-v&lt;/EM&gt; command line option. Now the way scripting variables work, they are replaced wholesale in your scripts with their replacement value. So if you define a scripting variable named &lt;EM&gt;environment&lt;/EM&gt; you can replace it with a value like "Dev", "QA" or "Prod" anywhere it occurs in your script. This is great for making dynamic scripts that need to be built across multiple environments.&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;In the example I've used a scripting variable named &lt;EM&gt;database&lt;/EM&gt;. You can set the value of the &lt;EM&gt;database&lt;/EM&gt; variable from the command line with the &lt;EM&gt;-v&lt;/EM&gt; option. In the example below I set the &lt;EM&gt;database&lt;/EM&gt; variable to the value "Test".&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;&lt;IMG style="WIDTH:843px;HEIGHT:187px;" title="SQLCMD Sample Command Line" alt="SQLCMD Sample Command Line" src="http://e60ybw.bay.livefilestore.com/y1py7Y3IXJHMFCeZDgZtZNWmVfQwxljC67X_AsNqD8JsJ1OM2OCxuApxSfz5V1Ze44963nb3_tZV4GUah4-4Dj0disbCrc5c7FD/Set-Scripting-Variable.png" width=843 height=187&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;SPAN style="mso-no-proof:yes;"&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;The nice thing about the SQLCMD scripting variables is that once you declare them you can access them from the parent script you run (in this case &lt;EM&gt;Create.All.Sql&lt;/EM&gt;) or from any child scripts that are run (like &lt;EM&gt;Create.Database.Sql&lt;/EM&gt;, &lt;EM&gt;Create.All.Schemas.Sql&lt;/EM&gt;, &lt;EM&gt;Person.Schema.Sql&lt;/EM&gt; and &lt;EM&gt;Sales.Schema.Sql&lt;/EM&gt;). Here’s the &lt;EM&gt;Create.Database.Sql&lt;/EM&gt; script from the example:&lt;/FONT&gt;&lt;/P&gt;&lt;PRE&gt;/*&lt;BR&gt;&lt;BR&gt;&amp;nbsp;Create database&lt;BR&gt;&lt;BR&gt;*/&lt;BR&gt;&lt;BR&gt;USE master;&lt;BR&gt;GO&lt;BR&gt;&lt;BR&gt;
CREATE DATABASE &lt;STRONG&gt;&lt;U&gt;$(database)&lt;/U&gt;&lt;/STRONG&gt;;&lt;BR&gt;GO&lt;FONT size=3 face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;The scripting variable is accessed in the script with &lt;EM&gt;$(database)&lt;/EM&gt;. The scripting variable is replaced with its value by SQLCMD, so in the example SQL Server sees this:&lt;/FONT&gt;&lt;/P&gt;&lt;PRE&gt;/*&lt;BR&gt;&lt;BR&gt;&amp;nbsp;Create database&lt;BR&gt;&lt;BR&gt;*/&lt;BR&gt;&lt;BR&gt;USE master;&lt;BR&gt;GO&lt;BR&gt;&lt;BR&gt;
CREATE DATABASE &lt;STRONG&gt;&lt;U&gt;Test&lt;/U&gt;&lt;/STRONG&gt;;&lt;BR&gt;GO&lt;FONT size=3 face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;One thing to keep in mind when you use this scripting pattern is that every script should end with the batch terminator (default is "GO").&amp;nbsp; If not you could end up with one script running into another and get some strange, not-very-helpful&amp;nbsp;error messages.&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;Another thing you need to know is that scripting variables are replaced &lt;EM&gt;wholesale&lt;/EM&gt; with their replacement text. This makes&amp;nbsp;them very flexible, since you can replace text anywhere in the script with anything you want. It can also be dangerous if your script is run by someone with malicious intent. A malicious user can replace a scripting variable with T-SQL statements that could damage your data or database structure; so keep your scripting variable-enabled scripts out of the hands of potentially malicious users.&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN:0in 0in 10pt;" class=MsoNormal&gt;&lt;FONT size=3 face=Calibri&gt;I've attached a sample ZIP file with the directory structure shown in the example above. The scripts build out a few database objects from the AdventureWorks sample database.&lt;/FONT&gt;&lt;/P&gt;</description></item><item><title>Please Vote: Windowing Enhancements in SQL Server</title><link>http://sqlblog.com/blogs/michael_coles/archive/2009/11/19/please-vote-windowing-enhancements-in-sql-server.aspx</link><pubDate>Fri, 20 Nov 2009 03:45:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:19010</guid><dc:creator>Mike C</dc:creator><description>&lt;P&gt;Back in January 2007, SQL guru &lt;A title="Itzik's Site" href="http://www.solidq.com/insidetsql/"&gt;Itzik Ben-Gan&lt;/A&gt; posted a series of &lt;A title="Itzik's Connect Requests" href="https://connect.microsoft.com/SQLServer/SearchResults.aspx?UserHandle=Itzik+Ben-Gan"&gt;MS Connect enhancement requests&lt;/A&gt; concerning windowing function enhancements.&amp;nbsp; Those who have used the &lt;A title="ROW_NUMBER() in BOL" href="http://msdn.microsoft.com/en-us/library/ms186734.aspx"&gt;ROW_NUMBER()&lt;/A&gt;, &lt;A title="RANK() in BOL" href="http://msdn.microsoft.com/en-us/library/ms176102.aspx"&gt;RANK()&lt;/A&gt;, &lt;A title="DENSE_RANK() in BOL" href="http://msdn.microsoft.com/en-us/library/ms173825.aspx"&gt;DENSE_RANK()&lt;/A&gt;, and &lt;A title="NTILE() at BOL" href="http://msdn.microsoft.com/en-us/library/ms175126.aspx"&gt;NTILE()&lt;/A&gt; functions on SQL 2005 and 2008, you already know how useful they are.&amp;nbsp; They simplify code and can improve performance considerably over the alternatives, which usually include self-joins, temp tables and/or cursors in various combinations.&lt;/P&gt;
&lt;P&gt;Well, the windowing functionality that you've seen in SQL 2005 and 2008 is just the tip of the iceberg.&amp;nbsp; The ISO SQL standard actually defines several additional options for these functions that SQL Server doesn't yet support. These additional options allow you to do some pretty amazing calculations. The ROWS and RANGE window subclauses that the standard defines allows you to perform "sliding window" calculations; the ORDER BY clause for aggregate functions which simplifies complex running sum (and other) calculations.&lt;/P&gt;
&lt;P&gt;As a SQL developer or DBA, these enhancements will simplify your life.&amp;nbsp; But don't take my word for it - read Itzik's white paper at &lt;A href="http://www.insidetsql.com/OVER_Clause_and_Ordered_Calculations.doc"&gt;http://www.insidetsql.com/OVER_Clause_and_Ordered_Calculations.doc&lt;/A&gt;.&amp;nbsp; Then let Microsoft know you want these enhancements in SQL Server by&amp;nbsp;voting on Itzik's enhancement requests at the following links:&lt;/P&gt;
&lt;DIV&gt;Progressive Ordered Calculations: &lt;A href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254397"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254397&lt;/A&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;FIRST_VALUE, LAST_VALUE functions: &lt;A href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254395"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254395&lt;/A&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;DISTINCT clause for aggregates: &lt;A href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254393"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254393&lt;/A&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;ROWS and RANGE window subclauses: &lt;A href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254392"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254392&lt;/A&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;Vector expressions: &lt;A href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254391"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254391&lt;/A&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;TOP OVER: &lt;A href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254390"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254390&lt;/A&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;LAG and LEAD functions: &lt;A href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254388"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254388&lt;/A&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;ORDER BY for aggregates:&amp;nbsp;&lt;A href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254387"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=254387&lt;/A&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;Read Itzik's article, vote on the Connect items, and spread the word!&lt;/DIV&gt;</description></item><item><title>Mission Accomplished: NJSQL Saturday Event</title><link>http://sqlblog.com/blogs/michael_coles/archive/2009/10/24/mission-accomplished-njsql-saturday-event.aspx</link><pubDate>Sun, 25 Oct 2009 00:03:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:18207</guid><dc:creator>Mike C</dc:creator><description>&lt;P&gt;Thanks to all those who made the&amp;nbsp;NJSQL Saturday event held in Iselin, NJ today a success!&lt;/P&gt;
&lt;P&gt;Those lucky enough to attend were given a sneak preview of one of the best young presenters out there--MVP Jacob Sebastian--who will also be speaking at PASS.&amp;nbsp; I have to hand it to Jacob: he gave one of the best presentations on a SQL Server topic I think I've seen yet.&amp;nbsp; Between yours truly, Jacob Sebastian, and Robert Pearl, attendees learned best practices for defensive coding and error handling (XACT_ABORT anybody?), learned the concepts behind SQL Server's new spatial data types and saw how to make use them in conjunction with Web-based mapping apps (where's that A Train run again?), and learned a bit about auditing and the internals of the transaction log and CDC.&lt;/P&gt;
&lt;P&gt;Thanks to NJSQL leader and event coordinator Melissa Demsak, attendees had&amp;nbsp;plenty to eat and everyone got a chance to win several door prizes including t-shirts, books, and copies of Windows 7 Pro and Ultimate (Steve Ballmer's signature edition, no less)!&lt;/P&gt;
&lt;P&gt;For those who asked for it, I'll be cleaning up my sample code and sample geospatial database to shrink it down and pass it along (with the other presentation materials) to Melissa for posting.&amp;nbsp; Currently the sample database is about 99 MB in size, but it contains several tables that aren't really necessary for the demo code to run.&amp;nbsp; Today I presented on the SQL Server geospatial "what" and "why";&amp;nbsp;at the NJSQL UG meeting in November I'll be diving into the "how".&amp;nbsp;&amp;nbsp;Check back at &lt;A href="http://www.njsql.org/"&gt;http://www.njsql.org&lt;/A&gt; for details.&lt;/P&gt;
&lt;P&gt;Thanks again to all our sponsors and the NJSQL and NYC SQL Server UG for making this event happen!&lt;/P&gt;</description></item><item><title>&amp;quot;Cloning&amp;quot; Symmetric Keys</title><link>http://sqlblog.com/blogs/michael_coles/archive/2009/06/17/cloning-symmetric-keys.aspx</link><pubDate>Thu, 18 Jun 2009 01:40:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:14741</guid><dc:creator>Mike C</dc:creator><description>&lt;P&gt;It's well-known by now that SQL Server 2005 and 2008 include new encryption-related statements that allow you to create and administer encryption keys. You can use &lt;FONT face=courier&gt;CREATE CERTIFICATE&lt;/FONT&gt; to create or&amp;nbsp;import a certificate or &lt;FONT face=courier&gt;DROP ASYMMETRIC KEY&lt;/FONT&gt; to remove an asymmetric key from the database, for instance.&amp;nbsp; One of the interesting ommissions from the T-SQL encryption statements is the statements necessary to backup and restore a symmetric key.&amp;nbsp; Why would you want to do this?&amp;nbsp; I can think of a couple of reasons off the top of my head:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;You need to backup symmetric keys (and all other encryption keys, in fact) as part of an overall disaster recovery (DR) program.&amp;nbsp; If a server needs to be rebuilt you obviously need a way to restore all encryption keys.&lt;/LI&gt;
&lt;LI&gt;You need to implement the same symmetric keys on multiple servers.&amp;nbsp; There could be a couple of reasons for this -- you might encrypt data on one server and decrypt it on another, or you might be load-balancing across a server farm and need identical encryption keys on multiple servers simultaneously.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;It seems like a bit of an oversight to not include &lt;FONT face=courier&gt;BACKUP&lt;/FONT&gt; and &lt;FONT face=courier&gt;RESTORE SYMMETRIC KEY&lt;/FONT&gt; options in T-SQL, but in practice you can effectively achieve the same end results with the standard &lt;FONT face=courier&gt;CREATE SYMMETRIC KEY&lt;/FONT&gt; statement.&amp;nbsp; Basically the &lt;FONT face=courier&gt;CREATE SYMMETRIC KEY&lt;/FONT&gt; statement gives you an option to "clone" the exact same symmetric key on any SQL Server 2005 or 2008 instance, anywhere, at any time.&amp;nbsp; To create a cloneable symmetric key you need to specify two special &lt;FONT face=courier&gt;CREATE SYMMETRIC KEY&lt;/FONT&gt; options:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;The &lt;FONT face=courier&gt;IDENTITY_VALUE&lt;/FONT&gt; option, which SQL Server uses to generate a GUID (uniqueidentifier) for the key&lt;/LI&gt;
&lt;LI&gt;The &lt;FONT face=courier&gt;KEY_SOURCE&lt;/FONT&gt; option, which SQL Server uses as key material to generate the actual key&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;As long as you specify the same values for the &lt;FONT face=courier&gt;IDENTITY_VALUE&lt;/FONT&gt; and &lt;FONT face=courier&gt;KEY_SOURCE&lt;/FONT&gt; options (and the same &lt;FONT face=courier&gt;ALGORITHM&lt;/FONT&gt;), your symmetric key will be exactly the same no matter where, when, or how many times&amp;nbsp;you create it.&amp;nbsp; To be honest, if I were creating a list, always use &lt;FONT face=courier&gt;IDENTITY_VALUE&lt;/FONT&gt; and &lt;FONT face=courier&gt;KEY_SOURCE&lt;/FONT&gt; would be listed in the top 10 list of SQL Server encryption best practices.&lt;/P&gt;
&lt;P&gt;Here's a quick sample demonstrating the &lt;FONT face=courier&gt;CREATE SYMMETRIC KEY&lt;/FONT&gt; statement with &lt;FONT face=courier&gt;IDENTITY_VALUE&lt;/FONT&gt; and &lt;FONT face=courier&gt;KEY_SOURCE&lt;/FONT&gt; specified:&lt;/P&gt;
&lt;P&gt;&lt;FONT face=courier&gt;CREATE SYMMETRIC KEY test_aes128_key&lt;BR&gt;WITH KEY_SOURCE = 'I am the very model of a modern major general',&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IDENTITY_VALUE = 'E pluribus unum',&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALGORITHM = AES_128&lt;BR&gt;ENCRYPTION BY PASSWORD = &lt;A href="mailto:'p@$$w0rd'"&gt;'p@$$w0rd'&lt;/A&gt;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;This &lt;FONT face=courier&gt;CREATE SYMMETRIC KEY&lt;/FONT&gt; statement will create the same symmetric encryption key on any SQL Server 2005 or 2008 instance on which you run it.&amp;nbsp; This brings up another point, about security.&amp;nbsp; If the same &lt;FONT face=courier&gt;KEY_SOURCE&lt;/FONT&gt; and &lt;FONT face=courier&gt;IDENTITY_VALUE&lt;/FONT&gt; options can create the exact same encryption key on any of your servers, they will create the exact same encryption key on any of my servers, or any server owned by any hacker anywhere in the world.&amp;nbsp; So once you've run your &lt;FONT face=courier&gt;CREATE SYMMETRIC KEY&lt;/FONT&gt; statement, the &lt;FONT face=courier&gt;IDENTITY_VALUE&lt;/FONT&gt; and &lt;FONT face=courier&gt;KEY_SOURCE&lt;/FONT&gt; need to be handled like any other secure information.&amp;nbsp; Don't leave them lying around where just anyone can access them.&amp;nbsp; Store them with your certificates, key backups, and other confidential materials in a secure off-site location.&lt;/P&gt;
&lt;P&gt;So what happens when you don't specify the &lt;FONT face=courier&gt;IDENTITY_VALUE&lt;/FONT&gt; and &lt;FONT face=courier&gt;KEY_SOURCE&lt;/FONT&gt; options?&amp;nbsp; Well, basically SQL Server generates an unpredictable GUID to identify the symmetric key and the encryption key source material is randomly generated.&amp;nbsp; Basically you'll never regenerate the exact same key again.&amp;nbsp; Ever.&amp;nbsp; There could be situations where this would be handy.&amp;nbsp; The concept of "session keys" comes to mind.&amp;nbsp; A session key is basically a "temporary" key that's only required to encrypt data for a user during a single session.&amp;nbsp; Since it only exists for the life of the session, a totally randomly-generated key is just fine.&lt;/P&gt;
&lt;P&gt;For my tastes, it would make more sense to require &lt;FONT face=courier&gt;IDENTITY_VALUE&lt;/FONT&gt; and &lt;FONT face=courier&gt;KEY_SOURCE&lt;/FONT&gt; options by default. If you didn't want to specify both of these options there should be another option/indicator specifically to say that you want these options generated randomly.&amp;nbsp; At any rate, it's a good idea to get into the habit of treating these options as if they are mandatory unless they have a very specific special-purpose requirement (e.g., "session keys").&lt;/P&gt;</description></item></channel></rss>