<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblog.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results matching tags 'T-SQL', 'T-SQL Tuesday', and 'sql server'</title><link>http://sqlblog.com/search/SearchResults.aspx?o=DateDescending&amp;tag=T-SQL,T-SQL+Tuesday,sql+server&amp;orTags=0</link><description>Search results matching tags 'T-SQL', 'T-SQL Tuesday', and 'sql server'</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>[T-SQL Tuesday] Some code is born crap, some code achieves crapness and some code has crapness thrust upon it!</title><link>http://sqlblog.com/blogs/jamie_thomson/archive/2011/08/10/t-sql-tuesday-some-code-is-born-crap-some-code-achieves-crapness-and-some-code-has-crapness-thrust-upon-it.aspx</link><pubDate>Wed, 10 Aug 2011 15:04:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:37711</guid><dc:creator>jamiet</dc:creator><description>&lt;p&gt;I recently returned to a client at which I last worked back in 2006 and, as you might imagine, that gives me ample material for a blog post dedicated to Crap Code; conveniently the subject of the latest &lt;a href="http://sqlblog.com/blogs/adam_machanic/archive/2011/08/03/t-sql-tuesday-21-a-day-late-and-totally-full-of-it.aspx" target="_blank"&gt;T-SQL Tuesday&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I first worked for this client back in 2004 and that is significant because back then we were writing code on SQL Server 2000. Ah, thems were the days!!! I smiled wryly to myself when I encountered the following code in a stored procedure that I once wrote:&lt;/p&gt;
&lt;code style="font-size:12px;"&gt;&lt;span style="color:green;"&gt;--Simplified for convenience/demo&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;CREATE PROCEDURE &lt;/span&gt;&lt;span style="color:black;"&gt;[dbo].[usp_PersonInsert]&lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#434343;"&gt;@pXMLDataInsert&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;TEXT&lt;br&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;AS&lt;br&gt;BEGIN&lt;br&gt;&amp;nbsp;&amp;nbsp; DECLARE &lt;/span&gt;&lt;span style="color:#434343;"&gt;@vDoc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;INT&lt;br&gt;&amp;nbsp;&amp;nbsp; EXECUTE &lt;/span&gt;&lt;span style="color:darkred;"&gt;sp_xml_preparedocument &lt;/span&gt;&lt;span style="color:#434343;"&gt;@vDoc &lt;/span&gt;&lt;span style="color:black;"&gt;OUTPUT&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;span style="color:#434343;"&gt;@pXMLDataInsert&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&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&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:black;"&gt;Name&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;INTO&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:#434343;"&gt;#Insert&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;OpenXML&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:#434343;"&gt;@vDoc&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;span style="color:red;"&gt;'NewDataSet/Table'&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;span style="color:black;"&gt;2 &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;WITH&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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:black;"&gt;ID&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;INT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:red;"&gt;'ID'&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:black;"&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;70&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:red;"&gt;'Name'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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:blue;"&gt;EXECUTE &lt;/span&gt;&lt;span style="color:darkred;"&gt;sp_xml_removedocument &lt;/span&gt;&lt;span style="color:#434343;"&gt;@vDoc&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;INSERT INTO &lt;/span&gt;&lt;span style="color:black;"&gt;dbo.Person&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;ID&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;Name&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:black;"&gt;ID&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:black;"&gt;Name &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:#434343;"&gt;#Insert&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;END&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/code&gt;
&lt;p&gt;If you have never had the pleasure(!!!) of dealing with XML data prior to SQL Server 2005 then you're probably looking at this with a slightly confused look on your face wondering quite why we had to make this so complicated. TEXT datatype? OPENXML? System stored procs? What's in this @vDoc variable? On the other hand if you &lt;i&gt;have&lt;/i&gt; had to deal with XML pre-2005 then right now you're probably nodding sagely to yourself and remembering the not-so-good-old-days!&lt;/p&gt;
&lt;p&gt;No-one would ever write code like this today but back in 2004, before wonderous things like the XML datatype and table-valued-parameters, this was how one passed datasets into a stored procedure (well, its how &lt;i&gt;we&lt;/i&gt; did it anyway). If any of my colleagues were to write this today they would probably be despatched home with a copy of &lt;a href="http://www.amazon.com/Inside-Microsoft%C2%AE-Server%C2%AE-2008-Pro-Developer/dp/0735626022/ref=sr_1_1?ie=UTF8&amp;amp;qid=1312990060&amp;amp;sr=8-1" target="_blank"&gt;Inside SQL Server 2008 : T-SQL Programming&lt;/a&gt; tucked under their arm and ordered not to come back until they could recite it ad infinitum but back in 2004, well, we thought we were pretty cool!&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Times change, people change and coding practices change too. Code isn't born crap, it just tends to crapness the longer that it lives! Bear that in mind when coding today because in five years time you'll probably be coming back and having a little chuckle at it!&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/jamiet" target="_blank"&gt;@Jamiet&lt;/a&gt; &lt;/p&gt;

