<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-30443364</id><updated>2012-01-23T00:24:19.978+01:00</updated><category term='CTE SQL SQLServer'/><title type='text'>Code.I.net</title><subtitle type='html'>Codeine is a drug which is used to relieve pain, especially headaches. 
.Net is a (Micro)soft drug to induce pain,
especially headaches.

Delphi programming</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codeinet.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codeinet.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tom Øyvind Hogstad</name><uri>http://www.blogger.com/profile/14958448086518497717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-30443364.post-5353722013953212313</id><published>2007-05-17T21:28:00.001+02:00</published><updated>2008-10-10T00:01:22.261+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CTE SQL SQLServer'/><title type='text'>The Luhn algorithm using a recursive CTE</title><content type='html'>The other day I needed to implement the modulus 10 function in SQL.&lt;br /&gt;From &lt;a href="http://en.wikipedia.org/wiki/Modulus_10"&gt;Wikipedia&lt;/a&gt;&lt;blockquote&gt;The &lt;b&gt;Luhn algorithm&lt;/b&gt; or &lt;b&gt;Luhn formula&lt;/b&gt;, also known as the "&lt;a href="http://en.wikipedia.org/wiki/Modular_arithmetic" title="Modular arithmetic"&gt;modulus&lt;/a&gt; 10" or "mod 10" &lt;a href="http://en.wikipedia.org/wiki/Algorithm" title="Algorithm"&gt;algorithm&lt;/a&gt;, is a simple &lt;a href="http://en.wikipedia.org/wiki/Checksum" title="Checksum"&gt;checksum&lt;/a&gt; formula used to validate a variety of identification numbers, such as &lt;a href="http://en.wikipedia.org/wiki/Credit_card#Credit_card_numbering" title="Credit card"&gt;credit card numbers&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Canada" title="Canada"&gt;Canadian&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Social_Insurance_Number" title="Social Insurance Number"&gt;Social Insurance Numbers&lt;/a&gt;. It was created by &lt;a href="http://en.wikipedia.org/wiki/IBM" title="IBM"&gt;IBM&lt;/a&gt; scientist &lt;a href="http://en.wikipedia.org/wiki/Hans_Peter_Luhn" title="Hans Peter Luhn"&gt;Hans Peter Luhn&lt;/a&gt; and described in &lt;a href="http://patft.uspto.gov/netacgi/nph-Parser?patentnumber=2950048" class="external text" title="http://patft.uspto.gov/netacgi/nph-Parser?patentnumber=2950048" rel="nofollow"&gt;U.S. Patent 2,950,048&lt;/a&gt;&lt;span class="PDFlink noprint"&gt;&lt;a href="http://www.pat2pdf.org/pat2pdf/foo.pl?number=2950048" class="external text" title="http://www.pat2pdf.org/pat2pdf/foo.pl?number=2950048" rel="nofollow"&gt; &lt;/a&gt;&lt;/span&gt;, filed on &lt;a href="http://en.wikipedia.org/wiki/January_6" title="January 6"&gt;January 6&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/1954" title="1954"&gt;1954&lt;/a&gt;, and granted on &lt;a href="http://en.wikipedia.org/wiki/August_23" title="August 23"&gt;August 23&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/1960" title="1960"&gt;1960&lt;/a&gt;.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;I found this rather nice recursive way to do it in SQL Server 2005&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:8;"&gt;CREATE&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;FUNCTION&lt;span style="color: rgb(0, 0, 0);"&gt; dbo&lt;span style="color: rgb(128, 128, 128);"&gt;.&lt;span style="color: rgb(0, 0, 0);"&gt;Modulus10 &lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(0, 0, 0);"&gt;@num &lt;span style="color: rgb(0, 0, 255);"&gt;INT&lt;span style="color: rgb(128, 128, 128);"&gt;)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;RETURNS&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;INT&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;DECLARE&lt;span style="color: rgb(0, 0, 0);"&gt; @result &lt;span style="color: rgb(0, 0, 255);"&gt;INT&lt;span style="color: rgb(128, 128, 128);"&gt;;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;DECLARE&lt;span style="color: rgb(0, 0, 0);"&gt; @snum &lt;span style="color: rgb(0, 0, 255);"&gt;VARCHAR&lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(0, 0, 0);"&gt;100&lt;span style="color: rgb(128, 128, 128);"&gt;);&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SET&lt;span style="color: rgb(0, 0, 0);"&gt; @snum &lt;span style="color: rgb(128, 128, 128);"&gt;=&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;CAST&lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(0, 0, 0);"&gt;@num &lt;span style="color: rgb(0, 0, 255);"&gt;AS&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;VARCHAR&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(0, 0, 0);"&gt;100&lt;span style="color: rgb(128, 128, 128);"&gt;));&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;-- converts num to a string value&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;WITH&lt;span style="color: rgb(0, 0, 0);"&gt; Partials&lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(0, 0, 0);"&gt;n&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;span style="color: rgb(0, 0, 0);"&gt; odd&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;span style="color: rgb(0, 0, 0);"&gt;  even&lt;span style="color: rgb(128, 128, 128);"&gt;)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;AS&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SELECT&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;LEN&lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(0, 0, 0);"&gt;@snum&lt;span style="color: rgb(128, 128, 128);"&gt;)+&lt;span style="color: rgb(0, 0, 0);"&gt;2 &lt;span style="color: rgb(0, 0, 255);"&gt;AS&lt;span style="color: rgb(0, 0, 0);"&gt;  n&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;-- Ignores the  first row by starting at offset + 2 to make the code more readable&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;       0 &lt;span style="color: rgb(0, 0, 255);"&gt;AS&lt;span style="color: rgb(0, 0, 0);"&gt; odd&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;       0 &lt;span style="color: rgb(0, 0, 255);"&gt;AS&lt;span style="color: rgb(0, 0, 0);"&gt; even&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;UNION&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(128, 128, 128);"&gt;ALL&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SELECT&lt;span style="color: rgb(0, 0, 0);"&gt; n &lt;span style="color: rgb(128, 128, 128);"&gt;-&lt;span style="color: rgb(0, 0, 0);"&gt; 2&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;span style="color: rgb(0, 128, 0);"&gt;-- "loop" counter&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;       &lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(255, 0, 255);"&gt;CAST&lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(255, 0, 255);"&gt;COALESCE&lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(255, 0, 255);"&gt;SUBSTRING&lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(0, 0, 0);"&gt;@snum&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;span style="color: rgb(0, 0, 0);"&gt; n &lt;span style="color: rgb(128, 128, 128);"&gt;-&lt;span style="color: rgb(0, 0, 0);"&gt; 2 &lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;span style="color: rgb(0, 0, 0);"&gt; 1&lt;span style="color: rgb(128, 128, 128);"&gt;),&lt;span style="color: rgb(255, 0, 0);"&gt;'0'&lt;span style="color: rgb(128, 128, 128);"&gt;)&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;AS&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;INT&lt;span style="color: rgb(128, 128, 128);"&gt;)&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;-- Extracting the n'th  odd digit&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;span style="color: rgb(128, 128, 128);"&gt;*&lt;span style="color: rgb(0, 0, 0);"&gt; 2 &lt;span style="color: rgb(128, 128, 128);"&gt;/&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;CAST&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(0, 0, 0);"&gt;10 &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;INT&lt;span style="color: rgb(128, 128, 128);"&gt;))&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;       &lt;span style="color: rgb(128, 128, 128);"&gt;+&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;       &lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(255, 0, 255);"&gt;CAST&lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(255, 0, 255);"&gt;COALESCE&lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(255, 0, 255);"&gt;SUBSTRING&lt;span style="color: rgb(128, 128, 128);"&gt;(&lt;span style="color: rgb(0, 0, 0);"&gt;@snum&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;span style="color: rgb(0, 0, 0);"&gt; n &lt;span style="color: rgb(128, 128, 128);"&gt;-&lt;span style="color: rgb(0, 0, 0);"&gt; 2&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;span style="color: rgb(0, 0, 0);"&gt;  1&lt;span style="color: rgb(128, 128, 128);"&gt;),&lt;span style="color: rgb(255, 0, 0);"&gt;'0'&lt;span style="color: rgb(128, 128, 128);"&gt;)&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;AS&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;INT&lt;span style="color: rgb(128, 128, 128);"&gt;)&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;-- Extracting the n'th odd digit&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;span style="color: rgb(128, 128, 128);"&gt;*&lt;span style="color: rgb(0, 0, 0);"&gt; 2 &lt;span style="color: rgb(128, 128, 128);"&gt;%&lt;span style="color: rgb(0, 0, 0);"&gt; 10&lt;span style="color: rgb(128, 128, 128);"&gt;)&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;AS&lt;span style="color: rgb(0, 0, 0);"&gt; odd&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;       &lt;span style="color: rgb(255, 0, 255);"&gt;CAST&lt;span style="color: rgb(0, 0, 0);"&gt; (COALESCE (SUBSTRING(@snum, n - 3,  1), '0') AS  INT) AS even -- Extracting the  n'th even digit&lt;br /&gt;FROM  Partials&lt;br /&gt;WHERE n &gt;= 1)&lt;br /&gt;SELECT @result =(CASE (sum(odd + even) % 10)&lt;br /&gt;                 WHEN 0 THEN (sum(odd +  even) % 10) ELSE 10 -(sum(odd + even) % 10)&lt;br /&gt;               END)&lt;br /&gt;FROM Partials;&lt;br /&gt;RETURN(@result)&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Listen to &lt;a href="http://www.boheme.no"&gt;Boheme Radio&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Delphi programming RuleZ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30443364-5353722013953212313?l=codeinet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://en.wikipedia.org/wiki/Modulus_10' title='The Luhn algorithm using a recursive CTE'/><link rel='replies' type='application/atom+xml' href='http://codeinet.blogspot.com/feeds/5353722013953212313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30443364&amp;postID=5353722013953212313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/5353722013953212313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/5353722013953212313'/><link rel='alternate' type='text/html' href='http://codeinet.blogspot.com/2007/05/luhn-algorithm-using-recursive-cte.html' title='The Luhn algorithm using a recursive CTE'/><author><name>Tom Øyvind Hogstad</name><uri>http://www.blogger.com/profile/14958448086518497717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30443364.post-115736513606387738</id><published>2006-09-04T12:18:00.000+02:00</published><updated>2006-09-04T12:30:02.023+02:00</updated><title type='text'>Audit table data changes in SQL Server 2005</title><content type='html'>&lt;p&gt;Some time ago I happened to comment on the&amp;nbsp;post, "&lt;a href="http://weblogs.sqlteam.com/brettk/archive/2006/08/10/11126.aspx"&gt;How do I track data changes in a database&lt;/a&gt;" ...&lt;/p&gt; &lt;p&gt;My comment didn't come out as understandable, so I wrote this little piece to explain how to audit changes in a table.&lt;/p&gt; &lt;p&gt;First I create a table to record the changed data:&lt;/p&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: blue"&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;[dbo].[Audits]&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray"&gt;( &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;[rowguid]&amp;nbsp;uniqueidentifier&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray"&gt;NOT&amp;nbsp;NULL, &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;[timestamp]&amp;nbsp;datetime&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;DEFAULT&amp;nbsp;&lt;/span&gt;&lt;span style="color: magenta"&gt;GETDATE&lt;/span&gt;&lt;span style="color: gray"&gt;()&amp;nbsp;NOT&amp;nbsp;NULL, &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;[table_name]&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;VARCHAR&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: black"&gt;255&lt;/span&gt;&lt;span style="color: gray"&gt;)&amp;nbsp;NOT&amp;nbsp;NULL, &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;[user]&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;VARCHAR&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: black"&gt;255&lt;/span&gt;&lt;span style="color: gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;DEFAULT&amp;nbsp;&lt;/span&gt;&lt;span style="color: magenta"&gt;SUSER_SNAME&lt;/span&gt;&lt;span style="color: gray"&gt;()&amp;nbsp;NOT&amp;nbsp;NULL, &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;[data]&amp;nbsp;xml&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray"&gt;NOT&amp;nbsp;NULL, &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;CONSTRAINT&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;[Audits_pk]&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;PRIMARY&amp;nbsp;KEY&amp;nbsp;CLUSTERED&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: black"&gt;[rowguid]&lt;/span&gt;&lt;span style="color: gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;[timestamp]&lt;/span&gt;&lt;span style="color: gray"&gt;) &lt;br&gt;) &lt;br&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;ON&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;[PRIMARY]&lt;/span&gt;&lt;/code&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: black"&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Then I create a trigger for the tables I wish to audit, if you wish you can automate this for all your tables.&amp;nbsp;&lt;/p&gt; &lt;p&gt;I use the contact table from the Adventureworks sample database to illustrate this example. It is important to add an UNIQUEIDENTIFIER column to your tables to make this work. The adventureworks database is full of such columns for replication use ...&lt;/p&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: blue"&gt;CREATE&amp;nbsp;TRIGGER&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;[Person].[Contact_Audit_tr]&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;ON&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;[Person].[Contact] &lt;br&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;WITH&amp;nbsp;EXECUTE&amp;nbsp;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;CALLER &lt;br&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;FOR&amp;nbsp;UPDATE&lt;/span&gt;&lt;span style="color: gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;DELETE &lt;br&gt;AS &lt;br&gt;BEGIN &lt;br&gt;&amp;nbsp;&amp;nbsp;SET&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;NOCOUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;ON &lt;br&gt;&amp;nbsp;&amp;nbsp;DECLARE&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@deletedrows&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;TABLE&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: black"&gt;id&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;INT&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;IDENTITY&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: black"&gt;1&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: black"&gt;1&lt;/span&gt;&lt;span style="color: gray"&gt;),&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;rowguid&amp;nbsp;UNIQUEIDENTIFIER&lt;/span&gt;&lt;span style="color: gray"&gt;) &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;DECLARE&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@rowcount&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;INT &lt;br&gt;&amp;nbsp;&amp;nbsp;DECLARE&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@i&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;INT &lt;br&gt;&amp;nbsp;&amp;nbsp;DECLARE&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@table_name&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;VARCHAR&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: black"&gt;255&lt;/span&gt;&lt;span style="color: gray"&gt;) &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;DECLARE&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@data&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;XML &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;DECLARE&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@rowguid&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;UNIQUEIDENTIFIER &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: green"&gt;--&amp;nbsp;Obtain&amp;nbsp;the&amp;nbsp;name&amp;nbsp;of&amp;nbsp;the&amp;nbsp;table&amp;nbsp;the&amp;nbsp;trigger&amp;nbsp;belongs&amp;nbsp;to &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@table_name&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: magenta"&gt;OBJECT_NAME&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: black"&gt;parent_obj&lt;/span&gt;&lt;span style="color: gray"&gt;) &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;FROM &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;sys.sysobjects &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;WHERE &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;id&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@@PROCID &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: green"&gt;--&amp;nbsp;Using&amp;nbsp;a&amp;nbsp;while&amp;nbsp;loop&amp;nbsp;instead&amp;nbsp;of&amp;nbsp;a&amp;nbsp;cursor&amp;nbsp;because&amp;nbsp;cursors&amp;nbsp;are&amp;nbsp;evil&amp;nbsp;:-) &lt;br&gt;&amp;nbsp;&amp;nbsp;--&amp;nbsp;I&amp;nbsp;wish&amp;nbsp;I&amp;nbsp;could&amp;nbsp;specify&amp;nbsp;that&amp;nbsp;a&amp;nbsp;trigger&amp;nbsp;was&amp;nbsp;guaranteed&amp;nbsp;to&amp;nbsp;fire&amp;nbsp;for&amp;nbsp;a&amp;nbsp;single&amp;nbsp;row &lt;br&gt;&amp;nbsp;&amp;nbsp;--&amp;nbsp;How&amp;nbsp;can&amp;nbsp;I&amp;nbsp;test&amp;nbsp;a&amp;nbsp;case&amp;nbsp;where&amp;nbsp;I&amp;nbsp;get&amp;nbsp;multiple&amp;nbsp;rows&amp;nbsp;in&amp;nbsp;the&amp;nbsp;deleted&amp;nbsp;or&amp;nbsp;insert&amp;nbsp;table?? &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;INSERT&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@deletedrows&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: black"&gt;rowguid&lt;/span&gt;&lt;span style="color: gray"&gt;) &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;rowguid&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;DELETED &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;SET&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@rowcount&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@@ROWCOUNT &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;SET&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@i&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;1 &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;WHILE&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@i&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@rowcount &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;BEGIN &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@rowguid&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;rowguid &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@deletedrows &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;WHERE &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;id&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@i &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;SET&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@data&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray"&gt;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;DELETED&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;WHERE&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;rowguid&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@rowguid&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;FOR&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;XML&amp;nbsp;AUTO&lt;/span&gt;&lt;span style="color: gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;ELEMENTS&lt;/span&gt;&lt;span style="color: gray"&gt;) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;INSERT&amp;nbsp;INTO&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;dbo.Audits&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: black"&gt;rowguid&lt;/span&gt;&lt;span style="color: gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;table_name&lt;/span&gt;&lt;span style="color: gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: black"&gt;data&lt;/span&gt;&lt;span style="color: gray"&gt;) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;VALUES&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: #434343"&gt;@rowguid&lt;/span&gt;&lt;span style="color: gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@table_name&lt;/span&gt;&lt;span style="color: gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@data&lt;/span&gt;&lt;span style="color: gray"&gt;) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;SET&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@i&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #434343"&gt;@i&lt;/span&gt;&lt;span style="color: gray"&gt;+&lt;/span&gt;&lt;span style="color: black"&gt;1 &lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;END &lt;br&gt;END&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;Thats it, you got the previous verisons of the changed rows stored as XML. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30443364-115736513606387738?l=codeinet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinet.blogspot.com/feeds/115736513606387738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30443364&amp;postID=115736513606387738' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115736513606387738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115736513606387738'/><link rel='alternate' type='text/html' href='http://codeinet.blogspot.com/2006/09/audit-table-data-changes-in-sql-server.html' title='Audit table data changes in SQL Server 2005'/><author><name>Tom Øyvind Hogstad</name><uri>http://www.blogger.com/profile/14958448086518497717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30443364.post-115657828469815399</id><published>2006-08-26T09:44:00.000+02:00</published><updated>2006-08-29T19:15:58.670+02:00</updated><title type='text'>SQLMan</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5442/3265/1600/SQLMan.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/5442/3265/400/SQLMan.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Is it a plane? Is it a ... No it's SQLMan!! Forged in the laboratory of Dr. Codd, he got the powers of SQL:2003, ISO-11179 and ISO-8601. He is here to rescue us from Web 2.0 XP-Agile-cowboy coders, who have just discovered the incredible powers of the relational database. But in theire feeble quest to take over the world, they misuse their new found powers using surrogate keys, map tables to classes, don't abstract from the underlaying architecture, thinking colums are fields and reading "&lt;a href="http://www.amazon.com/gp/product/0672324423"&gt;Teach yourself SQL in 24 hours&lt;/a&gt;" rader than "&lt;a href="http://www.amazon.com/gp/product/0120887975"&gt;SQL programming Style&lt;/a&gt;". The powers of SQL takes decenniums to master, in the wrong unexperienced hands it may be a totally disaster. Luckily SQLman is here now!&lt;br /&gt;Read about he's ongoing fight against the unlighted &lt;a href="http://joecelkothesqlapprentice.blogspot.com/"&gt;here&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;This post was inspired by &lt;a href="http://blogs.msdn.com/khen1234/archive/2006/08/25/724253.aspx"&gt;this&lt;/a&gt; post by Ken Henderson ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30443364-115657828469815399?l=codeinet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinet.blogspot.com/feeds/115657828469815399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30443364&amp;postID=115657828469815399' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115657828469815399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115657828469815399'/><link rel='alternate' type='text/html' href='http://codeinet.blogspot.com/2006/08/sqlman.html' title='SQLMan'/><author><name>Tom Øyvind Hogstad</name><uri>http://www.blogger.com/profile/14958448086518497717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30443364.post-115655347642115392</id><published>2006-08-26T02:51:00.000+02:00</published><updated>2006-08-26T02:57:36.496+02:00</updated><title type='text'>The dreaded ID or even worse IDENTITY</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Ruby on Rails, the convention over configuration framework, wants us to have an ID column named ID as a primary key in every table. Now THAT is poor SQL! If we look at the Microsoft Adventureworks database they use singular form object for table names and use the singular form+ID for every table as in Vendor and VendorID. Poor SQL! So what should you use?  &lt;p&gt;I use my own convention.: &lt;p&gt;Say I have a table Vendors, then the Vendor ID column I call Vendor. For foreign keys to Vendors I call the column Vendor, rather than as Rails would like me to Vendor_ID.  &lt;p&gt;For me this works very well. I find it very clear and consistent. When I talk to customers they always refer to stuff like "the Project" meaning the Project ID for a given Project. So in my Project&lt;u&gt;s&lt;/u&gt; table I have the primary key column Project. Rails is very good at distinguishing plural forms and singular forms of words so why didn't they come up with this convention?  &lt;p&gt;And why do Microsoft make a sample database full of horrible SQL? Beats me! Or I may have read to much Joe Celko.  &lt;p&gt;"Joe Celko the SQL apprentice" blog can be found &lt;a href="http://joecelkothesqlapprentice.blogspot.com/"&gt;here&lt;/a&gt;. I'm pretty sure it's not maintained by Mr. Celko, but the answers are very Celkoish (Would Celko ever reference SQL Server 2005 as SQL-2005?? NO!!!)&lt;/p&gt; &lt;p&gt;Now I have to hack Rails to follow my convention ;-) &lt;/p&gt; &lt;p&gt;Happy codein(g,e)!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30443364-115655347642115392?l=codeinet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinet.blogspot.com/feeds/115655347642115392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30443364&amp;postID=115655347642115392' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115655347642115392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115655347642115392'/><link rel='alternate' type='text/html' href='http://codeinet.blogspot.com/2006/08/dreaded-id-or-even-worse-identity.html' title='The dreaded ID or even worse IDENTITY'/><author><name>Tom Øyvind Hogstad</name><uri>http://www.blogger.com/profile/14958448086518497717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30443364.post-115497209020470745</id><published>2006-08-07T19:34:00.000+02:00</published><updated>2006-08-07T19:37:50.956+02:00</updated><title type='text'>Split a String using recursive SQL</title><content type='html'>While sitting under my peartree, having a smoke, looking at the lawn and deciding that I had to mow it. Thinking I just had to catch up on my feed and watch the news before I started up the lawnmower, it suddenly occured to me that rather than using a &lt;a href="http://codeinet.blogspot.com/2006/06/sql-numbers-table-using-common-table.html"&gt;numberstable&lt;/a&gt; (CTE) to split a string you could use a recursive SQL. Why I came to think of it? All the time I read blogs about Lisp, functional languages and how everything is so much cooler if you just start to think recursively ... :-)&lt;br /&gt;Here is the SQL server code, just cut and paste into a querywindow in Managment Studio and hit F5&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;DECLARE&lt;/font&gt;&lt;font size=2&gt; @Delimitedtext &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;varchar&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font color="#FF00FF" size=2&gt;max&lt;/font&gt;&lt;font color="#808080" size=2&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;DECLARE&lt;/font&gt;&lt;font size=2&gt; @Delimiter &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;char&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;1&lt;/font&gt;&lt;font color="#808080" size=2&gt;);&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SET&lt;/font&gt;&lt;font size=2&gt; @Delimitedtext &lt;/font&gt;&lt;font color="#808080" size=2&gt;= &lt;/font&gt;&lt;font color="#FF0000" size=2&gt;'aaa,bbbb,cccc,dddd,'&lt;/font&gt;&lt;font color="#808080" size=2&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SET&lt;/font&gt;&lt;font size=2&gt; @Delimiter &lt;/font&gt;&lt;font color="#808080" size=2&gt;= &lt;/font&gt;&lt;font color="#FF0000" size=2&gt;','&lt;/font&gt;&lt;font color="#808080" size=2&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;WITH&lt;/font&gt;&lt;font size=2&gt; Strings&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;s&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt; r&lt;/font&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;AS&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SELECT&lt;/font&gt;&lt;br /&gt;&lt;font color="#FF00FF" size=2&gt;SUBSTRING&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;@Delimitedtext&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt;1&lt;/font&gt;&lt;font color="#808080" size=2&gt;, &lt;/font&gt;&lt;font color="#FF00FF" size=2&gt;CHARINDEX&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;@Delimiter&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt; @Delimitedtext&lt;/font&gt;&lt;font color="#808080" size=2&gt;)-&lt;/font&gt;&lt;font size=2&gt;1&lt;/font&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;font size=2&gt; s&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font color="#FF00FF" size=2&gt;SUBSTRING&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;@Delimitedtext&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font color="#FF00FF" size=2&gt;CHARINDEX&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;@Delimiter&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt; @Delimitedtext&lt;/font&gt;&lt;font color="#808080" size=2&gt;)+&lt;/font&gt;&lt;font size=2&gt;1&lt;/font&gt;&lt;font color="#808080" size=2&gt;, &lt;/font&gt;&lt;font color="#FF00FF" size=2&gt;len&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;@Delimitedtext&lt;/font&gt;&lt;font color="#808080" size=2&gt;))&lt;/font&gt;&lt;font size=2&gt; r&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;UNION &lt;/font&gt;&lt;font color="#808080" size=2&gt;ALL&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SELECT&lt;/font&gt;&lt;br /&gt;&lt;font color="#FF00FF" size=2&gt;SUBSTRING&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;r&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt;1&lt;/font&gt;&lt;font color="#808080" size=2&gt;, &lt;/font&gt;&lt;font color="#FF00FF" size=2&gt;CHARINDEX&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;@Delimiter&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt; r&lt;/font&gt;&lt;font color="#808080" size=2&gt;)-&lt;/font&gt;&lt;font size=2&gt;1&lt;/font&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;font size=2&gt; s&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font color="#FF00FF" size=2&gt;SUBSTRING&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;r&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font color="#FF00FF" size=2&gt;CHARINDEX&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;@Delimiter&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt; r&lt;/font&gt;&lt;font color="#808080" size=2&gt;)+&lt;/font&gt;&lt;font size=2&gt;1&lt;/font&gt;&lt;font color="#808080" size=2&gt;, &lt;/font&gt;&lt;font color="#FF00FF" size=2&gt;len&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;r&lt;/font&gt;&lt;font color="#808080" size=2&gt;))&lt;/font&gt;&lt;font size=2&gt; r&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;FROM&lt;/font&gt;&lt;font size=2&gt; Strings&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;WHERE&lt;/font&gt;&lt;br /&gt;&lt;font color="#FF00FF" size=2&gt;CHARINDEX&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;@Delimiter&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt; r&lt;/font&gt;&lt;font color="#808080" size=2&gt;) &lt;font color="#808080" size=2&gt;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; 0&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SELECT&lt;/font&gt;&lt;font size=2&gt; s &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;FROM&lt;/font&gt;&lt;font size=2&gt; Strings&lt;/font&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The query will yield this result:&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;s&lt;br /&gt;-------------------&lt;br /&gt;aaa&lt;br /&gt;bbbb&lt;br /&gt;cccc&lt;br /&gt;dddd&lt;br /&gt;&lt;br /&gt;(4 row(s) affected)&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;Have fun Querying (SQL is not defined as a programming language, so you really can't have fun programming SQL ;-))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30443364-115497209020470745?l=codeinet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinet.blogspot.com/feeds/115497209020470745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30443364&amp;postID=115497209020470745' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115497209020470745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115497209020470745'/><link rel='alternate' type='text/html' href='http://codeinet.blogspot.com/2006/08/split-string-using-recursive-sql.html' title='Split a String using recursive SQL'/><author><name>Tom Øyvind Hogstad</name><uri>http://www.blogger.com/profile/14958448086518497717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30443364.post-115453502806402903</id><published>2006-08-02T18:10:00.000+02:00</published><updated>2007-09-18T15:00:57.705+02:00</updated><title type='text'>The Auxiliary Calendar Table For SQL Server 2005</title><content type='html'>A common auxiliary table is the calendar table. A calendar table is a table with a row for each and every date within a period. The table contains a column for the date and columns for additional data about the date, most useful in SQL Server would be ISO week as the datepart function is totally off.&lt;br /&gt;But as we are at it we might as well split the date into year, month, day, quarter, add a holiday flag, a workday flag and a description column to indicate special days.&lt;br /&gt;The calendar table is of course also useful in outer joins where you want to retrieve a row for every date even if there are no data for that date.&lt;br /&gt;With the advent of CTE's creating a table just for the join is no longer necessary as you can use a recursive CTE for it, much as shown in my &lt;a href="http://codeinet.blogspot.com/2006/06/sql-numbers-table-using-common-table.html" target="_blank"&gt;earlier post&lt;/a&gt;.&lt;br /&gt;Continuing on the &lt;a href="http://codeinet.blogspot.com/2006/07/auxiliary-roundup-sql-table-valued-for.html" target="_blank"&gt;standard auixiliary schema:&lt;br /&gt;&lt;/a&gt;Here comes the commented script for creating and populating the table:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:'Courier New',Courier,monospace;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;CREATE &lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; [Auxiliary]&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[Calendar] &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- This is the calendar table&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;  [Date] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;datetime &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NOT &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NULL,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;  [Year] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;int &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NOT &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NULL,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;  [Quarter] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;int &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NOT &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NULL,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;  [Month] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;int &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NOT &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NULL,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;  [Week] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;int &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NOT &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NULL,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;  [Day] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;int &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NOT &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NULL,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;  [DayOfYear] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;int &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NOT &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NULL,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;  [Weekday] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;int &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NOT &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NULL,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;  [Fiscal_Year] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;int &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NOT &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NULL,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;  [Fiscal_Quarter] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;int &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NOT &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NULL,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;  [Fiscal_Month] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;int &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NOT &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NULL,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;  [KindOfDay] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;varchar&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;10&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NOT &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NULL,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;  [Description] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;varchar&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;50&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;NULL,  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;PRIMARY &lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;KEY &lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;CLUSTERED &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[Date]&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;br /&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;ALTER &lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;TABLE&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; [Auxiliary]&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[Calendar]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- In &lt;a href="http://www.celko.com/" target="_blank"&gt;Celkoish &lt;/a&gt;style I'm manic about constraints (Never use em ;-))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;ADD &lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;CONSTRAINT&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; [Calendar_ck] &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;CHECK &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(  &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[Year] &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1900&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;br /&gt;AND &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[Quarter] &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;BETWEEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 4&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;br /&gt;AND &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[Month] &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;BETWEEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 12&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;br /&gt;AND &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[Week]  &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;BETWEEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 53&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;br /&gt;AND &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[Day] &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;BETWEEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 31&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;br /&gt;AND &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[DayOfYear] &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;BETWEEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 366&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;br /&gt;AND &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[Weekday] &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;BETWEEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 7&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;br /&gt;AND &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[Fiscal_Year] &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1900&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;br /&gt;AND &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[Fiscal_Quarter] &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;BETWEEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 4&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;br /&gt;AND &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[Fiscal_Month] &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;BETWEEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 12&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;br /&gt;AND &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;[KindOfDay] &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;IN &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'HOLIDAY'&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'SATURDAY'&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'SUNDAY'&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'BANKDAY'&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;SET &lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;DATEFIRST&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- I want my table to contain datedata acording to &lt;a href="http://en.wikipedia.org/wiki/ISO_8601" target="_blank"&gt;ISO 8601&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-- thus first day of a week is monday&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WITH&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Dates&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- A recursive CTE that produce all dates between 1999 and 2020-12-31&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;SELECT &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;cast&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'1999' &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS &lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;DateTime&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Date &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- SQL Server &lt;a href="http://msdn2.microsoft.com/en-us/library/ms190977.aspx" target="_blank"&gt;supports the ISO 8601&lt;/a&gt; format so this is an unambigious shortcut for 1999-01-01&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;UNION &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;ALL                            &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;SELECT &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;+&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Date&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;FROM&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Dates&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHERE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;&lt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;cast&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'2021' &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS &lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;DateTime&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;-&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;),&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;DatesAndThursdayInWeek&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Thursday&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- The weeks can be found by counting the thursdays in a year so we find&lt;br /&gt;-- the thursday in the week for a particular date&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;SELECT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;CASE &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DATEPART&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;weekday&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;+&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 2 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;+&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 3 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;+&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 4 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Date&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 5 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;-&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 6 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;-&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 7 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;-&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 3&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;END &lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Thursday&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;FROM&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Dates&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;),&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Weeks&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Week&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Thursday&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Now we produce the weeknumers for the thursdays&lt;br /&gt;-- &lt;a href="http://msdn2.microsoft.com/en-us/library/ms186734.aspx" target="_blank"&gt;ROW_NUMBER&lt;/a&gt; is new to SQL Server 2005&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;SELECT&lt;/span&gt;&lt;span style="font-size:85%;"&gt; ROW_NUMBER&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;() &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;OVER&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;partition &lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;by &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;year&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;order &lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;by&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Week&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Thursday&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;FROM&lt;/span&gt;&lt;span style="font-size:85%;"&gt; DatesAndThursdayInWeek&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHERE &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DATEPART&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;weekday&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;INSERT &lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;INTO&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Calendar&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;SELECT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;Year&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DATEPART&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Quarter&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;span style="font-size:85%;"&gt; d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Quarter&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;MONTH&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;Month&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;w&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Week&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DAY&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;Day&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DATEPART&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;DayOfYear&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;span style="font-size:85%;"&gt; d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS&lt;/span&gt;&lt;span style="font-size:85%;"&gt; DayOfYear&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DATEPART&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Weekday&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;span style="font-size:85%;"&gt; d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Weekday&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- &lt;a href="http://en.wikipedia.org/wiki/Fiscal_year" target="_blank"&gt;Fiscal year&lt;/a&gt; may be different to the actual year, in Norway the are the same&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Fiscal_Year&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DATEPART&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Quarter&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;span style="font-size:85%;"&gt; d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Fiscal_Quarter&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;MONTH&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;AS&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Fiscal_Month&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;CASE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Holidays in Norway&lt;br /&gt;-- For other countries and states: Wikipedia - &lt;a href="http://en.wikipedia.org/wiki/List_of_holidays_by_country" target="_blank"&gt;List of holidays by country&lt;/a&gt;&lt;br /&gt;-- I wrote about the computus function &lt;a href="http://codeinet.blogspot.com/2006/07/computus-easter-sunday-in-sql-server.html" target="_blank"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DATEPART&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;DayOfYear&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;span style="font-size:85%;"&gt; d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)          &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- New Year's Day    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;OR &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;))-&lt;/span&gt;&lt;span style="font-size:85%;"&gt;7&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)  &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Palm Sunday    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;OR &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;))-&lt;/span&gt;&lt;span style="font-size:85%;"&gt;3&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)  &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Maundy Thursday    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;OR &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;))-&lt;/span&gt;&lt;span style="font-size:85%;"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)  &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Good Friday    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;OR &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)))    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Easter Sunday    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;OR &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;))+&lt;/span&gt;&lt;span style="font-size:85%;"&gt;39&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Ascension Day    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;OR &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;))+&lt;/span&gt;&lt;span style="font-size:85%;"&gt;49&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Pentecost    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;OR &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;))+&lt;/span&gt;&lt;span style="font-size:85%;"&gt;50&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Whitmonday    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;OR &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;MONTH&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 5 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DAY&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)      &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Labour day    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;OR &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;MONTH&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 5 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DAY&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 17&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)     &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Constitution day    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;OR &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;MONTH&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 12 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DAY&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 25&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Cristmas day    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;OR &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;MONTH&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 12 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DAY&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 26&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Boxing day    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'HOLIDAY'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DATEPART&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Weekday&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;span style="font-size:85%;"&gt; d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 6 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'SATURDAY'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DATEPART&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Weekday&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;span style="font-size:85%;"&gt; d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 7 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'SUNDAY'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;ELSE &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'BANKDAY'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;END&lt;/span&gt;&lt;span style="font-size:85%;"&gt; KindOfDay&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;CASE&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- Description of holidays in Norway    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DATEPART&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;DayOfYear&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;,&lt;/span&gt;&lt;span style="font-size:85%;"&gt; d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'New Year''s Day'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;))-&lt;/span&gt;&lt;span style="font-size:85%;"&gt;7&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'Palm Sunday'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;))-&lt;/span&gt;&lt;span style="font-size:85%;"&gt;3&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'Maundy Thursday'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;))-&lt;/span&gt;&lt;span style="font-size:85%;"&gt;2&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'Good Friday'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)))    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'Easter Sunday'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;))+&lt;/span&gt;&lt;span style="font-size:85%;"&gt;39&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'Ascension Day'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;))+&lt;/span&gt;&lt;span style="font-size:85%;"&gt;49&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'Pentecost'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Auxiliary&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Computus&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;YEAR&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;))+&lt;/span&gt;&lt;span style="font-size:85%;"&gt;50&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'Whitmonday'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;MONTH&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 5 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DAY&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 1&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'Labour day'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;MONTH&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 5 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DAY&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 17&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'Constitution day'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;MONTH&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 12 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DAY&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 25&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'Cristmas day'    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;WHEN &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;MONTH&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 12 &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;AND &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);font-size:85%;" &gt;DAY&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="font-size:85%;"&gt;d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Date&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;) &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 26&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;THEN &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;'Boxing day'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;END&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Description&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;FROM&lt;/span&gt;&lt;span style="font-size:85%;"&gt; DatesAndThursdayInWeek d&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;-- This join is for getting the week into the result set     &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;inner &lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;join&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Weeks w&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;on&lt;/span&gt;&lt;span style="font-size:85%;"&gt; d&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Thursday &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;=&lt;/span&gt;&lt;span style="font-size:85%;"&gt; w&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Thursday&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;OPTION&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;MAXRECURSION&lt;/span&gt;&lt;span style="font-size:85%;"&gt; 0&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);font-size:85%;" &gt;)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;You can download the entire script &lt;a href="http://www.team-work.no/tom/Gen_Aux_Schema_EN.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;While I write som nice examples you can find additional resources and examples on using calendar tables here:&lt;br /&gt;&lt;a href="http://www.aspfaq.com/show.asp?id=2519"&gt;Why should I consider using an auxiliary calendar table?&lt;/a&gt; by Aaron Bertrand&lt;br /&gt;&lt;a href="http://www.intelligententerprise.com/db_area/archives/1999/992112/celko.jhtml"&gt;       Auxiliary Angst&lt;/a&gt; by Joe Celko&lt;br /&gt;&lt;a href="http://drsql.spaces.live.com/blog/cns%2180677FB08B3162E4%211297.entry"&gt;Getting previous month/years/days from your calendar table&lt;br /&gt;&lt;/a&gt; by Louis Davidson&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30443364-115453502806402903?l=codeinet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinet.blogspot.com/feeds/115453502806402903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30443364&amp;postID=115453502806402903' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115453502806402903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115453502806402903'/><link rel='alternate' type='text/html' href='http://codeinet.blogspot.com/2006/08/auxiliary-calendar-table-for-sql.html' title='The Auxiliary Calendar Table For SQL Server 2005'/><author><name>Tom Øyvind Hogstad</name><uri>http://www.blogger.com/profile/14958448086518497717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30443364.post-115351661881420704</id><published>2006-07-21T23:16:00.000+02:00</published><updated>2006-08-02T18:32:09.926+02:00</updated><title type='text'>Computus - Easter Sunday in SQL Server 2005</title><content type='html'>Working on an article about an auxiliary calendar table I needed to find a routine for calculating Easter Sunday. Many years ago I made my Delphi routine for this, and haven't really thought much about it since. Reading an &lt;a href="http://www.aspfaq.com/show.asp?id=2519" target="_blank"&gt;article&lt;/a&gt; about calendar tables I found a function doing the trick. I tested the routine and it happened to fail so I needed to find another one. Luckily today we have wikipedia, something we didn't 10 years ago when I found my last Easter Sunday function. &lt;br /&gt;&lt;br /&gt;From Wikipedia: &lt;a href="http://en.wikipedia.org/wiki/Computus" target="_blank"&gt;Computus&lt;/a&gt; (Latin for computation) is the calculation of the date of Easter in the Christian calendar.&lt;br /&gt;In the &lt;a href="http://en.wikipedia.org/wiki/Computus" target="_blank"&gt;article &lt;/a&gt;I found the Meeus/Jones/Butcher Gregorian algorithm that is supposed to work for any Easter ever in the Gregorian calendar.&lt;br /&gt;&lt;blockquote&gt;&lt;font face="'Courier New',Courier,monospace"&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;CREATE &lt;font color="#0000FF" size=2&gt;FUNCTION&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; [Auxiliary]&lt;/font&gt;&lt;font color="#808080" size=2&gt;.&lt;/font&gt;&lt;font size=2&gt;[Computus]&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;    @Y &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT &lt;/font&gt;&lt;font color="#008000" size=2&gt;-- The year we are calculating Easter Sunday for&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;RETURNS &lt;font color="#0000FF" size=2&gt;DATETIME&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;DECLARE&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@a &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@b &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@c &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@d &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@e &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@f &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@g &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@h &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@i &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@k &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@L &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@m &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;br /&gt;&lt;br /&gt;SET&lt;/font&gt;&lt;font size=2&gt; @a &lt;/font&gt;&lt;font color="#808080" size=2&gt;=&lt;/font&gt;&lt;font size=2&gt; @Y &lt;/font&gt;&lt;font color="#808080" size=2&gt;%&lt;/font&gt;&lt;font size=2&gt; 19&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SET&lt;/font&gt;&lt;font size=2&gt; @b &lt;/font&gt;&lt;font color="#808080" size=2&gt;=&lt;/font&gt;&lt;font size=2&gt; @Y &lt;/font&gt;&lt;font color="#808080" size=2&gt;/&lt;/font&gt;&lt;font size=2&gt; 100&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SET&lt;/font&gt;&lt;font size=2&gt; @c &lt;/font&gt;&lt;font color="#808080" size=2&gt;=&lt;/font&gt;&lt;font size=2&gt; @Y &lt;/font&gt;&lt;font color="#808080" size=2&gt;%&lt;/font&gt;&lt;font size=2&gt; 100&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SET&lt;/font&gt;&lt;font size=2&gt; @d &lt;/font&gt;&lt;font color="#808080" size=2&gt;=&lt;/font&gt;&lt;font size=2&gt; @b &lt;/font&gt;&lt;font color="#808080" size=2&gt;/&lt;/font&gt;&lt;font size=2&gt; 4&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SET&lt;/font&gt;&lt;font size=2&gt; @e &lt;/font&gt;&lt;font color="#808080" size=2&gt;=&lt;/font&gt;&lt;font size=2&gt; @b &lt;/font&gt;&lt;font color="#808080" size=2&gt;%&lt;/font&gt;&lt;font size=2&gt; 4&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SET&lt;/font&gt;&lt;font size=2&gt; @f &lt;/font&gt;&lt;font color="#808080" size=2&gt;= &lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;@b &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; 8&lt;/font&gt;&lt;font color="#808080" size=2&gt;) &lt;font color="#808080" size=2&gt;/&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; 25&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SET&lt;/font&gt;&lt;font size=2&gt; @g &lt;/font&gt;&lt;font color="#808080" size=2&gt;= &lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;@b &lt;/font&gt;&lt;font color="#808080" size=2&gt;-&lt;/font&gt;&lt;font size=2&gt; @f &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; 1&lt;/font&gt;&lt;font color="#808080" size=2&gt;) &lt;font color="#808080" size=2&gt;/&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; 3&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SET&lt;/font&gt;&lt;font size=2&gt; @h &lt;/font&gt;&lt;font color="#808080" size=2&gt;= &lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;19 &lt;/font&gt;&lt;font color="#808080" size=2&gt;*&lt;/font&gt;&lt;font size=2&gt; @a &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; @b &lt;/font&gt;&lt;font color="#808080" size=2&gt;-&lt;/font&gt;&lt;font size=2&gt; @d &lt;/font&gt;&lt;font color="#808080" size=2&gt;-&lt;/font&gt;&lt;font size=2&gt; @g &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; 15&lt;/font&gt;&lt;font color="#808080" size=2&gt;) &lt;font color="#808080" size=2&gt;%&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; 30&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SET&lt;/font&gt;&lt;font size=2&gt; @i &lt;/font&gt;&lt;font color="#808080" size=2&gt;=&lt;/font&gt;&lt;font size=2&gt; @c &lt;/font&gt;&lt;font color="#808080" size=2&gt;/&lt;/font&gt;&lt;font size=2&gt; 4&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SET&lt;/font&gt;&lt;font size=2&gt; @k &lt;/font&gt;&lt;font color="#808080" size=2&gt;=&lt;/font&gt;&lt;font size=2&gt; @c &lt;/font&gt;&lt;font color="#808080" size=2&gt;%&lt;/font&gt;&lt;font size=2&gt; 4&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SET&lt;/font&gt;&lt;font size=2&gt; @L &lt;/font&gt;&lt;font color="#808080" size=2&gt;= &lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;32 &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; 2 &lt;/font&gt;&lt;font color="#808080" size=2&gt;*&lt;/font&gt;&lt;font size=2&gt; @e &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; 2 &lt;/font&gt;&lt;font color="#808080" size=2&gt;*&lt;/font&gt;&lt;font size=2&gt; @i &lt;/font&gt;&lt;font color="#808080" size=2&gt;-&lt;/font&gt;&lt;font size=2&gt; @h &lt;/font&gt;&lt;font color="#808080" size=2&gt;-&lt;/font&gt;&lt;font size=2&gt; @k&lt;/font&gt;&lt;font color="#808080" size=2&gt;) &lt;font color="#808080" size=2&gt;%&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; 7&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SET&lt;/font&gt;&lt;font size=2&gt; @m &lt;/font&gt;&lt;font color="#808080" size=2&gt;= &lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;@a &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; 11 &lt;/font&gt;&lt;font color="#808080" size=2&gt;*&lt;/font&gt;&lt;font size=2&gt; @h &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; 22 &lt;/font&gt;&lt;font color="#808080" size=2&gt;*&lt;/font&gt;&lt;font size=2&gt; @L&lt;/font&gt;&lt;font color="#808080" size=2&gt;) &lt;font color="#808080" size=2&gt;/&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; 451&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;RETURN&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font color="#FF00FF" size=2&gt;DATEADD&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font color="#FF00FF" size=2&gt;month&lt;/font&gt;&lt;font color="#808080" size=2&gt;, &lt;font color="#808080" size=2&gt;((&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;@h &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; @L &lt;/font&gt;&lt;font color="#808080" size=2&gt;-&lt;/font&gt;&lt;font size=2&gt; 7 &lt;/font&gt;&lt;font color="#808080" size=2&gt;*&lt;/font&gt;&lt;font size=2&gt; @m &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; 114&lt;/font&gt;&lt;font color="#808080" size=2&gt;) &lt;font color="#808080" size=2&gt;/&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; 31&lt;/font&gt;&lt;font color="#808080" size=2&gt;)-&lt;/font&gt;&lt;font size=2&gt;1&lt;/font&gt;&lt;font color="#808080" size=2&gt;, &lt;/font&gt;&lt;font color="#FF00FF" size=2&gt;cast&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font color="#FF00FF" size=2&gt;cast&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;@Y &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;AS &lt;font color="#0000FF" size=2&gt;VARCHAR&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size=2&gt;) &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;AS &lt;font color="#0000FF" size=2&gt;Datetime&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size=2&gt;)) &lt;font color="#808080" size=2&gt;+ &lt;font color="#808080" size=2&gt;((&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;@h &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; @L &lt;/font&gt;&lt;font color="#808080" size=2&gt;-&lt;/font&gt;&lt;font size=2&gt; 7 &lt;/font&gt;&lt;font color="#808080" size=2&gt;*&lt;/font&gt;&lt;font size=2&gt; @m &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; 114&lt;/font&gt;&lt;font color="#808080" size=2&gt;) &lt;font color="#808080" size=2&gt;%&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; 31&lt;/font&gt;&lt;font color="#808080" size=2&gt;))&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;END&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;br /&gt;I got no clue about the intricacy of this math. But it works and that's fine for me :-)&lt;br /&gt;&lt;br /&gt;Next: "&lt;a href="http://codeinet.blogspot.com/2006/08/auxiliary-calendar-table-for-sql.html"&gt;The Auxiliary Calendar Table For SQL Server 2005&lt;/a&gt;" ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30443364-115351661881420704?l=codeinet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinet.blogspot.com/feeds/115351661881420704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30443364&amp;postID=115351661881420704' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115351661881420704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115351661881420704'/><link rel='alternate' type='text/html' href='http://codeinet.blogspot.com/2006/07/computus-easter-sunday-in-sql-server.html' title='Computus - Easter Sunday in SQL Server 2005'/><author><name>Tom Øyvind Hogstad</name><uri>http://www.blogger.com/profile/14958448086518497717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30443364.post-115351534623342515</id><published>2006-07-21T22:55:00.000+02:00</published><updated>2006-07-22T10:29:10.370+02:00</updated><title type='text'>Auxiliary roundup - The SQL table valued  for loop function?</title><content type='html'>After creating the numbers CTE in my &lt;a href="http://codeinet.blogspot.com/2006/06/sql-numbers-table-using-common-table.html" target="_blank"&gt;last post&lt;/a&gt; I wanted to go on building my standard auxiliary schema. First of all lets create the schema. Quite simple:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;font face="'Courier New',Courier,monospace"&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;CREATE &lt;font color="#0000FF" size=2&gt;SCHEMA&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; [Auxiliary]&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;A &lt;a href="http://msdn2.microsoft.com/en-us/library/ms190387.aspx" target="_blank"&gt;schema in SQL server 2005&lt;/a&gt; is a collection of database entities that form a single namespace. &lt;br /&gt;I now got a place to put auxiliary entities.&lt;br /&gt;&lt;br /&gt;First off, I decided to put my Numbers CTE into a table valued function. I wanted to make it a bit flexible by giving the startnumber, endnumber and increment as parameters.&lt;br /&gt;Incidentally this suddenly looked a little bit like the For(i=1; i &lt;=1000; i++) construct in C and C# &lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;font face="'Courier New',Courier,monospace"&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;CREATE &lt;font color="#0000FF" size=2&gt;FUNCTION&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; Auxiliary&lt;/font&gt;&lt;font color="#808080" size=2&gt;.&lt;/font&gt;&lt;font size=2&gt;Numbers&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@AFrom &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@ATo &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@AIncrement &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;RETURNS&lt;/font&gt;&lt;font size=2&gt; @RetNumbers &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;TABLE&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;[Number] &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;int &lt;font color="#0000FF" size=2&gt;PRIMARY &lt;font color="#0000FF" size=2&gt;KEY &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size=2&gt;NOT &lt;font color="#808080" size=2&gt;NULL&lt;br /&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;WITH&lt;/font&gt;&lt;font size=2&gt; Numbers&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;n&lt;/font&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;AS&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SELECT&lt;/font&gt;&lt;font size=2&gt; @AFrom &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;AS&lt;/font&gt;&lt;font size=2&gt; n&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;UNION &lt;/font&gt;&lt;font color="#808080" size=2&gt;ALL&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SELECT &lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;n &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; @AIncrement&lt;/font&gt;&lt;font color="#808080" size=2&gt;) &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;AS&lt;/font&gt;&lt;font size=2&gt; n&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;FROM&lt;/font&gt;&lt;font size=2&gt; Numbers&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;WHERE&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;n &lt;/font&gt;&lt;font color="#808080" size=2&gt;&lt;&lt;/font&gt;&lt;font size=2&gt; @ATo&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;INSERT&lt;/font&gt;&lt;font size=2&gt; @RetNumbers&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SELECT&lt;/font&gt;&lt;font size=2&gt; n &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;from&lt;/font&gt;&lt;font size=2&gt; Numbers&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;OPTION&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font color="#0000FF" size=2&gt;MAXRECURSION&lt;/font&gt;&lt;font size=2&gt; 0&lt;/font&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;RETURN&lt;/font&gt;&lt;font color="#808080" size=2&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;END&lt;/font&gt;&lt;font color="#808080" size=2&gt;;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;To use this to retrieve a list of numbers between 10 and 1000 incremented by 10:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;font face="'Courier New',Courier,monospace"&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SELECT&lt;/font&gt;&lt;font size=2&gt; Number &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;FROM&lt;/font&gt;&lt;font size=2&gt; Auxiliary&lt;/font&gt;&lt;font color="#808080" size=2&gt;.&lt;/font&gt;&lt;font size=2&gt;Numbers&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;10&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt;1000&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt;10&lt;/font&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;This will return:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;font face="'Courier New',Courier,monospace" size=1&gt;&lt;br /&gt;Number&lt;br /&gt;-----------&lt;br /&gt;10&lt;br /&gt;20&lt;br /&gt;30&lt;br /&gt;...&lt;br /&gt;980&lt;br /&gt;990&lt;br /&gt;1000&lt;br /&gt;&lt;br /&gt;(100 row(s) affected)&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;For a large number of numbers this function is quite slow. An inlined version of this performs much better, but you need to specify the MAXRECURSION hint in the statement using the function:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;font face="'Courier New',Courier,monospace"&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;CREATE &lt;font color="#0000FF" size=2&gt;FUNCTION&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt; Auxiliary&lt;/font&gt;&lt;font color="#808080" size=2&gt;.&lt;/font&gt;&lt;font size=2&gt;iNumbers&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@AFrom &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@ATo &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;@AIncrement &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;INT&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;RETURNS &lt;font color="#0000FF" size=2&gt;TABLE&lt;br /&gt;AS&lt;br /&gt;RETURN&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;WITH&lt;/font&gt;&lt;font size=2&gt; Numbers&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;n&lt;/font&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;AS&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SELECT&lt;/font&gt;&lt;font size=2&gt; @AFrom &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;AS&lt;/font&gt;&lt;font size=2&gt; n&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;UNION &lt;/font&gt;&lt;font color="#808080" size=2&gt;ALL&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SELECT &lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;n &lt;/font&gt;&lt;font color="#808080" size=2&gt;+&lt;/font&gt;&lt;font size=2&gt; @AIncrement&lt;/font&gt;&lt;font color="#808080" size=2&gt;) &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;AS&lt;/font&gt;&lt;font size=2&gt; n&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;FROM&lt;/font&gt;&lt;font size=2&gt; Numbers&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;WHERE&lt;/font&gt;&lt;br /&gt;&lt;font size=2&gt;n &lt;/font&gt;&lt;font color="#808080" size=2&gt;&lt;&lt;/font&gt;&lt;font size=2&gt; @ATo&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SELECT&lt;/font&gt;&lt;font size=2&gt; n &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;AS&lt;/font&gt;&lt;font size=2&gt; Number &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;from&lt;/font&gt;&lt;font size=2&gt; Numbers&lt;/font&gt;&lt;br /&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;To use this to retrieve a list of numbers between 10 and 1000 incremented by 10:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;font face="'Courier New',Courier,monospace"&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SELECT&lt;/font&gt;&lt;font size=2&gt; Number &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;FROM&lt;/font&gt;&lt;font size=2&gt; Auxiliary&lt;/font&gt;&lt;font color="#808080" size=2&gt;.&lt;/font&gt;&lt;font size=2&gt;iNumbers&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;10&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt;1000&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt;10&lt;/font&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;If your "table" will return more than 101 numbers (100 recursions):&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;font face="'Courier New',Courier,monospace"&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;SELECT&lt;/font&gt;&lt;font size=2&gt; Number &lt;/font&gt;&lt;font color="#0000FF" size=2&gt;FROM&lt;/font&gt;&lt;font size=2&gt; Auxiliary&lt;/font&gt;&lt;font color="#808080" size=2&gt;.&lt;/font&gt;&lt;font size=2&gt;iNumbers&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font size=2&gt;1&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt;10000&lt;/font&gt;&lt;font color="#808080" size=2&gt;,&lt;/font&gt;&lt;font size=2&gt;1&lt;/font&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000FF" size=2&gt;OPTION&lt;/font&gt;&lt;font color="#808080" size=2&gt;(&lt;/font&gt;&lt;font color="#0000FF" size=2&gt;MAXRECURSION&lt;/font&gt;&lt;font size=2&gt; 10000&lt;/font&gt;&lt;font color="#808080" size=2&gt;)&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;If you need really many numbers then you definitely should build a permanent numberstable. &lt;br /&gt;Louis Davidson wrote a nice post a about it &lt;a href="http://drsql.spaces.msn.com/blog/cns!80677FB08B3162E4!1232.entry?_c11_blogpart_blogpart=blogview&amp;_c=blogpart#permalink" target="_blank"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30443364-115351534623342515?l=codeinet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinet.blogspot.com/feeds/115351534623342515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30443364&amp;postID=115351534623342515' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115351534623342515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115351534623342515'/><link rel='alternate' type='text/html' href='http://codeinet.blogspot.com/2006/07/auxiliary-roundup-sql-table-valued-for.html' title='Auxiliary roundup - The SQL table valued  for loop function?'/><author><name>Tom Øyvind Hogstad</name><uri>http://www.blogger.com/profile/14958448086518497717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30443364.post-115162314679796388</id><published>2006-06-30T00:56:00.000+02:00</published><updated>2006-07-15T10:10:41.666+02:00</updated><title type='text'>SQL Numbers table using a Common table expression (CTE)</title><content type='html'>With SQL server 2005 Microsoft finally implemented recursive SQLs as described in the ISO-ANSI SQL3 standard (Implemented in DB2, Sybase and partly Oracle a "loooong" time ago).&lt;br /&gt;This new and exciting feature dubbed CTE (Common table expression) is supposed to be particular useful for traversing trees and hierarchies using SQL.&lt;br /&gt;Reading Joe Celcos SQL Programming style (Highly recommended)  I came acorss a concept called "numbers table".&lt;br /&gt;This is  a table with a sequence of integer numbers. Such a table is quite useful for parsing strings and generating testdata.&lt;br /&gt;Thinking of uses for &lt;a href="http://msdn2.microsoft.com/en-us/library/ms190766.aspx"&gt;CTE's&lt;/a&gt; I figured they could be used to create an ad-hoc numbers table. Such a construct will also serve as an easy to understand example of a recursive query.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;WITH Numbers(n)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;AS&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;(&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;SELECT 1  AS n&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;UNION ALL&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;SELECT (n + 1) AS n&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;FROM Numbers&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;WHERE&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;n &lt; 1000&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;SELECT n from Numbers&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;OPTION(MAXRECURSION 1000) -- defaults 100&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;What happens in a recursive query is that the first select statement initializes the query and returns the first row(s),&lt;br /&gt;the second query then executes for  every row added to the result (Selecting from itself)&lt;br /&gt;Thus selecting n incremented by one and adding the row(s) to the result.&lt;br /&gt;&lt;br /&gt;To parse a string you could do it like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;DECLARE @Delimitedtext varchar(max);&lt;br /&gt;DECLARE @Delimiter char(1);&lt;br /&gt;SET @Delimitedtext = ',aaa,bbbb,cccc,';&lt;br /&gt;SET @Delimiter = ',';&lt;br /&gt;WITH Numbers(n)&lt;br /&gt;AS&lt;br /&gt;(&lt;br /&gt;SELECT 1 AS n&lt;br /&gt;UNION ALL&lt;br /&gt;SELECT (n + 1) AS n&lt;br /&gt;FROM Numbers&lt;br /&gt;WHERE&lt;br /&gt;n &lt; 1000 )&lt;br /&gt;SELECT&lt;br /&gt;SUBSTRING(@DelimitedText, Numbers.n + 1, CHARINDEX(@Delimiter, @DelimitedText,Numbers.n + 1) - Numbers.n - 1)&lt;br /&gt;FROM Numbers&lt;br /&gt;WHERE&lt;br /&gt;Numbers.n &lt;= LEN(@DelimitedText) - 1 AND&lt;br /&gt;SUBSTRING(@DelimitedText, Numbers.n, 1) = @Delimiter&lt;br /&gt;AND&lt;br /&gt;LEN(SUBSTRING(@DelimitedText, Numbers.n + 1,CHARINDEX(@Delimiter, @DelimitedText, Numbers.n + 1) - Numbers.n - 1)) &gt; 0&lt;br /&gt;OPTION (MAXRECURSION 1000)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;More fun with number tables can be found &lt;a href="http://www.sql-server-performance.com/vk_fun_numbers_transactsql.asp"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30443364-115162314679796388?l=codeinet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinet.blogspot.com/feeds/115162314679796388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30443364&amp;postID=115162314679796388' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115162314679796388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115162314679796388'/><link rel='alternate' type='text/html' href='http://codeinet.blogspot.com/2006/06/sql-numbers-table-using-common-table.html' title='SQL Numbers table using a Common table expression (CTE)'/><author><name>Tom Øyvind Hogstad</name><uri>http://www.blogger.com/profile/14958448086518497717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30443364.post-115159782627948850</id><published>2006-06-29T18:08:00.000+02:00</published><updated>2006-06-29T18:49:17.696+02:00</updated><title type='text'>The first post!</title><content type='html'>Really this is just a test post. The intent of this blog is to actually log some of the stuff I do. That is for later reference and to give some structure to gained knowledge and experiences . I will probably mostly post stuff about &lt;a href="http://www.microsoft.com/sql/default.mspx"&gt;SQL Server&lt;/a&gt; and &lt;a href="http://www.borland.com/us/products/delphi/index.html"&gt;Borland Delphi&lt;/a&gt; ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30443364-115159782627948850?l=codeinet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeinet.blogspot.com/feeds/115159782627948850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30443364&amp;postID=115159782627948850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115159782627948850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30443364/posts/default/115159782627948850'/><link rel='alternate' type='text/html' href='http://codeinet.blogspot.com/2006/06/first-post.html' title='The first post!'/><author><name>Tom Øyvind Hogstad</name><uri>http://www.blogger.com/profile/14958448086518497717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