&lt;a href="http://sqlblog.com/blogs/adam_machanic/archive/2011/08/03/t-sql-tuesday-21-a-day-late-and-totally-full-of-it.aspx" target="_blank"&gt;&lt;img src="http://sqlblog.com/blogs/adam_machanic/TSQLWednesday_2C948C01.jpg"&gt;&lt;/a&gt;</description></item><item><title>Unambiguous date formats : T-SQL Tuesday #001</title><link>http://sqlblog.com/blogs/jamie_thomson/archive/2009/12/08/unambiguous-date-formats-t-sql-tuesday-001.aspx</link><pubDate>Tue, 08 Dec 2009 20:23:41 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:19629</guid><dc:creator>jamiet</dc:creator><description>&lt;p&gt;One of the most commonly used data types in SQL Server is &lt;font face="Courier New"&gt;[datetime]&lt;/font&gt; which unfortunately has some vagaries around how values get casted. A typical method for defining a &lt;font face="Courier New"&gt;[datetime]&lt;/font&gt; literal is to write it as a character string and then cast it appropriately. The cast syntax looks something like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;table cellspacing="0" cellpadding="0" bgcolor="#eeeeee"&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;pre style="padding-bottom:10px;padding-left:20px;padding-right:20px;font-family:consolas,lucida console,courier new,courier;font-size:12px;padding-top:10px;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;&lt;font color="blue"&gt;DECLARE &lt;/font&gt;&lt;font color="#434343"&gt;@dt &lt;/font&gt;&lt;font color="blue"&gt;NVARCHAR&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;19&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="blue"&gt;= &lt;/font&gt;&lt;font color="red"&gt;'2009-12-08 18:00:00'&lt;/font&gt;&lt;font color="gray"&gt;;
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;SELECT &lt;/font&gt;&lt;font color="magenta"&gt;CAST&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="#434343"&gt;@dt &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;datetime&lt;/font&gt;&lt;font color="gray"&gt;);
&lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately in SQL Server 2005 the result of the cast operation may be dependent on your current language setting. You can discover your current language setting by executing:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;table cellspacing="0" cellpadding="0" bgcolor="#eeeeee"&gt;
      &lt;tr&gt;
        &lt;td&gt;
          &lt;pre style="padding-bottom:10px;padding-left:20px;padding-right:20px;font-family:consolas,lucida console,courier new,courier;font-size:12px;padding-top:10px;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;&lt;font color="blue"&gt;SELECT &lt;/font&gt;&lt;font color="magenta"&gt;@@LANGUAGE&lt;/font&gt;&lt;/pre&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
&lt;/blockquote&gt;

&lt;p&gt;To demonstrate how your language setting can influence the results of a cast take a look at the following code:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;table cellspacing="0" cellpadding="0" bgcolor="#eeeeee"&gt;
      &lt;tr&gt;
        &lt;td&gt;
          &lt;pre style="padding-bottom:10px;padding-left:20px;padding-right:20px;font-family:consolas,lucida console,courier new,courier;font-size:12px;padding-top:10px;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;&lt;font color="blue"&gt;ALTER&amp;#160; DATABASE &lt;/font&gt;&lt;font color="black"&gt;tempdb
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;SET&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;COMPATIBILITY_LEVEL &lt;/font&gt;&lt;font color="blue"&gt;= &lt;/font&gt;&lt;font color="black"&gt;90 &lt;/font&gt;&lt;font color="gray"&gt;; &lt;/font&gt;&lt;font color="green"&gt;--Behave like SQL Server 2005
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;USE &lt;/font&gt;&lt;font color="black"&gt;tempdb
&lt;br /&gt;GO
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;DECLARE &lt;/font&gt;&lt;font color="#434343"&gt;@t &lt;/font&gt;&lt;font color="blue"&gt;TABLE &lt;/font&gt;&lt;font color="gray"&gt;(
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;dateString&amp;#160; &lt;/font&gt;&lt;font color="blue"&gt;NVARCHAR&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;19&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br /&gt;);
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;INSERT &lt;/font&gt;&lt;font color="#434343"&gt;@t &lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;dateString&lt;/font&gt;&lt;font color="gray"&gt;)
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;VALUES &lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="red"&gt;'2009-12-08 18:00:00'&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="green"&gt;--'yyyy-MM-dd hh24:mi:ss'
&lt;br /&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&lt;/font&gt;&lt;font color="red"&gt;'2009-12-08T18:00:00'&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="green"&gt;--'yyyy-MM-ddThh24:mi:ss'
&lt;br /&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&lt;/font&gt;&lt;font color="red"&gt;'20091208 18:00:00'&lt;/font&gt;&lt;font color="gray"&gt;)&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="green"&gt;--'yyyyMMdd hh24:mi:ss'
&lt;br /&gt;
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;SET&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;LANGUAGE french&lt;/font&gt;&lt;font color="gray"&gt;;
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;SELECT &lt;/font&gt;&lt;font color="red"&gt;'french' &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;lang
&lt;br /&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="magenta"&gt;DATENAME&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="magenta"&gt;MONTH&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;q.[dt]&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;mnth
&lt;br /&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;q.[dt]
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;FROM&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="gray"&gt;(
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="blue"&gt;SELECT&amp;#160; &lt;/font&gt;&lt;font color="magenta"&gt;CAST&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;dateString &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;DATETIME&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;dt
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="blue"&gt;FROM&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#434343"&gt;@t
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="gray"&gt;)&lt;/font&gt;&lt;font color="black"&gt;q&lt;/font&gt;&lt;font color="gray"&gt;;
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;SET&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;LANGUAGE us_english&lt;/font&gt;&lt;font color="gray"&gt;;
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;SELECT &lt;/font&gt;&lt;font color="red"&gt;'us_english' &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;lang
&lt;br /&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="magenta"&gt;DATENAME&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="magenta"&gt;MONTH&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="black"&gt;q.[dt]&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;mnth
&lt;br /&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;q.[dt]
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;FROM&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="gray"&gt;(
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="blue"&gt;SELECT&amp;#160; &lt;/font&gt;&lt;font color="magenta"&gt;CAST&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;dateString &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;DATETIME&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;dt
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="blue"&gt;FROM&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#434343"&gt;@t
&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="gray"&gt;)&lt;/font&gt;&lt;font color="black"&gt;q&lt;/font&gt;&lt;font color="gray"&gt;;&lt;/font&gt;&lt;/pre&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
&lt;/blockquote&gt;

&lt;p&gt;We are taking the value which can be described in words as “6pm on 8th December 2009”, defining it in three different ways, then seeing how the &lt;font color="#ff00ff" face="Courier New"&gt;@@LANGUAGE&lt;/font&gt; setting can affect the results. Here are those results:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_1CC2DDFC.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="french language datetime" border="0" alt="french language datetime" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_3B2D1EE5.png" width="321" height="203" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice how the interpretation of the month can change depending on &lt;font color="#ff00ff" face="Courier New"&gt;@@LANGUAGE&lt;/font&gt;. If &lt;font face="Courier New"&gt;&lt;font color="#ff00ff"&gt;@@LANGUAGE&lt;/font&gt;=’french’ &lt;/font&gt;then the string '2009-12-08 18:00:00' is interpreted as 12&lt;sup&gt;th&lt;/sup&gt; August 2009 (‘août’ is French for August for those that don’t know) whereas if &lt;font face="Courier New"&gt;&lt;font color="#ff00ff"&gt;@@LANGUAGE&lt;/font&gt;=’us_english’ &lt;/font&gt;it is interpreted as 8&lt;sup&gt;th&lt;/sup&gt; December 2009.&lt;/p&gt;

&lt;p&gt;Clearly this is a problem because the results of our queries have a dependency on a server-level or connection-level setting and that is NOT a good thing. Hence I recommend that you only define &lt;font face="Courier New"&gt;[datetime]&lt;/font&gt; literals in one of the two unambiguous date formats:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;yyyy-MM-dd&lt;strong&gt;&lt;u&gt;T&lt;/u&gt;&lt;/strong&gt;HH24:mi:ss &lt;/li&gt;

  &lt;li&gt;yyyyMMdd HH24:mi:ss &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;That was going to be the end of this blog post but then I found out that this behaviour changed slightly in SQL Server 2008. Take the following code (see if you can figure out what the results will be before I tell you):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;table cellspacing="0" cellpadding="0" bgcolor="#eeeeee"&gt;
      &lt;tr&gt;
        &lt;td&gt;
          &lt;pre style="padding-bottom:10px;padding-left:20px;padding-right:20px;font-family:consolas,lucida console,courier new,courier;font-size:12px;padding-top:10px;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;&lt;font color="blue"&gt;ALTER&amp;#160; DATABASE &lt;/font&gt;&lt;font color="black"&gt;tempdb
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;SET&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;COMPATIBILITY_LEVEL &lt;/font&gt;&lt;font color="blue"&gt;= &lt;/font&gt;&lt;font color="black"&gt;100 &lt;/font&gt;&lt;font color="gray"&gt;; &lt;/font&gt;&lt;font color="green"&gt;--Behave like SQL Server 2008
&lt;br /&gt;&lt;/font&gt;&lt;font color="black"&gt;GO
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;USE &lt;/font&gt;&lt;font color="black"&gt;tempdb
&lt;br /&gt;GO
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;SET&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="black"&gt;LANGUAGE french&lt;/font&gt;&lt;font color="gray"&gt;;
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;DECLARE&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#434343"&gt;@dt &lt;/font&gt;&lt;font color="magenta"&gt;NCHAR&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="black"&gt;10&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="blue"&gt;= &lt;/font&gt;&lt;font color="red"&gt;'2009-12-08 18:00:00'&lt;/font&gt;&lt;font color="gray"&gt;; &lt;/font&gt;&lt;font color="green"&gt;--Ambiguous date format
&lt;br /&gt;&lt;/font&gt;&lt;font color="blue"&gt;SELECT &lt;/font&gt;&lt;font color="magenta"&gt;CAST&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="#434343"&gt;@dt &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;datetime&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;[ExplicitCast]
&lt;br /&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="magenta"&gt;DATENAME&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="magenta"&gt;MONTH&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="#434343"&gt;@dt&lt;/font&gt;&lt;font color="gray"&gt;) &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;[MonthFromImplicitCast]
&lt;br /&gt;&lt;/font&gt;&lt;font color="gray"&gt;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="magenta"&gt;DATENAME&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="magenta"&gt;MONTH&lt;/font&gt;&lt;font color="gray"&gt;,&lt;/font&gt;&lt;font color="magenta"&gt;CAST&lt;/font&gt;&lt;font color="gray"&gt;(&lt;/font&gt;&lt;font color="#434343"&gt;@dt &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;datetime&lt;/font&gt;&lt;font color="gray"&gt;)) &lt;/font&gt;&lt;font color="blue"&gt;AS &lt;/font&gt;&lt;font color="black"&gt;[MonthFromExplicitCast]&lt;/font&gt;&lt;font color="gray"&gt;;&lt;/font&gt;&lt;/pre&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here we are doing three different things with our nchar literal:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;explicitly cast it as a &lt;font face="Courier New"&gt;[datetime]&lt;/font&gt; &lt;/li&gt;

  &lt;li&gt;extract the month name from the char literal using the &lt;font color="#ff00ff"&gt;DATENAME&lt;/font&gt; function (which results in an under-the-covers implicit cast) &lt;/li&gt;

  &lt;li&gt;extract the month name from the char literal using the &lt;font color="#ff00ff"&gt;DATENAME&lt;/font&gt; function after it has been explicitly casted as a &lt;font face="Courier New"&gt;[datetime]&lt;/font&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that the compatibility level is set to SQL Server 2008 and &lt;font face="Courier New"&gt;&lt;font color="#ff00ff"&gt;@@LANGUAGE&lt;/font&gt;=’french’&lt;/font&gt;. Here are the results:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_79B26C8B.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_519FBD6C.png" width="431" height="87" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(Were you correct?)&lt;/p&gt;

&lt;p&gt;Let’s take a look at what is happening here. The behaviour when we are explicitly casting as &lt;font face="Courier New"&gt;[datetime]&lt;/font&gt; hasn’t changed, our nchar literal is still getting interpreted as 12th August rather than 8th December when &lt;font face="Courier New"&gt;&lt;font face="Courier New"&gt;&lt;font color="#ff00ff"&gt;@@LANGUAGE&lt;/font&gt;&lt;/font&gt;=’french’&lt;/font&gt;. The &lt;font face="Courier New"&gt;[MonthFromExplicitCast]&lt;/font&gt; field is interesting though, it seems as though the implicit cast has resulted in the desired value of 8th December. Why is that?&lt;/p&gt;

&lt;p&gt;To get the answer we can turn to &lt;a href="http://msdn.microsoft.com/en-us/library/ms174395.aspx"&gt;BOL’s description&lt;/a&gt; of the &lt;font color="#ff00ff"&gt;DATENAME&lt;/font&gt; function syntax:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href="http://sqlblog.com/blogs/jamie_thomson/image_6C6BE378.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://sqlblog.com/blogs/jamie_thomson/image_thumb_6B937D8E.png" width="244" height="85" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The implicit cast is not casting to &lt;font face="Courier New"&gt;[datetime]&lt;/font&gt; at all, it is actually casting to [date] which is a new datatype in SQL Server 2008. The new date-related datatypes in SQL Server 2008 (i.e. &lt;font face="Courier New"&gt;[date], [datetime2], [time], [datetimeoffset]&lt;/font&gt;) dis&lt;em&gt;regard&lt;/em&gt;&amp;#160;&lt;font face="Courier New"&gt;&lt;font color="#ff00ff"&gt;@@LANGUAGE&lt;/font&gt;&lt;/font&gt; and hence we get behaviour that is more predictable and, frankly, better.&lt;/p&gt;

&lt;p&gt;These new behaviours for SQL Server 2008 were unknown to me when I began this blog post so I have learnt something in the course of authoring it, I hope it has helped you too. No doubt someone somewhere is going to get nastily burnt by this at some point, make sure that it isn’t you by always using unambiguous date formats:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;yyyy-MM-ddTHH24:mi:ss &lt;/li&gt;

  &lt;li&gt;yyyyMMdd HH24:mi:ss &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;regardless of which version you are on!&lt;/p&gt;

&lt;p&gt;Don’t forget to check out other &lt;a href="http://sqlblog.com/tags/T-SQL+Tuesday/default.aspx"&gt;T-SQL Tuesday&lt;/a&gt; blog posts, see Adam Machanic’s blog post &lt;a href="http://sqlblog.com/blogs/adam_machanic/archive/2009/11/30/invitation-to-participate-in-t-sql-tuesday-001-date-time-tricks.aspx"&gt;Invitation to Participate in T-SQL Tuesday #001: Date/Time Tricks&lt;/a&gt; for details!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/jamiet"&gt;@Jamiet&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>