<?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-26619214</id><updated>2011-12-15T22:10:04.026-05:00</updated><category term='tables'/><category term='xml'/><category term='webcontrols'/><category term='csv'/><category term='sql'/><category term='ASP.NET'/><title type='text'>Ann Lewkowicz</title><subtitle type='html'>Software development and such</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ann</name><uri>http://www.blogger.com/profile/04912097426262293763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_IL8bS3nl5pI/TLhd5_0fcxI/AAAAAAAAAAM/I-ghOxBFlQI/S220/Self-portrait.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-26619214.post-6544747929537589324</id><published>2011-11-17T17:19:00.000-05:00</published><updated>2011-11-17T17:19:28.809-05:00</updated><title type='text'>A Request</title><content type='html'>I know "the combined Ohio, Indiana, and Northern Kentucky metro area" is an awkward phrase.&amp;nbsp; It cries out for&amp;nbsp;abbreviation.&lt;br /&gt;&lt;br /&gt;But please, don't call it "OINK".&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-6544747929537589324?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/6544747929537589324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=6544747929537589324' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/6544747929537589324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/6544747929537589324'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2011/11/request.html' title='A Request'/><author><name>Ann</name><uri>http://www.blogger.com/profile/04912097426262293763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_IL8bS3nl5pI/TLhd5_0fcxI/AAAAAAAAAAM/I-ghOxBFlQI/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-7801048753790326483</id><published>2011-03-28T11:11:00.003-04:00</published><updated>2011-04-08T13:01:49.754-04:00</updated><title type='text'>Towards a Print Statement that Appears in SQL Profiler –Part 1</title><content type='html'>The SQL Server PRINT statement can be very useful.&amp;nbsp; Some uses:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Impromptu performance testing:&amp;nbsp; save the start time of a chunk of SQL in a variable, and at the end PRINT the difference between the current time and end time. &lt;/li&gt;&lt;li&gt;Verifying during debugging that a variable used in a stored proc has the expected value at a certain point. &lt;/li&gt;&lt;li&gt;Obtaining the value of a variable retrieved from the database during a proc so that the developer can do impromptu querying of other tables and verify their contents. &lt;/li&gt;&lt;/ol&gt;But the PRINT statement doesn’t echo to SQL Profiler.&amp;nbsp; This means that you can only do the above if you’re working with SSMS or otherwise have access to SQL Info Messages.&amp;nbsp; Oh, you can get a copy of the command you executed – “PRINT @ID” or whatever – but you won’t get visibility through Profiler to what @ID was.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;This is a problem if you’re trying to diagnose a stored procedure as an application executes it.&amp;nbsp; I started research a few days ago on how I might provide a PRINT to Profiler capability.&lt;br /&gt;&lt;br /&gt;Let me say up front that I did not find a perfect solution.&amp;nbsp; But I can offer three partial ones.&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp; Use &lt;a href="http://msdn.microsoft.com/en-us/library/ms177548.aspx" target="_blank"&gt;sp_trace_generateevent&lt;/a&gt;.&amp;nbsp; This is an extended stored procedure that lets you write a user-defined event to the trace log.&amp;nbsp; You can provide up to 256 chars of text and 8000 bytes of event data.&amp;nbsp; The characters appear in TextData and the 8000 bytes in BinaryData.&amp;nbsp;&amp;nbsp; There are 10 reserved event Ids (82 to 91) that you can use for your own purposes.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Here’s a stored proc that combines PRINT and using sp_trace_generateevent:&lt;br /&gt;&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; height: 257px; min-height: 40px; overflow: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 585px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CREATE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;CREATE&lt;/a&gt; &lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=PROCEDURE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;PROCEDURE&lt;/a&gt; PrintTrace1&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;@&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Text&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;Text&lt;/a&gt; &lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=nvarchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;nvarchar&lt;/a&gt;(&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=max&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;max&lt;/a&gt;) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;AS&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=BEGIN&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;BEGIN&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=DECLARE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;DECLARE&lt;/a&gt; @UserData &lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=BINARY&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;BINARY&lt;/a&gt;(8000) = 0&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=DECLARE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;DECLARE&lt;/a&gt; @UserInfo &lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NVARCHAR&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;NVARCHAR&lt;/a&gt;(256) = &lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SUBSTRING&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;SUBSTRING&lt;/a&gt;(@&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Text&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;Text&lt;/a&gt;,1,256)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=PRINT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;PRINT&lt;/a&gt;   @&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Text&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;Text&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=EXEC&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;EXEC&lt;/a&gt; &lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=sp_trace_generateevent&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: orange;"&gt;sp_trace_generateevent&lt;/a&gt; 82, @UserInfo, @UserData&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=END&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;END&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=GO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;GO&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;In order to see the trace output in Sql Server Profiler, you need to turn on the appropriate user defined event.&amp;nbsp; My code above uses user-configurable event 0&amp;nbsp; (id=82), so you need to turn it on:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_IL8bS3nl5pI/TZClCNP56AI/AAAAAAAAACQ/aK-sqsD1tgk/s1600-h/image%5B4%5D.png"&gt;&lt;img alt="image" border="0" height="383" src="http://lh3.ggpht.com/_IL8bS3nl5pI/TZClCbQVpvI/AAAAAAAAACU/KUzTPayaBuI/image_thumb%5B2%5D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="585" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here’s what the test script looked like:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #fbfbfb; border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; border-right: #cecece 1px solid; border-top: #cecece 1px solid; height: 167px; min-height: 40px; overflow: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; width: 585px;"&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=DECLARE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;DECLARE&lt;/a&gt; @PrintText &lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;varchar&lt;/a&gt;(256) = '&lt;span style="color: darkred;"&gt;This is a test &lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;This &lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=is&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;is&lt;/a&gt; a test&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;This &lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=is&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;is&lt;/a&gt; a test&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;This &lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=is&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;is&lt;/a&gt; a test&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;This &lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=is&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;is&lt;/a&gt; a test'&lt;span style="color: darkred;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;&lt;a href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=EXEC&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99" style="color: blue;"&gt;EXEC&lt;/a&gt; PrintTrace1 @PrintText&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;And here’s what the SQL Profiler output looks like: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_IL8bS3nl5pI/TZClC3iThmI/AAAAAAAAACY/4J_hqZ2xWrE/s1600-h/image%5B19%5D.png"&gt;&lt;img alt="image" border="0" height="348" src="http://lh3.ggpht.com/_IL8bS3nl5pI/TZClDYbp5OI/AAAAAAAAACc/9cVepwCGOPs/image_thumb%5B9%5D.png?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="591" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This works just fine, as long as you only need to PRINT 256 chars.&amp;nbsp; But suppose you need more?&amp;nbsp; Suppose your app works by retrieving templated SQL from a database table, and you need to be able to see every line that’s about to be executed?&amp;nbsp; In that case, sp_trace_generateevent won’t help you.&amp;nbsp; We’ll discuss other options next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-7801048753790326483?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/7801048753790326483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=7801048753790326483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/7801048753790326483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/7801048753790326483'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2011/03/towards-print-statement-that-appears-in.html' title='Towards a Print Statement that Appears in SQL Profiler –Part 1'/><author><name>Ann</name><uri>http://www.blogger.com/profile/04912097426262293763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_IL8bS3nl5pI/TLhd5_0fcxI/AAAAAAAAAAM/I-ghOxBFlQI/S220/Self-portrait.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_IL8bS3nl5pI/TZClCbQVpvI/AAAAAAAAACU/KUzTPayaBuI/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-3028138352429354721</id><published>2011-03-06T17:41:00.001-05:00</published><updated>2011-03-16T15:55:27.523-04:00</updated><title type='text'>Quick and Dirty Unpivoting with SQL Server’s XML Features</title><content type='html'>&lt;p&gt;Let’s suppose you want to return some data in the following extremely unpivoted format:&lt;/p&gt;  &lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 549px; padding-right: 5px; height: 96px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt;  ID&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;   ,    ColumnName&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;   ,    &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Value&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Value&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt;    .. something ..&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Your source table or query has (let’s say) about 30 different columns.&amp;#160; How can you quickly produce something in the format above?&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Well, one way is a bunch of UNION statements, like so (using the AdventureWorks database):&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 558px; padding-right: 5px; height: 251px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  ID = ProductId&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    ,   ColumnName = '&lt;span style="color: #8b0000"&gt;Name&lt;/span&gt;'&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    ,   &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Value&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Value&lt;/a&gt; = Name&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;    Production.Product&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=union&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;union&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  ID = ProductId&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    ,   ColumnName = '&lt;span style="color: #8b0000"&gt;ProductNumber&lt;/span&gt;'&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    ,   &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Value&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Value&lt;/a&gt; = ProductNumber&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;    Production.Product    &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=union&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;union&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  ID = ProductId&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    ,   ColumnName = '&lt;span style="color: #8b0000"&gt;MakeFlag&lt;/span&gt;' &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    ,   &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Value&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Value&lt;/a&gt; = &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CONVERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CONVERT&lt;/a&gt;(&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=char&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;char&lt;/a&gt;(1), MakeFlag)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;    Production.Product&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This works fine, if you have only a few columns you want to return in this format.&amp;#160; If you have 20-30, as with the Production.Product table, that’s a lot of UNION statements.&amp;#160; And copying the code to use for another table is basically a waste of time:&amp;#160; you’ll have to change so many things you might as well just start typing from scratch.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Another way is using the UNPIVOT statement.&amp;#160; It produces the same sort of result, and looks like this:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 558px; padding-right: 5px; height: 201px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  *&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;    (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Select&lt;/a&gt;  ProductId, &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            ProductLine, &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            Class, &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            Style &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt; Production.Product) &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; pv&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;UNPIVOT (&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Value&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Value&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=for&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;for&lt;/a&gt; FieldName &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=IN&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;IN&lt;/a&gt; (ProductLine, Class, Style)) p&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;But all the fields you want to unpivot need to be of the exact same type.&amp;#160; For strings, that means the same type AND the same length.&amp;#160; (The ProductLine, Class, and Style fields above are are nchar(2)).&amp;#160; Plus, you need to list all the fields to which you want the UNPIVOT to apply.&amp;#160; If you have 20 or 30 fields, that’s a lot of fields to list.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So, what we need is a way to produce a list of this form, that can adapt to differing column types, can be applied to all fields or some fields in a table with a minimum of column-name-typing, and which can be copied-and-repurposed without requiring a complete retype.&amp;#160; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Here’s one way to do it, using XML.&amp;#160; In terms of performance, it is the slowest of the three options, but in terms of programmer time, it’s definitely the fastest and most versatile.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 548px; padding-right: 5px; height: 336px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=with&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;with&lt;/a&gt; A&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;--  We're going to return the product ID, plus an XML version of the &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;--  entire record.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  ProductId&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	    ,   (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Select&lt;/a&gt;  * &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;    Production.Product &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=where&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;where&lt;/a&gt;   ProductID = pp.ProductId&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=for&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;for&lt;/a&gt; xml auto, type) &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; X&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;    Production.Product pp&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;,	B&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt;	(&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;--  We're going to run an Xml query against the XML field, and transform it&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;--  into a series of name-value pairs.  But X2 will still be a single XML&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;--  field, associated with this product ID.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  ProductId&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        ,   X.query(&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;		       '&lt;span style="color: #8b0000"&gt;for $f in Production.Product/@*&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;		        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=return&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;return&lt;/a&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    				&amp;lt;product name=&amp;quot;&lt;span style="color: #8b0000"&gt;{ local-name($f) }&lt;/span&gt;&amp;quot; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=value&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;value&lt;/a&gt;=&amp;quot;&lt;span style="color: #8b0000"&gt;{ data($f) }&lt;/span&gt;&amp;quot; /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;		    '&lt;span style="color: #8b0000"&gt;) as X2&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;	A&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;,	C&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt;	(&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;--  We're going to run the Nodes function against the X2 field, splitting &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;--  our list of &amp;quot;product&amp;quot; elements into individual nodes.  We will then use&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;-- the Value function to extract the name and value.  &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;	B.ProductId &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; ID&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;		,	norm.product.&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=value&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;value&lt;/a&gt;('&lt;span style="color: #8b0000"&gt;@name&lt;/span&gt;', '&lt;span style="color: #8b0000"&gt;varchar(max)&lt;/span&gt;') &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; Name&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;		,	norm.product.&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=value&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;value&lt;/a&gt;('&lt;span style="color: #8b0000"&gt;@value&lt;/span&gt;', '&lt;span style="color: #8b0000"&gt;varchar(max)&lt;/span&gt;') &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Value&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Value&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;	B&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=cross&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;cross&lt;/a&gt; apply B.X2.nodes('&lt;span style="color: #8b0000"&gt;/product&lt;/span&gt;') &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; norm(product)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;-- Select our results.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;	*&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;	C&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Note a couple of things:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;1.&amp;#160; We’re using (and returning) all the fields from Production.Product, but we didn’t have to list the field names.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;2.&amp;#160; We’re using the term “Product” in C and referring to the XML node Production.Product, but those names are arbitrary:&amp;#160; we could have formed the XML in step A in such a way that it had a generic name. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;3.&amp;#160; If you wanted to return fewer columns, you have a couple of choices:&amp;#160; you can specify the particular columns you want in the subquery in step A, or you could filter them out at the final step.&amp;#160; (Since the column names are in the field Name, you could even join to sys.all_columns or some other list of column names, so as to filter by type or some other criteria.)&amp;#160; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;4.&amp;#160; We are returning the Value column as varchar(max); this is because anything can be expressed as a varchar.&amp;#160; But if we were returning, say, all ints, we could specify in the &lt;em&gt;value&lt;/em&gt; ()function that the data should be returned as an type int.&amp;#160; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;5.&amp;#160; Nulls are automatically filtered out.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Here’s what the results look like, by the way:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_IL8bS3nl5pI/TXQPqAsRjvI/AAAAAAAAACI/Vg9t9SyccKM/s1600-h/Capture%20Normalization%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Capture Normalization" border="0" alt="Capture Normalization" src="http://lh5.ggpht.com/_IL8bS3nl5pI/TXQPqiUi_iI/AAAAAAAAACM/mY08YkBpFlU/Capture%20Normalization_thumb%5B1%5D.png?imgmax=800" width="589" height="270" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Not bad, I think.&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-3028138352429354721?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/3028138352429354721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=3028138352429354721' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/3028138352429354721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/3028138352429354721'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2011/03/quick-and-dirty-normalization-with-sql.html' title='Quick and Dirty Unpivoting with SQL Server’s XML Features'/><author><name>Ann</name><uri>http://www.blogger.com/profile/04912097426262293763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_IL8bS3nl5pI/TLhd5_0fcxI/AAAAAAAAAAM/I-ghOxBFlQI/S220/Self-portrait.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_IL8bS3nl5pI/TXQPqiUi_iI/AAAAAAAAACM/mY08YkBpFlU/s72-c/Capture%20Normalization_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-550974127673491165</id><published>2011-02-20T18:41:00.001-05:00</published><updated>2011-02-20T18:41:32.637-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='csv'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>Doing Things with Strings: SQL, Xml, and String Manipulation, Part II</title><content type='html'>&lt;p&gt;This series of posts is about using SQL Server’s Xml features to do string manipulations.&amp;#160; &lt;a href="http://www.annlewkowicz.com/2011/01/doing-things-with-strings-sql-xml-and.html" target="_blank"&gt;Part I&lt;/a&gt; talked about creating comma-separated (CSV) lists from SQL database data.&amp;#160; Part II, this post, will talk about &lt;em&gt;parsing&lt;/em&gt; a comma-separated list.&lt;/p&gt;  &lt;p&gt;Until Xml-typed parameters came along in SQL Server 2005, the only easy way to pass a set of information into a stored procedure was by passing a string parameter that represented serialized data.&amp;#160; The two most common forms were an Xml fragment, and a CSV string.&amp;#160; Parsing these CSV strings usually required a custom table-valued function that used T-SQL string manipulation operations to parse out the information and build the return table.&amp;#160; &lt;/p&gt;  &lt;p&gt;This is a perfectly good solution, but there’s a faster one.&amp;#160; I’ll give you the code for it, right up front:&lt;/p&gt;  &lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 560px; padding-right: 5px; height: 465px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CREATE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CREATE&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FUNCTION&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FUNCTION&lt;/a&gt; ParseCsv&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;(&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    @Csv &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;varchar&lt;/a&gt;(&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=max&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;max&lt;/a&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=RETURNS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;RETURNS&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=TABLE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;TABLE&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;AS&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=RETURN&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;RETURN&lt;/a&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #008000"&gt;-- We're being passed in a CSV string; we'll replace the commas with&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #008000"&gt;-- endtag/start tag pairs.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=WITH&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;WITH&lt;/a&gt; A&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;AS&lt;/a&gt;  (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt;  REPLACE(@Csv, '&lt;span style="color: #8b0000"&gt;,&lt;/span&gt;', '&lt;span style="color: #8b0000"&gt;&amp;lt;/dummy&amp;gt;&amp;lt;dummy&amp;gt;&lt;/span&gt;') &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; XmlFrag1&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        )&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        ,   B&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;AS&lt;/a&gt;  (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;-- We're building an XML fragment out of the CSV, in fact.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt;  '&lt;span style="color: #8b0000"&gt;&amp;lt;dummy&amp;gt;&lt;/span&gt;' + XmlFrag1 + '&lt;span style="color: #8b0000"&gt;&amp;lt;/dummy&amp;gt;&lt;/span&gt;' &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; XmlFrag2&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt;    A&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        )&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        ,   C&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;AS&lt;/a&gt;  (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;-- Convert it actually to type XML&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt;  &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CONVERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CONVERT&lt;/a&gt;(xml, XmlFrag2) &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; XmlFrag3&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt;    B&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        )&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;-- For more on XmlFragment, see below.  Right now, we want the&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;-- content of the fragment, which we're getting with the value()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;-- function, and converting it to &amp;quot;int&amp;quot;. &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt;  D.XmlFragment.&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=value&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;value&lt;/a&gt;('&lt;span style="color: #8b0000"&gt;.&lt;/span&gt;', '&lt;span style="color: #8b0000"&gt;int&lt;/span&gt;') &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Value&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Value&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt;    C&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;-- When you want to access the Xml field in every record, and &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;-- apply the &amp;quot;nodes&amp;quot; function to it, you need to remember that&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;-- nodes() is a *function*, and thus can be used with CROSS APPLY&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;-- to run the function for every record in the record source (C).&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;-- Hence, we run nodes() on C.XmlFrag3 for every record, and call&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;-- the resulting set of data D, with the results of &amp;quot;nodes&amp;quot; being&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;-- the field XmlFragment.  &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CROSS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CROSS&lt;/a&gt; APPLY C.XmlFrag3.nodes('&lt;span style="color: #8b0000"&gt;/dummy&lt;/span&gt;') &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; D(XmlFragment)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;     )&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;     &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;You’ll want to test it, so here’s code (using the AdventureWorksLT database) that generates a CSV string.&amp;#160; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 560px; padding-right: 5px; height: 387px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=DECLARE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;DECLARE&lt;/a&gt; @csv &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;varchar&lt;/a&gt;(&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=max&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;max&lt;/a&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=WITH&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;WITH&lt;/a&gt; A&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt; (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt;  ProductID &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt;    SalesLT.Product&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FOR&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FOR&lt;/a&gt; XML AUTO, ELEMENTS, TYPE&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    ) &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; ProductXml&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;   )&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;   &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;,   B&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;AS&lt;/a&gt;  (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt; A.ProductXml.query('&lt;span style="color: #8b0000"&gt;data(*)&lt;/span&gt;') &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;AS&lt;/a&gt; ProductSeries &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt; A&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt;  @csv = REPLACE(&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CONVERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CONVERT&lt;/a&gt;(&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;varchar&lt;/a&gt;(&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=max&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;max&lt;/a&gt;), ProductSeries),'&lt;span style="color: #8b0000"&gt; &lt;/span&gt;','&lt;span style="color: #8b0000"&gt;,&lt;/span&gt;')&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt; B&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt; @csv&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt; * &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt; ParseCsv(@csv)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;And here’s the result you get from the test.&amp;#160; The first recordset is just the select on @Csv, the second one is the result of the function. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_IL8bS3nl5pI/TWGmqo83_KI/AAAAAAAAAB4/WjNXZu9geRI/s1600-h/image%5B5%5D.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://lh3.ggpht.com/_IL8bS3nl5pI/TWGmq17GzkI/AAAAAAAAAB8/E3gy75B9z9k/image_thumb%5B3%5D.png?imgmax=800" width="565" height="264" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;In tests, this consistently ran in half the time of a T-SQL string manipulation solution, regardless of the number of values in the CSV. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-550974127673491165?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/550974127673491165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=550974127673491165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/550974127673491165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/550974127673491165'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2011/02/doing-things-with-strings-sql-xml-and.html' title='Doing Things with Strings: SQL, Xml, and String Manipulation, Part II'/><author><name>Ann</name><uri>http://www.blogger.com/profile/04912097426262293763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_IL8bS3nl5pI/TLhd5_0fcxI/AAAAAAAAAAM/I-ghOxBFlQI/S220/Self-portrait.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_IL8bS3nl5pI/TWGmq17GzkI/AAAAAAAAAB8/E3gy75B9z9k/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-2566612151990895826</id><published>2011-01-30T22:26:00.001-05:00</published><updated>2011-01-30T22:26:20.129-05:00</updated><title type='text'>Useful Things to Know, #428</title><content type='html'>&lt;p&gt;Contrary to a lot of what you’ll find said online, Linq to SQL seems to work fairly happily with tables from different SQL Server databases (but the same server) in the same model.&amp;#160; You just have to put the full name (including the database) into the Name property of the entities representing tables in the “foreign” database.&amp;#160; You can even build associations between tables from different databases:&amp;#160; Linq to SQL will take your word for it that those relationships exist.&lt;/p&gt;  &lt;p&gt;A caveat: I have only tested this on VS 2008 (what I happen to be working with right now) and I haven’t attempted anything fancy with updates or inserts (since what I’m working on doesn’t require them).&amp;#160; But, since I found people saying emphatically that cross-database modeling couldn’t be done in Linq to SQL, I wanted to report that it can.&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-2566612151990895826?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/2566612151990895826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=2566612151990895826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/2566612151990895826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/2566612151990895826'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2011/01/useful-things-to-know-428.html' title='Useful Things to Know, #428'/><author><name>Ann</name><uri>http://www.blogger.com/profile/04912097426262293763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_IL8bS3nl5pI/TLhd5_0fcxI/AAAAAAAAAAM/I-ghOxBFlQI/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-3620811222367851391</id><published>2011-01-22T17:03:00.008-05:00</published><updated>2011-02-20T17:59:03.415-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='csv'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>Doing Things With Strings: SQL, Xml, and String Manipulation, Part I</title><content type='html'>SQL Server 2005 introduced new features for handling and manipulating Xml. Generating Xml via T-SQL is much simpler than it used to be. Parsing Xml is much, much easier, and we have a an Xml data type to use, too. All of that is pretty well documented in the Books Online. So if you need to produce or consume Xml, that's where to look.   &lt;br /&gt;  &lt;br /&gt;But what these posts will be about is using Xml and the Xml features to get some non-Xml things done. Specifically, I'm going to talk about some types of string manipulation that the Xml features make faster and easier.   &lt;br /&gt;  &lt;br /&gt;&lt;strong&gt;Generating Comma-Separated Lists&lt;/strong&gt;&lt;span style="font-weight: bold"&gt; (CSV Strings)&lt;/span&gt;   &lt;br /&gt;  &lt;br /&gt;Sometimes, when you're summarizing data, you want the values in a column to be aggregated into a comma-separated list. An example of this might be a list of your biggest customers, with the trade associations or buying groups they belong to listed off to one side.   &lt;br /&gt;  &lt;br /&gt;As you know, there is no built-in aggregate to do this in SQL Server. Microsoft (and, I believe, others) have published a &lt;a href="http://msdn.microsoft.com/en-us/library/ms165055.aspx"&gt;SQL CLR aggregate function&lt;/a&gt; that will do this for you.   &lt;br /&gt;  &lt;br /&gt;But, thanks to the Xml features, this can be also be done with T-SQL code, without publishing assemblies or writing custom functions. I’m going to demonstrate it with a series of CTEs, so that each step in the transformation is separate, but you can combine all of them into one expression if you like.   &lt;br /&gt;  &lt;br /&gt;Let’s suppose that we are querying the AdventureWorks2008 database, and we want a list of stores with a list of contacts for each store in the same row, in a comma-separated list.   &lt;br /&gt;  &lt;br /&gt;We start by querying the Sales.Store table, and include a subquery of the Person.Contact table, using the Sales.StoreContact table to link between stores and contacts. Our subquery is going to return the names of the contacts as an Xml fragment.   &lt;br /&gt;  &lt;pre style="border-bottom: rgb(206,206,206) 1px solid; border-left: rgb(206,206,206) 1px solid; padding-bottom: 5px; background-color: rgb(251,251,251); min-height: 40px; padding-left: 5px; width: 568px; padding-right: 5px; height: 264px; overflow: auto; border-top: rgb(206,206,206) 1px solid; border-right: rgb(206,206,206) 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;&lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  CustomerId&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;    ,   Name&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;    ,   (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;        &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Select&lt;/a&gt;  ContactName  = FirstName + '&lt;span style="color: rgb(139,0,0)"&gt; &lt;/span&gt;' + ISNULL(MiddleName + '&lt;span style="color: rgb(139,0,0)"&gt; &lt;/span&gt;','&lt;span style="color: rgb(139,0,0)"&gt;&lt;/span&gt;') + LastName&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;        &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;    Person.Contact pc&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;                    &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=inner&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;inner&lt;/a&gt; &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=join&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;join&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;                Sales.StoreContact ssc&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;                    &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=on&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;on&lt;/a&gt;    pc.ContactID = ssc.ContactID&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;        &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=where&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;where&lt;/a&gt;   ssc.CustomerID = ss.CustomerID&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;        &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=for&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;for&lt;/a&gt;     xml auto, elements, type&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;        ) &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; ContactList1&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;&lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;    Sales.Store ss&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%" size="12px" face="consolas,&amp;#39;Courier New&amp;#39;,courier,monospace"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;This looks like this: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_IL8bS3nl5pI/TTt4vo-oTtI/AAAAAAAAABY/vGrPaGAP5gc/s1600-h/Capture%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Capture" border="0" alt="Capture" src="http://lh6.ggpht.com/_IL8bS3nl5pI/TTt4v7PLigI/AAAAAAAAABc/hUrOSh93ShA/Capture_thumb%5B2%5D.png?imgmax=800" width="575" height="166" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note that we’re only returning one element in our fragments: the Contact Name element. This is the only text that the fragment contains. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Our next step transforms the ContactList1 Xml field into a space-delimited list of names. Because our data has spaces, we’re going to alter our subquery a little to replace the spaces in the data with a character unlikely to appear in a name. You’ll see why in a minute. &lt;br /&gt;&lt;br /&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 572px; padding-right: 5px; height: 445px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=With&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;With&lt;/a&gt; A&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt;  (        &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Select&lt;/a&gt;    ContactName  = FirstName + '&lt;span style="color: #8b0000"&gt; &lt;/span&gt;' + ISNULL(MiddleName + '&lt;span style="color: #8b0000"&gt; &lt;/span&gt;','&lt;span style="color: #8b0000"&gt;&lt;/span&gt;') + LastName&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;         ,    ssc.CustomerID   &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;      Person.Contact pc            &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                  &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=inner&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;inner&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=join&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;join&lt;/a&gt;                  &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              Sales.StoreContact ssc              &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                  &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=on&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;on&lt;/a&gt;   pc.ContactID = ssc.ContactID    &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; ),  B&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt;  (    &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;     &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  CustomerId        &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;         ,   Name&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;         ,   (                &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                 &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  ContactName = REPLACE(A.ContactName, '&lt;span style="color: #8b0000"&gt; &lt;/span&gt;','&lt;span style="color: #8b0000"&gt;|&lt;/span&gt;')&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                 &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;    A&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                 &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=where&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;where&lt;/a&gt;   CustomerID = ss.CustomerID &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                 &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=for&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;for&lt;/a&gt;     xml auto, elements, type &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;             ) &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; ContactList1    &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;     &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;   Sales.Store ss&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  B.*&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;   ,    ContactList2 = B.ContactList1.query('&lt;span style="color: #8b0000"&gt;data(*)&lt;/span&gt;')&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;    B&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;This produces results like this: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_IL8bS3nl5pI/TTt4wELYb2I/AAAAAAAAABg/Q6wjEmVRirM/s1600-h/Capture2%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Capture2" border="0" alt="Capture2" src="http://lh3.ggpht.com/_IL8bS3nl5pI/TTt4w_6EHDI/AAAAAAAAABk/qc6aqxC_oE8/Capture2_thumb%5B1%5D.png?imgmax=800" width="574" height="163" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To convert this to a comma-separated list, we just need to do a conversion and some REPLACE statements: &lt;br /&gt;&lt;br /&gt;&lt;pre style="border-bottom: rgb(206,206,206) 1px solid; border-left: rgb(206,206,206) 1px solid; padding-bottom: 5px; background-color: rgb(251,251,251); min-height: 40px; padding-left: 5px; width: 603px; padding-right: 5px; height: 362px; overflow: auto; border-top: rgb(206,206,206) 1px solid; border-right: rgb(206,206,206) 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;&lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=With&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;With&lt;/a&gt; A&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;&lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt;  (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;        &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Select&lt;/a&gt;    ContactName  = FirstName + '&lt;span style="color: rgb(139,0,0)"&gt; &lt;/span&gt;' + ISNULL(MiddleName + '&lt;span style="color: rgb(139,0,0)"&gt; &lt;/span&gt;','') + LastName&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;             ,    ssc.CustomerID&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;        &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;      Person.Contact pc&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                        &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=inner&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;inner&lt;/a&gt; &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=join&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;join&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                  Sales.StoreContact ssc&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                        &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=on&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;on&lt;/a&gt;   pc.ContactID = ssc.ContactID&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;    )&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;,   B&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;&lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt;  (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;    &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  CustomerId&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;        ,   Name&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;        ,   (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  ContactName = REPLACE(A.ContactName, '&lt;span style="color: rgb(139,0,0)"&gt; &lt;/span&gt;','|') &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;    A&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=where&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;where&lt;/a&gt;   CustomerID = ss.CustomerID&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=for&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;for&lt;/a&gt;     xml auto, elements, type&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;            ) &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; ContactList1&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;    &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;   Sales.Store ss&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;,   C&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;&lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt;  (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;&lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  B.*&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;   ,    ContactList2 = B.ContactList1.query('&lt;span style="color: rgb(139,0,0)"&gt;data(*)&lt;/span&gt;')&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;&lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;    B&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;&lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt;  C.CustomerID&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;    ,   C.Name&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;    ,   ContactList = REPLACE(&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                        REPLACE(&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                            &lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CONVERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CONVERT&lt;/a&gt;(&lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;varchar&lt;/a&gt;(&lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=max&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;max&lt;/a&gt;), C.ContactList2)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                        ,   '&lt;span style="color: rgb(139,0,0)"&gt; &lt;/span&gt;'  &lt;span style="color: rgb(0,128,0)"&gt;-- convert spaces ...&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                        ,   '&lt;span style="color: rgb(139,0,0)"&gt;, &lt;/span&gt;' &lt;span style="color: rgb(0,128,0)"&gt;-- to commas (followed by spaces, if youlike)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                        )&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                      , '|'  &lt;span style="color: rgb(0,128,0)"&gt;-- replace the pipe char ...&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                      , '&lt;span style="color: rgb(139,0,0)"&gt; &lt;/span&gt;'  &lt;span style="color: rgb(0,128,0)"&gt;-- with the original spaces!&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;                      )&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: rgb(251,251,251); margin: 0em; width: 100%; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; font-size: 12px"&gt;&lt;a style="color: rgb(0,0,255)" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;    C&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;… and the result looks like this: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_IL8bS3nl5pI/TTt4xWatlcI/AAAAAAAAABo/JNuFNj0MpJE/s1600-h/capture3%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="capture3" border="0" alt="capture3" src="http://lh6.ggpht.com/_IL8bS3nl5pI/TTt4xr4IvJI/AAAAAAAAABs/klKimlvEk94/capture3_thumb%5B1%5D.png?imgmax=800" width="590" height="179" /&gt;&lt;/a&gt; Voilà: inline comma-separated lists! &lt;br /&gt;&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-3620811222367851391?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/3620811222367851391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=3620811222367851391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/3620811222367851391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/3620811222367851391'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2011/01/doing-things-with-strings-sql-xml-and.html' title='Doing Things With Strings: SQL, Xml, and String Manipulation, Part I'/><author><name>Ann</name><uri>http://www.blogger.com/profile/04912097426262293763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_IL8bS3nl5pI/TLhd5_0fcxI/AAAAAAAAAAM/I-ghOxBFlQI/S220/Self-portrait.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_IL8bS3nl5pI/TTt4v7PLigI/AAAAAAAAABc/hUrOSh93ShA/s72-c/Capture_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-4594158873967608201</id><published>2010-10-30T19:46:00.003-04:00</published><updated>2010-11-02T09:39:41.118-04:00</updated><title type='text'>Useful Things to Know, #427</title><content type='html'>&lt;p&gt;When it comes to XML, SQL Server won't always eat its own cooking.    &lt;br /&gt;    &lt;br /&gt;What I mean by that is that it's quite possible to generate syntactically valid XML from valid SQL Server data, via SQL Server queries, that is semantically invalid.&amp;#160; SQL Server will deliver this data, but it won’t consume it or allow it to be assigned to an XML-type variable.&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;Here's how.&amp;#160; Suppose you have the bad luck to have some non-printable characters in some of your text fields. XML only tolerates a few non-printable characters -- although I'd have to look it up, I think the ASCII characters for 9, 10, and 13 are the only ones it &lt;span style="font-style: italic"&gt;does&lt;/span&gt; tolerate.     &lt;br /&gt;    &lt;br /&gt;So consider this SQL:&lt;/p&gt;  &lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 557px; padding-right: 5px; height: 262px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=create&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;create&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=table&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;table&lt;/a&gt; BadChars&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;(&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;TextData &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;varchar&lt;/a&gt;(255)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=insert&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;insert&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=into&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;into&lt;/a&gt; BadChars&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=values&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;values&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  (&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=char&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;char&lt;/a&gt;(4)) &lt;span style="color: #008000"&gt;-- bad char&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;, (&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=char&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;char&lt;/a&gt;(6)) &lt;span style="color: #008000"&gt;-- bad char&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;, (&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=char&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;char&lt;/a&gt;(10)) &lt;span style="color: #008000"&gt;-- good non-printable char&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;, (&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=char&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;char&lt;/a&gt;(13)) &lt;span style="color: #008000"&gt;-- good non-printable char&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;, (&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=char&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;char&lt;/a&gt;(33)) &lt;span style="color: #008000"&gt;-- regular character&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Let's retrieve this data as XML:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 575px; padding-right: 5px; height: 92px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt; *&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt; BadChars&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=for&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;for&lt;/a&gt; xml auto, root('&lt;span style="color: #8b0000"&gt;BadCharTable&lt;/span&gt;')&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;This will run fine, and return you a chunk of XML in SSMS, like so:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 567px; padding-right: 5px; height: 164px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BadCharTable&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BadChars&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TextData&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;&amp;amp;#4;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BadChars&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TextData&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;&amp;amp;#6;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BadChars&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TextData&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;&amp;amp;#10;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BadChars&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TextData&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;&amp;amp;#13;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BadChars&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TextData&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;!&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;BadCharTable&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Just try doing anything with it, though:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 566px; padding-right: 5px; height: 162px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=declare&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;declare&lt;/a&gt; @xml Xml&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt; @xml =&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;(&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt; *&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt; BadChars&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=for&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;for&lt;/a&gt; Xml auto, root('&lt;span style="color: #8b0000"&gt;BadCharTable&lt;/span&gt;')&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;The error you'll get is this:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 564px; padding-right: 5px; height: 76px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;Msg 9420, &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Level&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Level&lt;/a&gt; 16, State 1, Line 3&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;XML parsing: line 1, &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=character&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;character&lt;/a&gt; 40, illegal xml &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=character&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;character&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;That's because the XML it so happily generated a few moments ago is not valid, due to those non-printable characters, that even in escaped form are not allowed. &lt;/p&gt;&lt;p&gt;So SQL Server will return invalid XML in a result set, if the source data contains invalid chars. It just won't consume it, or allow it to be assigned to an XML variable. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-4594158873967608201?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/4594158873967608201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=4594158873967608201' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/4594158873967608201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/4594158873967608201'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/10/useful-things-to-know-427.html' title='Useful Things to Know, #427'/><author><name>Ann</name><uri>http://www.blogger.com/profile/04912097426262293763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_IL8bS3nl5pI/TLhd5_0fcxI/AAAAAAAAAAM/I-ghOxBFlQI/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-4461410818551978349</id><published>2010-10-25T12:07:00.001-04:00</published><updated>2010-11-02T09:40:46.551-04:00</updated><title type='text'>The Joy of HashSets</title><content type='html'>&lt;p&gt;A while back, I mentioned to a colleague that I was going to write a post about hash sets and their general coolness.&amp;#160; He said that hash sets were old hat:&amp;#160; every C++ developer had been using them for years.&lt;/p&gt;  &lt;p&gt;“Yes,” I said, “but not all of us were C++ developers!”&lt;/p&gt;  &lt;p&gt;Here, then, is the MSDN description:&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/bb359438.aspx" target="_blank"&gt;HashSet&amp;lt;T&amp;gt; Class&lt;/a&gt;.&amp;#160; In brief, a hash set is a collection, one that you can very quickly check for membership.&amp;#160; It’s a way to store stuff you find important, when you’re interested in membership in the collection, but not (particularly) in the data or attributes of what you’re storing.&amp;#160; &lt;/p&gt;  &lt;p&gt;The key difference between the hash set and its sibling, the hash table, is that with the hash set you’re not looking anything up by key.&amp;#160; You’re just looking it up by itself, or by key without any interest in what the key refers to.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;So what’s so cool about yet another collection class?&amp;#160; This:&amp;#160; those suckers are &lt;em&gt;fast.&lt;/em&gt;&amp;#160; Consider the following scenario:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;You are processing some data; &lt;/li&gt;    &lt;li&gt;You don’t want to process duplicates; &lt;/li&gt;    &lt;li&gt;Ergo, you need to keep a list of what you’ve already processed. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;This – keeping a collection of stuff you find important, that you can check for membership – is what hash sets are for.&amp;#160;&amp;#160; The items in them are in not in any order (although, if you need that, consider the &lt;a href="http://msdn.microsoft.com/en-us/library/dd412070.aspx" target="_blank"&gt;SortedSet&lt;/a&gt; class).&amp;#160;&amp;#160; And lookups are &lt;em&gt;fast.&lt;/em&gt;&amp;#160;&amp;#160; I shaved a large percentage of time off one application, just by switching from using a List to store my processed ids to a HashSet.&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-4461410818551978349?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/4461410818551978349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=4461410818551978349' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/4461410818551978349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/4461410818551978349'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/10/joy-of-hashsets.html' title='The Joy of HashSets'/><author><name>Ann</name><uri>http://www.blogger.com/profile/04912097426262293763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_IL8bS3nl5pI/TLhd5_0fcxI/AAAAAAAAAAM/I-ghOxBFlQI/S220/Self-portrait.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-6710786685207788104</id><published>2010-10-22T14:21:00.001-04:00</published><updated>2010-10-22T14:21:14.925-04:00</updated><title type='text'>Reverse foreign key relationships</title><content type='html'>&lt;p&gt;Sometimes you have a master table and some child tables, which have foreign key relationships to the master table.&amp;#160;&amp;#160; The child table can’t have a value for the foreign key that is not in the master table, and the master table can’t delete a record that is referred to by records in the child table.&amp;#160; All this is well and good.&lt;/p&gt;  &lt;p&gt;But sometimes, a correct representation of the entities the data is embodying requires that every master table record have one (or more) records in every child table.&amp;#160; An example might be a table of products for sale and a table of prices for those products.&amp;#160;&amp;#160; A price must refer to a specific product, but every product must have at least one price.&lt;/p&gt;  &lt;p&gt;How does one enforce this in the database?&lt;/p&gt;  &lt;p&gt;Now you can say, “That’s business logic!&amp;#160; That doesn’t belong in the database!”&amp;#160; But I tend to feel that there’s a fuzzier line between business logic and database integrity rules than is sometimes acknowledged.&amp;#160; Why is “a price must refer to a product” a question of database integrity, but “a product must have at least one price” a business logic issue? &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-6710786685207788104?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/6710786685207788104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=6710786685207788104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/6710786685207788104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/6710786685207788104'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/10/reverse-foreign-key-relationships.html' title='Reverse foreign key relationships'/><author><name>Ann</name><uri>http://www.blogger.com/profile/04912097426262293763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_IL8bS3nl5pI/TLhd5_0fcxI/AAAAAAAAAAM/I-ghOxBFlQI/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-3095265940536734038</id><published>2010-10-17T12:13:00.001-04:00</published><updated>2010-10-22T14:23:03.461-04:00</updated><title type='text'>Things I’d Like to See, #766</title><content type='html'>&lt;p&gt;I’d like a class derived from IEnumerable&amp;lt;T&amp;gt; to which it was possible to add an index. &lt;/p&gt;  &lt;p&gt;Hear me out.&amp;#160; I have a project that involves generating and capturing a lot of data.&amp;#160; It’s not being retrieved from a database, and it’s not being saved to a database:&amp;#160; it’s being generated, analyzed, and ultimately discarded.&amp;#160; &lt;/p&gt;  &lt;p&gt;While it lives, it lives in some collection classes, Lists and Lookups and the like.&amp;#160; While I’m analyzing it, I often have to summarize in multiple different ways, and do cross-verification and lookups by properties of the classes in the collections.&amp;#160; It’s (relatively) slow.&amp;#160; Any given lookup is, of course, lightning fast, but if it occurs over a big enough data set enough times, it gets slow.&lt;/p&gt;  &lt;p&gt;Well, why not use a literal DataSet, then, you ask?&amp;#160; Those have indexes and primary keys and so on.&amp;#160; And that’s true.&amp;#160; But I want to preserve my strongly typed properties, and create derived (anonymous) summary types.&amp;#160; The syntax of doing that from a DataSet can get complex.&amp;#160; And as for typed DataSets, they have their value, but they’re tough to customize, even with the wonders that are partial classes. &lt;/p&gt;  &lt;p&gt;Moreover, if I went the DataSet route, I’d need to define a DataTable for the result of every Linq summary class that I create, rather than using an anonymous type.&amp;#160; That does away with all the benefits of anonymous types, including the rather significant one that the compiler will adapt to any new fields I create in the source types (the ones being summarized), and either change the definition of the anonymous type or let me know I have a problem.&amp;#160; If I’m relying on DataTable that I create programmatically (or even with an XSD), I don’t find out I have a conflict in definitions until run time.&amp;#160; (Hopefully, test time, but once in a while something slips by you.)&amp;#160; &lt;/p&gt;  &lt;p&gt;So:&amp;#160; I’d like a IEnumerable&amp;lt;T&amp;gt;-based type that supports adding indexes for performance purposes.&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-3095265940536734038?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/3095265940536734038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=3095265940536734038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/3095265940536734038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/3095265940536734038'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/10/things-id-like-to-see-766.html' title='Things I’d Like to See, #766'/><author><name>Ann</name><uri>http://www.blogger.com/profile/04912097426262293763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_IL8bS3nl5pI/TLhd5_0fcxI/AAAAAAAAAAM/I-ghOxBFlQI/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-8574070024860811860</id><published>2010-10-15T10:13:00.001-04:00</published><updated>2010-10-15T10:13:22.489-04:00</updated><title type='text'>Useful Things to Know, #426</title><content type='html'>&lt;p&gt;You can add an extension&amp;#160; method to an enumerated type.&lt;/p&gt;  &lt;p&gt;You can.&amp;#160; The code looks like that of any other extension method:&lt;/p&gt;  &lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 542px; padding-right: 5px; height: 431px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;enum&lt;/span&gt; SalesCallObjective&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        NewCustomer = 1,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        RetainCustomer = 2,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        KeepInTouch = 3&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; SalesCallObjectiveExtensions&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; ProductCategory ToProductCategory(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; SalesCallObjective &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;switch&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; SalesCallObjective.NewCustomer:&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ProductCategory.CompetitiveProduct;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; SalesCallObjective.RetainCustomer:&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ProductCategory.UpgradeProduct;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; SalesCallObjective.KeepInTouch:&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ProductCategory.PromotionalProduct;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;default&lt;/span&gt;:&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ProductCategory.Unknown;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    }&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The above is just an example of what you can do, not a real-life attempt to solve a business problem.&amp;#160; But it does show one potential use:&amp;#160; mapping an enum from one domain (sales call objective) to another.&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-8574070024860811860?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/8574070024860811860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=8574070024860811860' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/8574070024860811860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/8574070024860811860'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/10/useful-things-to-know-426.html' title='Useful Things to Know, #426'/><author><name>Ann</name><uri>http://www.blogger.com/profile/04912097426262293763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_IL8bS3nl5pI/TLhd5_0fcxI/AAAAAAAAAAM/I-ghOxBFlQI/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-2130590772465622939</id><published>2010-10-08T13:01:00.002-04:00</published><updated>2010-10-12T11:17:58.299-04:00</updated><title type='text'>Malfunctioning scrollbars in Panel/ScrollableControl with AutoScroll turned on</title><content type='html'>&lt;p&gt;I have recently been working on a WinForms app that involved a Panel control with dynamically-added child controls.&amp;#160; AutoScroll was turned on.&amp;#160; When you scrolled vertically, the “thumb” changed size and position seemingly at random:&amp;#160; large amounts of white space were added as you scrolled to the bottom, which would then disappear as you scrolled in the other direction.&amp;#160;&amp;#160; Sometimes the scrollbar would disappear entirely.&amp;#160; The “thumb” seemed to jump around, as if the panel were somehow changing size every time we scrolled.&lt;/p&gt;  &lt;p&gt;Googling turned up a lot of complaints and a few workarounds, but none of them worked for us.&amp;#160; (Our dynamic controls were capable of changing size, and most of the workarounds didn’t work with that.&amp;#160; )&lt;/p&gt;  &lt;p&gt;Well, after some investigation with Reflector, I think I’ve figured it out.&amp;#160; There appears to be a bug with ScrollableControl, the base of the Panel control.&amp;#160;&amp;#160; Scrolling vertically causes the DisplayRectangle property’s Height to increase (incorrectly), which in turn causes the Maximum property of the VerticalScroll object to increase.&lt;/p&gt;  &lt;p&gt;What can you do about it?&amp;#160; Well, you can’t change DisplayRectangle, which is read-only, and if you have AutoScroll turned on, attempts to set the VerticalScroll.Maximum property are ignored.&amp;#160; But you can do the following:&lt;/p&gt;  &lt;p&gt;If you’re hosting a Panel in something else, put the following code in your Scroll event handler.&amp;#160; If you’re deriving a control from Panel, you’ll have to adapt it slightly for the OnScroll method&amp;#160; (probably by replacing references to “pnl” with “this”):&lt;/p&gt;  &lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 565px; padding-right: 5px; height: 243px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;System.Windows.Forms.Panel pnl = sender &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; System.Windows.Forms.Panel;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; maxHeight = pnl.Controls.Cast&amp;lt;Control&amp;gt;().Sum(c =&amp;gt; c.Height);&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (pnl.VerticalScroll.Maximum &amp;gt; maxHeight)&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;{&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    MethodInfo mi = &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(ScrollableControl).GetMethod(&amp;quot;&lt;span style="color: #8b0000"&gt;SetDisplayRectangleSize&lt;/span&gt;&amp;quot;, BindingFlags.Instance | BindingFlags.NonPublic, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Type[] { &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(Int32), &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(Int32) }, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);   &lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;    if&lt;/span&gt; (mi != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        mi.Invoke(pnl, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;[] { pnl.DisplayRectangle.Width, maxHeight });&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    mi = &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(ScrollableControl).GetMethod(&amp;quot;&lt;span style="color: #8b0000"&gt;SyncScrollbars&lt;/span&gt;&amp;quot;, BindingFlags.Instance | BindingFlags.NonPublic, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Type[] { &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;) }, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;    if&lt;/span&gt; (mi != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        mi.Invoke(pnl, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;[] { pnl.AutoScroll });&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;}&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;ETA:&amp;#160; Actually, depending on how your child controls are arranged, you might want to calculate maxHeight as Max(c =&amp;gt; c.Bottom) rather than Sum(c =&amp;gt; c.Height).&amp;#160; Ours were arranged in a single column with no intervening space between them, but your situation might be different.&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-2130590772465622939?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/2130590772465622939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=2130590772465622939' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/2130590772465622939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/2130590772465622939'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/10/misbehaving-vertical-scroll-bars-in.html' title='Malfunctioning scrollbars in Panel/ScrollableControl with AutoScroll turned on'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-4473169994893477825</id><published>2010-09-18T12:24:00.003-04:00</published><updated>2010-10-22T14:33:23.964-04:00</updated><title type='text'>Access and OleDb for the SQL Server programmer</title><content type='html'>&lt;p&gt;I have been working on a project that uses MS Access, accessed from C# via OleDb.  The following are some of the things I’ve discovered.  (This list will be updated as time goes on.)&lt;/p&gt;&lt;p&gt;1. Joins need to be encased in nested parentheses, like so:&lt;/p&gt;&lt;pre style="BORDER-BOTTOM: #cecece 1px solid; BORDER-LEFT: #cecece 1px solid; PADDING-BOTTOM: 5px; BACKGROUND-COLOR: #fbfbfb; MIN-HEIGHT: 40px; PADDING-LEFT: 5px; WIDTH: 572px; PADDING-RIGHT: 5px; HEIGHT: 248px; OVERFLOW: auto; BORDER-TOP: #cecece 1px solid; BORDER-RIGHT: #cecece 1px solid; PADDING-TOP: 5px"&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;&lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Select&lt;/a&gt; *&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;&lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=From&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;From&lt;/a&gt;  ((Tbl1 t1&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;  &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=inner&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;inner&lt;/a&gt; &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=join&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;join&lt;/a&gt; Tbl2 t2&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;    &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=on&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;on&lt;/a&gt; t1.Id = t2.Id)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;  &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=left&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;left&lt;/a&gt; &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=outer&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;outer&lt;/a&gt; &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=join&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;join&lt;/a&gt; Tbl3 t3&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;    &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=on&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;on&lt;/a&gt; t1.Id = t3.Id)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Incidentally, if you have fallen into the habit of dropping the “inner” and “outer” from your join statements, break it. Access requires them.&lt;/p&gt;&lt;p&gt;2.  It doesn’t matter what you call your parameters:   OleDb will apply the supplied variables in the order the parameters are used.  So if you have this SQL statement:&lt;/p&gt;&lt;pre style="BORDER-BOTTOM: #cecece 1px solid; BORDER-LEFT: #cecece 1px solid; PADDING-BOTTOM: 5px; BACKGROUND-COLOR: #fbfbfb; MIN-HEIGHT: 40px; PADDING-LEFT: 5px; WIDTH: 571px; PADDING-RIGHT: 5px; HEIGHT: 178px; OVERFLOW: auto; BORDER-TOP: #cecece 1px solid; BORDER-RIGHT: #cecece 1px solid; PADDING-TOP: 5px"&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;&lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Select&lt;/a&gt; *&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;&lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt;   Tbl1&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;&lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=where&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;where&lt;/a&gt; State = @State&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;   &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=and&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;and&lt;/a&gt; (ZipCode = @ZipCode &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=or&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;or&lt;/a&gt; @ZipCode &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=is&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;is&lt;/a&gt; &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Null&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Null&lt;/a&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;… you need to supply the value for @State first, and then @ZipCode, because that’s the order in which they’re used.   (The official way to do parameters in OleDb is with ? rather than a parameter name, but if you use your parameter more than once (like @ZipCode, above), you’d have to provide a value for it, each time.)&lt;/p&gt;&lt;p&gt;3.  BUT.  There is at least one exception to the previous.  If you use the parameters in subqueries in your WHERE clause, those parameters will be supplied with values first, even if another variable is used earlier in the WHERE clause.  So if your query looked like this:&lt;/p&gt;&lt;pre style="BORDER-BOTTOM: #cecece 1px solid; BORDER-LEFT: #cecece 1px solid; PADDING-BOTTOM: 5px; BACKGROUND-COLOR: #fbfbfb; MIN-HEIGHT: 40px; PADDING-LEFT: 5px; WIDTH: 570px; PADDING-RIGHT: 5px; HEIGHT: 262px; OVERFLOW: auto; BORDER-TOP: #cecece 1px solid; BORDER-RIGHT: #cecece 1px solid; PADDING-TOP: 5px"&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;&lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Select&lt;/a&gt; * &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt; Tbl1 t1&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;&lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=where&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;where&lt;/a&gt; State = @State&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;&lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=and&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;and&lt;/a&gt; (&lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;select&lt;/a&gt; *&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;  &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=from&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;from&lt;/a&gt; Tbl2 t2&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;  &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=where&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;where&lt;/a&gt; t1.Id = t2.Id&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;  &lt;a style="COLOR: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=and&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;and&lt;/a&gt; t2.ZipCode = @ZipCode)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;&lt;/pre&gt;&lt;pre style="BACKGROUND-COLOR: #fbfbfb; MARGIN: 0em; WIDTH: 100%; FONT-FAMILY: consolas, 'Courier New', courier, monospace; FONT-SIZE: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;… you would need to provide the value for @ZipCode &lt;i&gt;before&lt;/i&gt; that for @State. &lt;/p&gt;&lt;p&gt;Mercifully, there’s a way to check this and get the necessary order.  Open Access, begin a query, switch to the SQL view, and paste in your SQL.  Then execute it.  The order in which Access prompts you for parameters is the order in which you need to provide the parameters in OleDb.&lt;/p&gt;&lt;p&gt;4.  If you’re calculating columns in your query, the syntax “Result = a + b” won’t work.  It’ll treat Result as a parameter.  You need to use the older syntax “a + b as Result”.  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-4473169994893477825?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/4473169994893477825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=4473169994893477825' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/4473169994893477825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/4473169994893477825'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/09/access-and-oledb-for-sql-server.html' title='Access and OleDb for the SQL Server programmer'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-3208900221191229748</id><published>2010-08-17T17:07:00.001-04:00</published><updated>2010-08-17T17:08:16.570-04:00</updated><title type='text'>A Conversation</title><content type='html'>&lt;blockquote&gt;   &lt;table border="0" cellspacing="0" cellpadding="2" width="545"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="66"&gt;Geek 1: &lt;/td&gt;          &lt;td valign="top" width="477"&gt;Here's an LOL for ya... My co-worker is our VMS guy here, and programs in Perl in VI on the VMS server. I introduced him to Notepad++ today and syntax highlighting, and he almost had a heart attack, and can't stop thanking me... he was so amazed.           &lt;br /&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="66"&gt;Geek 2:&amp;#160; &lt;/td&gt;          &lt;td valign="top" width="477"&gt; His civilization has just been introduced to Fire.&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-3208900221191229748?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/3208900221191229748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=3208900221191229748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/3208900221191229748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/3208900221191229748'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/08/conversation.html' title='A Conversation'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-654909012456093341</id><published>2010-08-05T12:09:00.003-04:00</published><updated>2010-08-05T12:11:53.314-04:00</updated><title type='text'>Welcome back, GOSUB</title><content type='html'>Okay, who here remembers GOSUB?&lt;br /&gt;&lt;br /&gt;Wow, that few?&amp;nbsp; Okay, GOSUB was a feature of BASIC implementations pre VB.Net.&amp;nbsp; It executed a subroutine that was defined &lt;b&gt;within&lt;/b&gt; another routine, sort of like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Dim x as Integer&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;x = 1&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Gosub Sub1&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;x = 0&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Sub1:&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;x = x + 1&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Return&lt;/div&gt;&lt;br /&gt;If the syntax is a bit off, it's because I haven't even seen a GOSUB in many years.&amp;nbsp; (I'm capitalizing it because I originally learned it in Apple II Basic, where all things were capitalized.)&amp;nbsp; VB.Net did away with it on the grounds that it isn't structured, entirely correctly in my opinion.&amp;nbsp; You see, a subroutine in a GOSUB had the same scope as the parent routine, and so had access to all its variables.&lt;br /&gt;&lt;br /&gt;Which brings us back to my previous post, about anonymous methods having access to the variables in the routines in which they are defined, even if they are invoked from outside the method.&amp;nbsp; It occurred to me that this basically replicates the GOSUB.&amp;nbsp; Consider the following:&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt; &lt;!--  @page { margin: 0.79in }  P { margin-bottom: 0.08in } --&gt; &lt;/style&gt; &lt;br /&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: blue; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt; i = 0;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;/span&gt;&lt;span style="color: #2b91af; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;Action&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt; a = () =&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;span style="font-family: Consolas;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;                &lt;span style="font-family: Consolas;"&gt;System.Diagnostics.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2b91af; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;Debug&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;.WriteLine(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;"I am routine 'A'"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;                &lt;span style="font-family: Consolas;"&gt;i++;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;span style="font-family: Consolas;"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;/span&gt;&lt;span style="color: #2b91af; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;Action&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt; b = () =&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;span style="font-family: Consolas;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;                &lt;span style="font-family: Consolas;"&gt;System.Diagnostics.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2b91af; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;Debug&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;.WriteLine(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;"I am routine 'B'"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;                &lt;span style="font-family: Consolas;"&gt;i++;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;span style="font-family: Consolas;"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;/span&gt;&lt;span style="color: green; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;// Regular inline code&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;span style="font-family: Consolas;"&gt;i = 1;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;span style="font-family: Consolas;"&gt;System.Diagnostics.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2b91af; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;Debug&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;.WriteLine(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;"I am inline code"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;span style="font-family: Consolas;"&gt;System.Diagnostics.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2b91af; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;Debug&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;.WriteLine(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;"The value of i is currently {0}"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;,i);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;span style="font-family: Consolas;"&gt;a();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;span style="font-family: Consolas;"&gt;b();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;span style="font-family: Consolas;"&gt;System.Diagnostics.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2b91af; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;Debug&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;.WriteLine(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;"I am inline code again"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;            &lt;span style="font-family: Consolas;"&gt;System.Diagnostics.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2b91af; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;Debug&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;.WriteLine(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;"And the value of i is now {0}"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Consolas;"&gt;,i);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: inherit; margin-bottom: 0in;"&gt;&lt;span style="color: black; font-size: small;"&gt;The only way in which this differs in function from the Basic above is that the Action variables have to have anonymous methods assigned to them before they are invoked, rather than after as was the norm (and perhaps a requirement) in Basic.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: x-small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: x-small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Welcome back, GOSUB.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-654909012456093341?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/654909012456093341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=654909012456093341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/654909012456093341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/654909012456093341'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/08/welcome-back-gosub.html' title='Welcome back, GOSUB'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-7337415683323540949</id><published>2010-07-22T14:02:00.003-04:00</published><updated>2010-07-22T14:06:37.641-04:00</updated><title type='text'>Cognitive Dissonance, or why I don't like this picture</title><content type='html'>This is legal code.&amp;nbsp; The Assert completes successfully:&lt;span class="kwrd"&gt; &lt;/span&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;    static&lt;/span&gt; EventHandler eh;&lt;br /&gt;&lt;span class="kwrd"&gt;    static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;    {&lt;br /&gt;&lt;span class="kwrd"&gt;        int&lt;/span&gt; i = 0;&lt;br /&gt;        eh = (source, e) =&amp;gt; { i = 1; };&lt;br /&gt;        eh.Invoke(&lt;span class="kwrd"&gt;null&lt;/span&gt;, EventArgs.Empty);&lt;br /&gt;        System.Diagnostics.Debug.Assert(i == 1);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;As you can see, it is possible for an event handler defined elsewhere to have an anonymous method assigned to it that modifies an internal variable in the method in which it is defined. (Ignore the fact that the above example has the event handler invoked synchronously and from within the same method that defines the anonymous method.&amp;nbsp; I’ve experimented and this still works even if these things aren’t true.)&lt;br /&gt;&lt;br /&gt;I don’t like this. The whole idea of an internal variable is that it is &lt;i&gt;internal&lt;/i&gt;: nothing outside the method in which it is defined can access it.&lt;br /&gt;&lt;br /&gt;Yes, the anonymous method is defined within the method, but it can be invoked from outside the method.&amp;nbsp; &lt;i&gt;It&lt;/i&gt; isn’t internal.&lt;br /&gt;&lt;br /&gt;I’m sure there is a very sound reason why this was done. I just can’t think of any problem that opening a tunnel to a method’s internal variables solves that couldn’t be solved some other way. &lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-7337415683323540949?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/7337415683323540949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=7337415683323540949' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/7337415683323540949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/7337415683323540949'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/07/cognitive-dissonance-or-why-i-don-like.html' title='Cognitive Dissonance, or why I don&apos;t like this picture'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-5497040409151802234</id><published>2010-07-03T11:56:00.000-04:00</published><updated>2010-07-03T11:56:43.731-04:00</updated><title type='text'>A Thought about Organizational Systems</title><content type='html'>For me, it's more important that a system be easy to put things into than that it be easy to get things out of.  &lt;br /&gt;&lt;br /&gt;I'm willing to rummage through a fat folder of "2009 Medical Bills" to find one particular thing, as long as I'm confident that all medical bills from 2009 really are in that folder and aren't in some pile across the room.  But I also know that if filing 2009 medical bills required making little piles by practitioner and labeling a new folder every time an Explanation of Benefits came in, probably the bills never got filed at all and &lt;b&gt;are&lt;/b&gt; still in some pile across the room.&lt;br /&gt;&lt;br /&gt;Hence:  putting things into a system easily &gt; getting things out of it in a hurry.  Your mileage may vary.  But if you're having trouble getting or staying organized, you might think about which side of the transaction is more important for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-5497040409151802234?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/5497040409151802234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=5497040409151802234' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5497040409151802234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5497040409151802234'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/07/thought-about-organizational-systems.html' title='A Thought about Organizational Systems'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-7298880015254998647</id><published>2010-06-30T10:07:00.000-04:00</published><updated>2010-07-03T13:56:22.631-04:00</updated><title type='text'>SSMS 2008 add-ins: one problem solved</title><content type='html'>If you Google SQL Server Management Studio Add-Ins, you'll find quite a few articles on writing them for SSMS 2005.&amp;#160; You'll also find people complaining that they can't get them to work in 2008.  &lt;br /&gt;  &lt;br /&gt;I can't add any useful comment on the changes made in assemblies between versions, because I didn't attempt writing an SSMS add-in until I'd already upgraded to 2008.&amp;#160; However, I did encounter one problem right away when I attempted to write an SSMS version of a VS 2010 add-in, &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/sqltools/thread/d3507460-6e08-44cc-9ba7-b507f62466fb"&gt;as have others&lt;/a&gt;.&amp;#160; The boilerplate code in the OnConnect method, which was generated by VS, would fail on this line:  &lt;br /&gt;&lt;style&gt;&lt;br /&gt;&lt;!-- /* Font Definitions */ @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;}@font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;}@font-face {font-family:Consolas; panose-1:2 11 6 9 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-1610611985 1073750091 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin-top:0in; margin-right:0in; margin-bottom:10.0pt; margin-left:0in; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;}.MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;}.MsoPapDefault {mso-style-type:export-only; margin-bottom:10.0pt; line-height:115%;}@page WordSection1 {size:8.5in 11.0in; margin:1.0in 1.0in 1.0in 1.0in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;}div.WordSection1 {page:WordSection1;}--&gt;&lt;/style&gt;  &lt;br /&gt;  &lt;div style="line-height: normal; margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; OnConnection(&lt;span style="color: blue"&gt;object&lt;/span&gt; application, &lt;span style="color: #2b91af"&gt;ext_ConnectMode&lt;/span&gt; connectMode, &lt;span style="color: blue"&gt;object&lt;/span&gt; addInInst, &lt;span style="color: blue"&gt;ref&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Array&lt;/span&gt; custom)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div style="line-height: normal; margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div style="line-height: normal; margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt"&gt;&lt;span style="background-color: #ffe599"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _applicationObject = (&lt;/span&gt;&lt;span style="background-color: #ffe599; color: #2b91af"&gt;DTE2&lt;/span&gt;&lt;span style="background-color: #ffe599"&gt;)application;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div style="line-height: normal; margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _addInInstance = (&lt;span style="color: #2b91af"&gt;AddIn&lt;/span&gt;)addInInst;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;  &lt;p&gt;The error message was “No such interface supported”.&lt;/p&gt;  &lt;p&gt;A little poking about, and it became clear that this is because, well, the host application isn't a DTE2 anymore.&amp;#160; It's a SSMS object with a very long name and no obvious connection to the DTE2.&amp;#160; Which is a problem if you need any of the DTE2's properties, as you probably do.&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;But the fix is easy.&amp;#160; The addInInst object has a DTE property that is, in fact, of type DTE2!&amp;#160; So all you have to do to get over this speed bump is to change those two assignment statements:&lt;/p&gt;  &lt;div style="line-height: normal; margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt"&gt;&amp;#160;&amp;#160;&amp;#160; _addInInstance = (&lt;span style="color: #2b91af"&gt;AddIn&lt;/span&gt;) addInInst;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div style="line-height: normal; margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt"&gt;&amp;#160;&amp;#160;&amp;#160; _applicationObject = (&lt;span style="color: #2b91af"&gt;DTE2&lt;/span&gt;) _addInInstance.DTE;&lt;/span&gt;&lt;/div&gt;  &lt;div style="line-height: normal; margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt"&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div style="line-height: normal; margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt"&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div style="line-height: normal; margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;  &lt;br /&gt;And carry on from there.    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-7298880015254998647?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/7298880015254998647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=7298880015254998647' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/7298880015254998647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/7298880015254998647'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/06/ssms-2008-add-ins-one-problem-solved.html' title='SSMS 2008 add-ins: one problem solved'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-1915595540158671955</id><published>2010-06-23T15:13:00.001-04:00</published><updated>2010-06-29T11:46:55.811-04:00</updated><title type='text'>Things I'd Like To See, #765</title><content type='html'>I'd like to be able to put attributes (à la .Net) on Sql Server columns.&amp;nbsp; I'd like to be able to flag certain columns so as to indicate that &lt;i&gt;these&lt;/i&gt; columns with the name UserId that relate to the master User table are for change tracking, as opposed to other columns called UserId that relate to the User table but might be part of security or personnel records.&lt;br /&gt;&lt;br /&gt;Why do I want this?&amp;nbsp; So that I can run queries to ensure that standard columns all have standard definitions.&amp;nbsp; Standards are only standards if they're enforced, after all.&lt;br /&gt;&lt;br /&gt;This came up because I stumbled upon a standard column with some non-standard characteristics today, and had to write a change script.&amp;nbsp; If we had an equivalent to FxCop that we could apply to table definitions and stored procedures, we could keep an eye on these things and catch them before they got to production.&amp;nbsp; Being able to run a metadata query to ensure that all columns with the attribute "TrackingUserId" had a certain definition would be a good start.&lt;br /&gt;&lt;br /&gt;(Before you suggest it, let me say that I know we could probably simulate this with extended properties.&amp;nbsp; If I were staying longer on this project, I might try to implement that.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-1915595540158671955?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/1915595540158671955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=1915595540158671955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/1915595540158671955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/1915595540158671955'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/06/things-id-like-to-see-765.html' title='Things I&apos;d Like To See, #765'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-467642660088665462</id><published>2010-06-22T13:59:00.002-04:00</published><updated>2010-06-25T09:38:01.416-04:00</updated><title type='text'>Useful Things to Know, #425</title><content type='html'>You can call an extension method on a null class instance.&lt;br /&gt;&lt;br /&gt;For example, if you have an extension method IsEmptyOrWhitespace on the class System.String, the following code will work:&lt;br /&gt;&lt;br /&gt;string s = null;&lt;br /&gt;Debug.Writeline(s.IsEmptyOrWhitespace());&lt;br /&gt;&lt;br /&gt;It makes sense because the string s is actually passed as a parameter to the method IsEmptyOrWhitespace.&amp;nbsp; Therefore, if you code the method correctly, it'll accommodate a null value and respond in whatever way makes sense.&lt;br /&gt;&lt;br /&gt;It's interesting because it's a place where the facade of the extension method actually being an instance method of the class breaks down.&amp;nbsp; (But I wouldn't code on the assumption that this will always be true!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-467642660088665462?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/467642660088665462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=467642660088665462' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/467642660088665462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/467642660088665462'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/06/interesting.html' title='Useful Things to Know, #425'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-690623286087600824</id><published>2010-06-17T17:40:00.002-04:00</published><updated>2010-06-18T09:35:03.241-04:00</updated><title type='text'>Why does this fail?</title><content type='html'>This code throws an InvalidCastException, on the grounds that you can't convert a DateTime to anything else but a string.&amp;nbsp; But I didn't think I was converting a DateTime:&amp;nbsp; I thought I was converting a nullable DateTime. &lt;br /&gt;&lt;blockquote&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 12pt;"&gt;DateTime&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 12pt;"&gt;? nDate = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DateTime&lt;/span&gt;? (&lt;span style="color: #2b91af;"&gt;DateTime&lt;/span&gt;.Today);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 12pt;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ChangeType(nDate, &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;DateTime&lt;/span&gt;?));&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;Tomorrow I will research this.&lt;br /&gt;&lt;br /&gt;ETA:&amp;nbsp; The &lt;a href="http://www.dotnetspider.com/resources/25704-Convert-ChangeType-Wrapper-that-Handles-Nullable.aspx"&gt;answer&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-690623286087600824?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/690623286087600824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=690623286087600824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/690623286087600824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/690623286087600824'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/06/why-does-this-fail.html' title='Why does this fail?'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-9014307188636220726</id><published>2010-06-02T12:49:00.006-04:00</published><updated>2010-06-11T12:12:45.997-04:00</updated><title type='text'>Advice to New Programmers, Part I</title><content type='html'>I was talking to someone who was a professor of Management Information Systems at a local university not too long ago.&amp;nbsp; We were talking about his students and how they would do at their first jobs.&lt;br /&gt;&lt;br /&gt;Now, I have quite a bit I can say on the subject of new programmers and mistakes they tend to make, most of which I know from having made them myself and taken the consequences.&amp;nbsp; But I'll spare you that (for now) and just list some books that young programmers ought to read:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Programmers-Survival-Guide-Strategies-Professionals/dp/0137303750/ref=sr_1_4?ie=UTF8&amp;amp;s=books&amp;amp;qid=1275495948&amp;amp;sr=8-4"&gt;The Programmer's Survival Guide, by Janet Ruhl&lt;/a&gt;.&amp;nbsp; This is over 20 years old, and much of what it says about the IT environment is extremely dated.&amp;nbsp; Network management and web page design had barely been conceived when this was written.&amp;nbsp; Nonetheless, the advice on legacy code, legacy people, getting along with your peers, and relating to management is still quite sound. &amp;nbsp; Ms. Ruhl has since written &lt;a href="http://www.amazon.com/Computer-Survival-Guide-Janet-Ruhl/dp/0964711648/ref=sr_1_5?ie=UTF8&amp;amp;s=books&amp;amp;qid=1275495948&amp;amp;sr=8-5"&gt;The Computer Job Survival Guide&lt;/a&gt;, which I have not read, but which supposedly has updated advice.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Games-Mother-Never-Taught-You/dp/0446357030/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1275496281&amp;amp;sr=8-1"&gt;Games Mother Never Taught You, by Betty Lehan Harragan.&lt;/a&gt;&amp;nbsp; This was written, I was surprised to discover, back in 1977.&amp;nbsp; The world has changed (in spots) since then.&amp;nbsp; If you find the idea of office politics uncomfortable, this book can scare you to death: its tone is harsh, and the picture it paints an intimidating one.&amp;nbsp; But you still ought to read it.&amp;nbsp; Not all organizations work like the ones described in this book, and not all those that do are like that on the lower levels, where the programmers are.&amp;nbsp; But I've seen things in my career that only made sense in light of what this book teaches.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.issurvivor.com/"&gt;Keep the Joint Running, a regular column by Bob Lewis of IT Catalysts&lt;/a&gt;.&amp;nbsp; Possibly the most sensible man currently writing about information systems (as opposed to pure programming), Lewis consistently gives good advice to both IT workers and business managers. He's entertaining as well as insightful, and leaves you with the sense that you've both gained something useful and learned to see a little more clearly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-9014307188636220726?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/9014307188636220726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=9014307188636220726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/9014307188636220726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/9014307188636220726'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/06/advice-to-new-programmers-part-i.html' title='Advice to New Programmers, Part I'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-5975921440252660635</id><published>2010-05-09T18:18:00.007-04:00</published><updated>2010-06-28T11:10:01.183-04:00</updated><title type='text'>LINQ challenge - an answer</title><content type='html'>Someone asked for an answer to the LINQ challenge I posted a while back.&amp;nbsp; The following is an answer to the "find all descendants of a given Parent" part of the challenge.&amp;nbsp; It cheats a little, in that it makes use of a variable external to the method (stack), but it prints out the descendants of whatever parent you feed it, so that's good.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;This is not the only way to get an answer to this particular problem, and I certainly don't guarantee it's the best.&lt;br /&gt;&lt;br /&gt;Incidentally, if anybody knows a utility for HTML-formatting code examples in a Blogger-friendly way, I'd like to hear about it.&lt;br /&gt;&lt;br /&gt;Assume a class called ForeignKey that has two fields, both strings, called ParentTable and ChildTable.&amp;nbsp; Assume also a variable &lt;span style="color: black; font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;list&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;defined earlier in the routine, that is declared as &lt;span style="color: #2b91af; font-family: Consolas;"&gt;List&lt;span style="color: black;"&gt;&amp;lt;ForeignKey&amp;gt;&lt;/span&gt;&lt;/span&gt;.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: #2b91af;"&gt;&lt;span style="font-family: Consolas;"&gt;Action&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;gt; f = &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;Stack&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;gt; stack = &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;Stack&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;gt;();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;f = (table, level) =&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack.Push(table);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Where(fk =&amp;gt; fk.ParentTable.Equals(table))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Where(fk =&amp;gt; stack.Contains(fk.ChildTable) == &lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;false&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ToList()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ForEach(fk=&amp;gt; {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af; font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;Console&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;.WriteLine(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;"{0}: {1}"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;, level, fk.ChildTable);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f(fk.ChildTable, level + 1);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black; font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stack.Pop();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;You might be curious about what the &lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;level&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;stack&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; variables are doing here.&amp;nbsp; The &lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;level&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; parameter is so we have some way to indicate how many levels deep we are:&amp;nbsp; otherwise, we'd just be printing table names and not know where in the structure we were.&amp;nbsp; But if you don't care, leave it out. &lt;br /&gt;&lt;br /&gt;The &lt;span style="color: black;"&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="font-size: small;"&gt;stack&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; variable is there to guard against "loops", where a "descendant" of one parent is ultimately itself an ancestor of that parent.&amp;nbsp; If your hierarchy is one that cannot have any loops (say, a family tree) then you don't need to guard against them.&amp;nbsp; But it's a decent idea to do so anyway, in case your data has been corrupted.&amp;nbsp; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-5975921440252660635?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/5975921440252660635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=5975921440252660635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5975921440252660635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5975921440252660635'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/05/linq-challenge-answer.html' title='LINQ challenge - an answer'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-2160842884975460186</id><published>2010-05-06T14:47:00.000-04:00</published><updated>2010-05-06T14:47:21.833-04:00</updated><title type='text'>When you can do without foreign keys</title><content type='html'>I had a boss once who said, after I'd reported that a database design was done except for the foreign keys, "Don't do that -- just a bunch of overhead, and if you code it right you don't need them."&lt;br /&gt;&lt;br /&gt;I didn't say anything, but I remember thinking, "I had a ten year career fixing bad data!&amp;nbsp; A database that can defend itself against corruption is a wonderful thing!"&lt;br /&gt;&lt;br /&gt;Someone else recently said to me that they didn't use to believe in foreign keys for the same reason:&amp;nbsp; if you write your business layer right, you don't need them to protect your database.&amp;nbsp; So the following is my summary of when you can get away with not having foreign keys in your database:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If you are the only programmer on the app;&lt;/li&gt;&lt;li&gt;If you are the only programmer who ever has or ever will work on this app;&lt;/li&gt;&lt;li&gt;If no apps not under your control can make any changes to your database;&lt;/li&gt;&lt;li&gt;If no ad-hoc changes or fixes are ever made to the database; &lt;/li&gt;&lt;li&gt;If you and your tester (who may also be you) are blessed with the following conditions:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Lots of experience;&lt;/li&gt;&lt;li&gt;Plenty of time;&lt;/li&gt;&lt;li&gt;Great thoroughness;&lt;/li&gt;&lt;li&gt;A good memory for detail;&lt;/li&gt;&lt;li&gt;Perfect understanding of both the database and app design and of the business problem&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;... then you can do without foreign keys. &lt;br /&gt;&lt;br /&gt;But -- seriously, I'm asking -- why would you want to?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-2160842884975460186?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/2160842884975460186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=2160842884975460186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/2160842884975460186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/2160842884975460186'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/05/when-you-can-do-without-foreign-keys.html' title='When you can do without foreign keys'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-6734355090610249897</id><published>2010-04-21T11:38:00.000-04:00</published><updated>2010-04-21T11:38:07.560-04:00</updated><title type='text'>Why musicians make good programmers</title><content type='html'>I was chatting to someone the other day and we got talking about the other things we did besides programming.&amp;nbsp; It turns out that both of us were musicians.&amp;nbsp; I got to thinking and realized that I knew at least six technical people who were also musicians -- and pretty good ones, at that. &lt;br /&gt;&lt;br /&gt;It's an old maxim that musicians are likely to make good programmers, but most of the time the reasons why it might be true are left unsaid.&amp;nbsp; I've received the impression that the association is something like music --&amp;gt; rhythm --&amp;gt; counting --&amp;gt; math --&amp;gt; programming. &lt;br /&gt;&lt;br /&gt;Personally, I think the reasons are quite other.&amp;nbsp; As someone who's spent a long time doing both, I think that what programming and instrumental music performance study have in common is a certain set of mental skills.&amp;nbsp; In both cases, you have to take something that's quite abstract (and perhaps only vaguely conceived), flesh out its shape in your mind, take it apart, put it back together, and then translate it into something concrete:&amp;nbsp; property definitions, muscle movements, rises and falls in volume.&amp;nbsp; There's a degree of analytical skill, pattern-matching, and pattern-mapping that's required in both.&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-6734355090610249897?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/6734355090610249897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=6734355090610249897' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/6734355090610249897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/6734355090610249897'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/04/why-musicians-make-good-programmers.html' title='Why musicians make good programmers'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-5087499047204341111</id><published>2010-04-02T14:13:00.000-04:00</published><updated>2010-04-02T14:13:16.295-04:00</updated><title type='text'>Relational Integrity and Candidate Keys</title><content type='html'>On my current project, we're not using natural, semantic keys:&amp;nbsp; we're using Guids for primary keys and enforcing unique constraints on the combination of columns that make up the candidate keys.&amp;nbsp; And this is fine for most purposes, but there's an aspect of relational integrity that gets left out.&lt;br /&gt;&lt;br /&gt;Consider a system that schedules events within multiple buildings for multiple organizations.&amp;nbsp; Some tables might include the following:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;OrganizationalSchedule&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; ScheduleId&amp;nbsp;&amp;nbsp; PRIMARY KEY&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; OrganizationId&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; FiscalYearId&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Speakers&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; SpeakerId PRIMARY KEY&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; OrganizationId &lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; Name&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Event&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; EventId PRIMARY KEY&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; OrganizationalScheduleId&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; SpeakerId &lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; Date&lt;/div&gt;&lt;br /&gt;Assume the obvious foreign key relationships and implied Organization parent table.&lt;br /&gt;&lt;br /&gt;Now, you will want your SpeakerId in the Event table to be of a speaker whose Speaker record has the same Organization Id as the Organizational Schedule record does.&amp;nbsp; But how are you going to relate the records in order to assure this?&amp;nbsp; &lt;br /&gt;&lt;br /&gt;In SQL Server 2008, I don't think you can, not directly, unless you're using natural keys as the actual primary keys.&amp;nbsp; So I'm looking at check constraints that use UDFs and the possibility of triggers.&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-5087499047204341111?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/5087499047204341111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=5087499047204341111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5087499047204341111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5087499047204341111'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/04/relational-integrity-and-candidate-keys.html' title='Relational Integrity and Candidate Keys'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-5994842917697971189</id><published>2010-03-24T13:54:00.000-04:00</published><updated>2010-03-24T13:54:29.993-04:00</updated><title type='text'>Something to think about</title><content type='html'>Let's not have any misunderstandings:&amp;nbsp; I think &lt;a href="http://explainextended.com/2009/05/28/generating-xml-in-subqueries/"&gt;this&lt;/a&gt; is quite ingenious.&amp;nbsp; It taught me about something that I didn't know could be done.&amp;nbsp; I intend to study it and learn how it works.&lt;br /&gt;&lt;br /&gt;However, I also think it's the least maintainable solution to a simple SQL problem that I have ever seen.&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-5994842917697971189?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/5994842917697971189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=5994842917697971189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5994842917697971189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5994842917697971189'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/03/something-to-think-about.html' title='Something to think about'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-5004510971693663741</id><published>2010-03-15T09:55:00.001-04:00</published><updated>2010-03-15T09:55:48.705-04:00</updated><title type='text'>First Monday of Daylight Savings Time, 2010</title><content type='html'>My colleague Lydia calls today, "National Be-An-Hour-Late-To-Work Day".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-5004510971693663741?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/5004510971693663741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=5004510971693663741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5004510971693663741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5004510971693663741'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/03/first-work-day-of-daylight-savings-time.html' title='First Monday of Daylight Savings Time, 2010'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-2377818338723634138</id><published>2010-03-10T17:30:00.000-05:00</published><updated>2010-03-10T17:30:48.001-05:00</updated><title type='text'>A challenge for you LINQ experts</title><content type='html'>Imagine a simple, recursive parent-child relationship, modeled in data.&amp;nbsp; The class definition would be:&lt;br /&gt;&lt;br /&gt;class Relationship&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; public int ChildId { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; public int ParentId { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;You have a collection of these things.&amp;nbsp; Let's define it as an IEnumerable&lt;relationship&gt; and call it &lt;i&gt;c.&lt;/i&gt; &lt;/relationship&gt;&lt;br /&gt;&lt;br /&gt;The challenge:&lt;br /&gt;1.&amp;nbsp; Can you, with one LINQ query, find all the elements that are descendents of a given parent?&lt;br /&gt;2.&amp;nbsp; (Bonus points) Can you, with one LINQ query, find all "loops" in the collection, where an element is ultimately descended from itself?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-2377818338723634138?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/2377818338723634138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=2377818338723634138' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/2377818338723634138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/2377818338723634138'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/03/challenge-for-you-linq-experts.html' title='A challenge for you LINQ experts'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-2300086829601252575</id><published>2010-03-03T12:16:00.002-05:00</published><updated>2010-06-23T14:03:56.886-04:00</updated><title type='text'>How could this be done -- efficiently -- in .Net?</title><content type='html'>As you can tell if you check out the links on the right, I had a previous career as an IBM AS/400 specialist.&amp;nbsp; Now, I have a whole rant on the subject of What I Miss About The Bad Old Days, that goes into things the AS/400 did right, but this post is about one thing in particular:&amp;nbsp; level checks.&lt;br /&gt;&lt;br /&gt;A program written on the AS/400, when compiled, contained information about the database tables it had been compiled against.&amp;nbsp; Specifically, for each table or view (we called them different things, but that's what they were), it contained a guid-like string that represented the structure and some of the attributes of the table / view as it had been at compile time.&amp;nbsp; If you attempted to run the program against a different table, or the same table after structure changes, the level ids wouldn't match, and the program wouldn't run.&amp;nbsp; This was called a level check.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;I'd like to be able to do something similar with a .Net application and the database it was written for.&amp;nbsp; Specifically, I'd like for an application to be able to tell that the stored procedure it's about to call isn't the same procedure that it was compiled for.&amp;nbsp; Oh, the specifics of the change may or may not matter:&amp;nbsp; what I want is to have some flag raised that says:&amp;nbsp; something has changed since we finalized this release.&lt;br /&gt;&lt;br /&gt;This would be handy in sorting out problems with installation packages and incorrect deployments.&amp;nbsp; I'll readily admit that if you had to contend with this during development, it would drive you crazy.&amp;nbsp;&amp;nbsp; But once you think you have everything finalized, if you could turn on this integrity check, it would be very handy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-2300086829601252575?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/2300086829601252575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=2300086829601252575' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/2300086829601252575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/2300086829601252575'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/03/how-could-this-be-done-efficiently-in.html' title='How could this be done -- efficiently -- in .Net?'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-7264795327505685156</id><published>2010-02-23T12:59:00.000-05:00</published><updated>2010-02-23T12:59:29.261-05:00</updated><title type='text'>What's the dividing line ...</title><content type='html'>... between a referential integrity issue and a business logic issue?&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Assume tables &lt;i&gt;A &lt;/i&gt;and &lt;i&gt;B&lt;/i&gt; with fields &lt;i&gt;A.&lt;/i&gt;RefId and &lt;i&gt;B.&lt;/i&gt;RecordId.&amp;nbsp; There's a foreign key relationship from &lt;i&gt;A&lt;/i&gt;.RefId --&amp;gt; &lt;i&gt;B&lt;/i&gt;.RecordId.&lt;br /&gt;&lt;br /&gt;Let's say the values of &lt;i&gt;A&lt;/i&gt;.RefId need to be further restricted:&amp;nbsp; only values of &lt;i&gt;B&lt;/i&gt;.RecordId where &lt;i&gt;B&lt;/i&gt;.TypeId = 3 can be used.&lt;br /&gt;&lt;br /&gt;Is this a business logic issue, or a referential integrity issue?&lt;br /&gt;&lt;br /&gt;If it's business logic, does it have any place in the database?&lt;br /&gt;&lt;br /&gt;I'd be curious to hear what people think.&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-7264795327505685156?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/7264795327505685156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=7264795327505685156' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/7264795327505685156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/7264795327505685156'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/02/whats-dividing-line.html' title='What&apos;s the dividing line ...'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-992719686840680613</id><published>2010-02-22T14:12:00.001-05:00</published><updated>2010-02-22T17:47:57.448-05:00</updated><title type='text'>Why can't I ...</title><content type='html'>... set up a foreign key relationship in SQL Server 2008 where the parent is a view with a unique index set up over it?&lt;br /&gt;&lt;br /&gt;Unless I'm much mistaken, you can't do this.&lt;br /&gt;&lt;br /&gt;You can achieve the same result with triggers, but:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A lot of people hate triggers;&lt;/li&gt;&lt;li&gt;You have to code the things, which introduces possible errors, depending on how sharp the coder is and how well he or she knows trigger behavior.&amp;nbsp; Foreign key relationships are hard to get wrong.&lt;/li&gt;&lt;li&gt;ETA:&amp;nbsp; You also have to set up triggers on both sides of the relationship, if you want to constrain both tables. &amp;nbsp; With a foreign key, the mutual constraining is automatic.&amp;nbsp; &lt;/li&gt;&lt;/ol&gt;Why do I want to do this?&amp;nbsp; Well, I have a table where a certain field can be any value from the Id column of Table 2, provided [Table 2].TypeId = 3.&amp;nbsp; I'd love it if the database would enforce this.&amp;nbsp; But unless I can persuade folks that a trigger is an acceptable choice in this situation, it'll have to be done in code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-992719686840680613?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/992719686840680613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=992719686840680613' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/992719686840680613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/992719686840680613'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/02/why-cant-i.html' title='Why can&apos;t I ...'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-9186561315709077287</id><published>2010-02-18T14:35:00.000-05:00</published><updated>2010-02-18T14:35:06.977-05:00</updated><title type='text'>Useful Things to Know, #424</title><content type='html'>This is an oldie I've been meaning to post for years.&lt;br /&gt;&lt;br /&gt;Assume a variable &lt;em&gt;n&lt;/em&gt;&amp;nbsp; of an enumerated type &lt;em&gt;t.&amp;nbsp;&lt;/em&gt; Let's say &lt;em&gt;t&lt;/em&gt; has the traditional&amp;nbsp;values Red, Blue, and Green.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;em&gt;n&lt;/em&gt;.ToString("g") produces a string equal to the name of the&amp;nbsp;enumeration value:&amp;nbsp; Green.&lt;br /&gt;&lt;em&gt;n&lt;/em&gt;.ToString("d") produces a string equal to the underlying value of the enumeration:&amp;nbsp; 2.&lt;br /&gt;&lt;br /&gt;Plain &lt;em&gt;n&lt;/em&gt;.ToString() acts like &lt;em&gt;n.&lt;/em&gt;ToString("g")&lt;br /&gt;&lt;br /&gt;Why is this useful to remember?&amp;nbsp; Because if you ever have to build a filter string in the form "ColorId = &lt;em&gt;value&lt;/em&gt;", and your value is an instance of an enumeration, you can build the string like so:&amp;nbsp; &lt;br /&gt;&lt;br /&gt;string filter = String.Format("ColorId = {0:d}", &lt;em&gt;n&lt;/em&gt;);&lt;br /&gt;&lt;br /&gt;I've seen people handle this a number of ways, including casting back to Int32&amp;nbsp;and so forth, but this is definitely the shortest, tidiest way.&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-9186561315709077287?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/9186561315709077287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=9186561315709077287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/9186561315709077287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/9186561315709077287'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/02/useful-things-to-know-424.html' title='Useful Things to Know, #424'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-5808521930292599928</id><published>2010-02-12T19:13:00.000-05:00</published><updated>2010-02-12T19:13:38.782-05:00</updated><title type='text'>Graceful Failure</title><content type='html'>I've been thinking lately about the semantics of graceful failure.&lt;br /&gt;&lt;br /&gt;If your software is customer-facing, you don't want an internal error to cause it to spew internal details at the consternated user.&amp;nbsp; That is, among other things, a security flaw.&amp;nbsp; But, at the extreme other end, you don't want it to be pretend that everything is hunky-dory when it isn't.&amp;nbsp; It shouldn't say that a transaction completed when it didn't, and it shouldn't pretend that no results were found when it couldn't successfully complete the call to retrieve them.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;If you are designing a web service, and the service does not convey error messages to the user, what should it convey when it is unable (due to internal error) to complete its business?&amp;nbsp; I would have voted for null, but for Get-type actions, null is sometimes used to mean, "Nothing found" which is not the same thing.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Perhaps having the web service throw an error for the user to handle *is* the best solution.&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-5808521930292599928?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/5808521930292599928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=5808521930292599928' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5808521930292599928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5808521930292599928'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/02/graceful-failure.html' title='Graceful Failure'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-7097055179038500275</id><published>2010-02-07T19:23:00.000-05:00</published><updated>2010-02-07T19:23:27.424-05:00</updated><title type='text'>Serializing a Null</title><content type='html'>What do you suppose happens when you pass a null reference to XmlSerializer.Serialize as the object to be serialized?&lt;br /&gt;&lt;br /&gt;You'd probably think an error, or perhaps that nothing would be written to the stream to which the object is to be serialized.  Instead, you get something like this, depending on what the type is that you initialized the serializer with (I used a List&amp;lt;string&amp;gt;):&lt;br /&gt;&lt;br /&gt;&amp;lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:nil="true" /&amp;gt;&lt;br /&gt;&lt;br /&gt;In other words, you get an empty fragment, an element with xsi:nil="true", an empty (in this case) list.&lt;br /&gt;&lt;br /&gt;Passing a non-null but empty List&amp;lt;string&amp;gt; gave me this fragment:&lt;br /&gt;&lt;br /&gt;&amp;lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /&amp;gt;&lt;br /&gt;&lt;br /&gt;So that xsi:nil is very important:  it's the difference between an object with no elements and an object that is itself null. &lt;br /&gt;&lt;br /&gt;I would not have guessed you could serialize a null, but you can.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-7097055179038500275?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/7097055179038500275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=7097055179038500275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/7097055179038500275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/7097055179038500275'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2010/02/serializing-null.html' title='Serializing a Null'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-1692928465503042462</id><published>2009-09-13T12:34:00.002-04:00</published><updated>2009-09-13T12:36:58.654-04:00</updated><title type='text'>Useful Things to Know, #423</title><content type='html'>You can't use extension methods to provide a better .Equals method.  Even if your Equals method takes an instance of the actual class as a parameter rather than System.Object, the innate method of the class will be used before yours.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-1692928465503042462?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/1692928465503042462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=1692928465503042462' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/1692928465503042462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/1692928465503042462'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2009/09/useful-things-to-know-423.html' title='Useful Things to Know, #423'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-8284495468163532745</id><published>2008-01-28T13:18:00.000-05:00</published><updated>2010-10-08T13:34:38.474-04:00</updated><title type='text'>Create DDL from an XSD file, Part II</title><content type='html'>&lt;p&gt;As requested, here is the stylesheet for creating a series of SQL DDL statements from a DataSet schema file. The results may require some tweaking, depending on the structure of your schema. If you have a &amp;quot;collection&amp;quot;-type element that has no other purpose but to enclose multiple instances of a sub-element, you may wind up with a superfluous table. That was something I couldn't work around without procedural code. &lt;/p&gt;  &lt;p&gt;Good luck with it, and let me know how it works out. &lt;/p&gt;  &lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 578px; padding-right: 5px; height: 774px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;stylesheet&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;xsl&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;               &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;               &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;xs&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;               &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;msdata&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;output&lt;/span&gt; &lt;span style="color: #ff0000"&gt;method&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;omit&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;xml&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;declaration&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;yes&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt; &lt;span style="color: #ff0000"&gt;match&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;-- ---------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;-- DDL generated from a .Net DataSet XSD via XSLT &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;-- Stylesheet by Ann Lewkowicz, 2007&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;-- ---------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;apply&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;templates&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #008000"&gt;&amp;lt;!-- Get schema nodes from this schema and any included schemas --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;variable&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;contents&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;/|document(//xs:include/@schemaLocation)&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;variable&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;complexTypes&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$contents//xs:complexType[@name]&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #008000"&gt;&amp;lt;!-- Match data table elements --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt; &lt;span style="color: #ff0000"&gt;match&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;for&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;each&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$contents&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;apply&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;templates&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;.//xs:element&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;for&lt;/span&gt;-each&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #008000"&gt;&amp;lt;!--xsl:template match=&amp;quot;xs:element[xs:complexType]&amp;quot;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt; &lt;span style="color: #ff0000"&gt;match&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;xs:element&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!-- Get the complex type that defines it, if any --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;variable&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;complexType&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;xs:complexType[not(@name)]|$complexTypes[@name=current()/@type]&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$complexType&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #008000"&gt;&amp;lt;!-- Only create a table if the table has at least one simple type'd&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    element or attribute.&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;variable&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;fields&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;       &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$complexType/xs:sequence/xs:element[not(@type=$complexTypes/@name)]|$complexType/xs:attribute|$complexType/xs:simpleContent|$complexType/xs:simpleContent/xs:extension/xs:attribute&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$fields&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #008000"&gt;&amp;lt;!-- table name --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;variable&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;tableName&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@name&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #008000"&gt;&amp;lt;!-- Generated primary key name.  We may not use this, depending on&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;     whether a primary key is declared in the xsd.  --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;variable&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;generatedKey&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;concat($tableName, '_id')&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #008000"&gt;&amp;lt;!-- Create statement --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;CREATE TABLE dbo.[&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$tableName&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;] &amp;amp;#10;( &amp;amp;#10;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #008000"&gt;&amp;lt;!-- Get primary key declaration, if any, and use that to determine&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;     whether to create an Id field --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;variable&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;primaryKey&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;         &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;//xs:key[@msdata:PrimaryKey='true'][xs:selector[@xpath=concat('.//mstns:',$tableName)]]&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #008000"&gt;&amp;lt;!-- Insert ID field --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;not($primaryKey)&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#9;[&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$generatedKey&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;] int Identity(1,1),&amp;amp;#10;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #008000"&gt;&amp;lt;!-- If table is a nested table, insert parent table Id field --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #008000"&gt;&amp;lt;!--   '&amp;lt;xsl:value-of select=&amp;quot;$contents//xs:element[@type=current()/ancestor::*/@name]/@name&amp;quot; /&amp;gt;'--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;variable&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;ancestorTables&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;         &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;ancestor::xs:element[@name][not(@msdata:IsDataSet)][xs:complexType[xs:sequence[xs:element[@type]] or xs:attribute[@type] or xs:simpleContent]]|$contents//xs:element[@type=current()/ancestor::*/@name]&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$ancestorTables&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;variable&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;foreignKey&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;concat( $ancestorTables[1]/@name, '_id' )&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #008000"&gt;&amp;lt;!-- Build foreign key field name --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#9;[&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$foreignKey&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;] int&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #008000"&gt;&amp;lt;!-- Keywords and key name --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; CONSTRAINT FK_&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$tableName&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;_&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$ancestorTables[1]/@name&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #008000"&gt;&amp;lt;!-- Build reference to parent table --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; FOREIGN KEY REFERENCES dbo.[&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$ancestorTables[1]/@name&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;]&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #008000"&gt;&amp;lt;!-- Name of key field of parent --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; ( [&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$foreignKey&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;] ),&amp;amp;#10;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #008000"&gt;&amp;lt;!-- Iterate through fields --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;for&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;each&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$fields[not(@type=$complexTypes/@name)]&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #008000"&gt;&amp;lt;!-- white space --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#9;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #008000"&gt;&amp;lt;!-- Field name --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;[&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;choose&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@msdata:ColumnName&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@msdata:ColumnName&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@name&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@name&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;local-name()='simpleContent'&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;concat(parent::*/@name,'_Text')&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;choose&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #008000"&gt;&amp;lt;!-- Type --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;choose&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@type&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;call&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;template&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Types&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;with&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;param&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;type&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@type&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;call&lt;/span&gt;-template&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;otherwise&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;call&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;template&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Types&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;with&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;param&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;type&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;xs:extension/@base&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;call&lt;/span&gt;-template&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;otherwise&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;choose&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #008000"&gt;&amp;lt;!-- Handle identity columns --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@msdata:AutoIncrement='true'&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; IDENTITY(&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;choose&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #008000"&gt;&amp;lt;!-- If a seed was specified --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@msdata:AutoIncrementSeed&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@msdata:AutoIncrementSeed&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;otherwise&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;otherwise&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;choose&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;,&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;choose&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #008000"&gt;&amp;lt;!-- If a step is specified --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@msdata:AutoIncrementStep&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@msdata:AutoIncrementStep&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;otherwise&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;otherwise&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;choose&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;)&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #008000"&gt;&amp;lt;!-- Optional elements become nullable columns --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@minOccurs=0&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; NULL&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #008000"&gt;&amp;lt;!-- separator --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;position()&amp;amp;lt;last()&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;,&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#10;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;for&lt;/span&gt;-each&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #008000"&gt;&amp;lt;!-- Primary key.  We determine the primary key by selecting an xs:key&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;     element that has the msdata:PrimaryKey attribute flag, that has a &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      child xs:selector element that references our table name.  --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;choose&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$primaryKey&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;&amp;lt;!-- White space and keywords --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#10;&amp;amp;#9;PRIMARY KEY ( &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;&amp;lt;!-- Go through all the fields --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;for&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;each&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$primaryKey/xs:field&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;[&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;substring-after(@xpath, 'mstns:')&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;]&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;position()&amp;amp;lt;last()&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;for&lt;/span&gt;-each&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;&amp;lt;!-- Closing parenthesis --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; )&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;otherwise&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #008000"&gt;&amp;lt;!-- White space and keywords --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#10;&amp;amp;#9;PRIMARY KEY ( [&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$generatedKey&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;] )&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;otherwise&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;choose&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #008000"&gt;&amp;lt;!-- closing parenthesis and white space --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#10;)&amp;amp;#10;&amp;amp;#10;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;apply&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;templates&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #008000"&gt;&amp;lt;!-- Process the value of the &amp;quot;type&amp;quot; attribute of an element.  --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Types&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;param&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;type&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;choose&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #008000"&gt;&amp;lt;!-- Process ordinary simple types --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;substring-after($type,':')='int'&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;int&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;substring-after($type, ':')='string'&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        varchar&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;local-name()!='restriction'&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;(255)&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$type='money_type'&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;money&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;substring-after($type,':')='nonNegativeInteger'&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;int&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;substring-after($type,':')='date'&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;datetime&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;substring-after($type,':')='boolean'&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;bit&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;substring-after($type,':')='decimal'&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;decimal(19,9)&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;substring-after($type,':')='gYearMonth'&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;datetime&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;when&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #008000"&gt;&amp;lt;!-- If a type is not one of the simple types above, look for a &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    defined simple type and reference its base.  This is recursive,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    so a defined simple type that restricts another defined simple&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    type will eventually reach an xsl: data type --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;otherwise&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;apply&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;templates&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$contents//xs:simpleType[@name=$type]&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;mode&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;derivedType&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;otherwise&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;choose&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #008000"&gt;&amp;lt;!-- Handles restriction element of xs:simpleType declaration --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt; &lt;span style="color: #ff0000"&gt;match&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;xs:restriction&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;mode&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;derivedType&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;call&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;template&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Types&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;with&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;param&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@base&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;with&lt;/span&gt;-param&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;call&lt;/span&gt;-template&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;apply&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;templates&lt;/span&gt; &lt;span style="color: #ff0000"&gt;mode&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;derivedType&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #008000"&gt;&amp;lt;!-- Handles max length constraint (for strings) of xs:simpleType declaration --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt; &lt;span style="color: #ff0000"&gt;match&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;xs:maxLength&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;mode&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;derivedType&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    (&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@value&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #008000"&gt;&amp;lt;!-- Create foreign keys.&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  For this, we're processing xs:keyref elements.  We determine the &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  child table name from the selector child of the keyref, and the&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  parent table name from the key specified in the xs:keyref as the&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  key of the parent table.  &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;ForeignKey&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;match&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;xs:keyref[@refer]&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!-- variables --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;variable&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;parentKeyName&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;@refer&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;variable&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;childTable&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;substring-after(xs:selector[1]/@xpath, './/mstns:')&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;variable&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;parentTable&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;substring-after(//xs:key[@name=$parentKeyName][1]/xs:selector[1]/@xpath, './/mstns:')&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!-- Opening keywords --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;ALTER TABLE dbo.&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!-- Child table being changed --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$childTable&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!-- Whitespace and constraint keywords --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#10;&amp;amp;#9;ADD CONSTRAINT &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!-- Make constraint name --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;[FK_&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$childTable&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;_&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$parentTable&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!-- Foreign key keyword and parenthesis --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;FOREIGN KEY &amp;amp;#10;&amp;amp;#9;( &amp;amp;#10;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!-- Fields in foreign key --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;for&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;each&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;xs:field&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#9;&amp;amp;#9;[&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;substring-after(@xpath, 'mstns:')&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;]&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;position()&amp;amp;lt;last()&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;,&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#10;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;for&lt;/span&gt;-each&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!-- Closing parenthesis and REFERENCES keyword --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#9;) &amp;amp;#10;&amp;amp;#9;REFERENCES &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!-- Referenced table name --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;dbo.&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$parentTable&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#10;&amp;amp;#9;( &amp;amp;#10;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!-- Referenced fields --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;for&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;each&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;//xs:key[@name=$parentKeyName][1]/xs:field&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#9;&amp;amp;#9;[&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;value&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;of&lt;/span&gt; &lt;span style="color: #ff0000"&gt;select&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;substring-after(@xpath, 'mstns:')&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;]&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt; &lt;span style="color: #ff0000"&gt;test&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;position()&amp;amp;lt;last()&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;,&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;if&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#10;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;for&lt;/span&gt;-each&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #008000"&gt;&amp;lt;!-- Closing parenthesis and white space--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#9;) &amp;amp;#10;&amp;amp;#10;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;template&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;xsl&lt;/span&gt;:&lt;span style="color: #800000"&gt;stylesheet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-8284495468163532745?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/8284495468163532745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=8284495468163532745' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/8284495468163532745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/8284495468163532745'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2008/01/create-ddl-from-xsd-file-part-ii.html' title='Create DDL from an XSD file, Part II'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-2125218165004385257</id><published>2007-03-17T15:02:00.001-04:00</published><updated>2009-10-04T09:25:42.253-04:00</updated><title type='text'>Create DDL from a DataSet XSD file</title><content type='html'>Recently I started dealing with a web service that came with a series of XSDs.  We intend to store the data coming back from the web service, more or less in the form in which it arrived.   That meant creating a series of database tables that would look very similar to the XSD.  The XSD was long and complicated.  I really, really didn't want to have to hand-create SQL tables from it.   Surely, I thought, surely somebody has written something to create DDL from an XSD.&lt;br /&gt;&lt;br /&gt;Well, yes, they have, but they want money for it, so I did it myself.  I wrote an XSLT stylesheet that transforms a DataSet XSD into a series of DDL statements.  I based it on a DataSet because the additional msdata: attributes incorporated in the DataSet and the DataSet designer let you specify auto-numbering for columns, designate one key as the primary key, and so on.  Plus, the DataSet designer makes it easy to specify foreign keys and relationships.   Turning the XSD into a DataSet just required some cutting and pasting, wrapping complex types with xs:element tags to create table definitions, and adding key fields.  The DataSet designer was very nice about converting from one alias for the XSD namespace to another during a paste between documents. &lt;br /&gt;&lt;br /&gt;I'm proud of it.  It creates tables, declares primary keys, handles identity columns, and creates foreign key relationships.  It supports derived simple types, drilling down to their base types and handling maxLength restrictions.  Additional things that could be done with it (that I didn't need) include turning non-primary key key definitions into unique indexes, creating check constraints from some of the other restrictions put on derived types, and turning enumerations into lookup tables and usages of enumerations into references to the lookup tables. &lt;br /&gt;&lt;br /&gt;This is the kind of thing that you don't need until you need it and is very helpful then.   If people are interested in seeing some of it, let me know.&lt;br /&gt;&lt;br /&gt;ETA:  The XSLT is &lt;a href="http://annlewkowicz.blogspot.com/2008/01/create-ddl-from-xsd-file-part-ii.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-2125218165004385257?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/2125218165004385257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=2125218165004385257' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/2125218165004385257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/2125218165004385257'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2007/03/create-ddl-from-dataset-xsd-file.html' title='Create DDL from a DataSet XSD file'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-5505198062084568399</id><published>2007-01-04T15:34:00.000-05:00</published><updated>2007-01-04T16:24:46.126-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webcontrols'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='tables'/><title type='text'>Merging Side-by-Side Tables</title><content type='html'>One thing I have always been frustrated with in ASP.Net is that you can't use templated bound controls to produce side-by-side lists within a table. The problem comes from the fact that for each row you need to render the cells from list A, then the cells from list B, and so on.  If you want, for example, email addresses to be listed vertically on the left and phone numbers listed on the right, within a single table, you have three options:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Display each list in a single cell on a single row, perhaps using one of the list tags. No alternate row styling is available, and you're out of luck if your list needs to be displayed in more than one column.&lt;/li&gt;&lt;li&gt;Use templated databound controls to embed subtables within single cells on a single row. If you're fastidious, tweak the margins of the subtable cells to keep the contents properly left-aligned. Live with the fact that unexpected content wrapping would destroy the illusion of synchronized lists and that any alternate row styling will be discontinuous with the parent table.&lt;/li&gt;&lt;li&gt;Manually build the cells and rows from the two data sources and add them to the outer table. Track alternate rows and set styles yourself. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Option 3 gives you the look you want plus better HTML, but it's a pain in the neck to do. So one thing I have always wanted to have is a way to merge tables horizontally. Bind your two lists to two separate templated bound controls, and then combine them, matching rows and combining cell collections. To do it, you'd probably have to render each databound control to a string and then merge the generated HTML, which wouldn't be as hard as it sounds if you remember that valid HTML is supposed to be a variant of XML. &lt;/p&gt;&lt;p&gt;Since I am currently somewhat idle I may spend time putting this together. Let me know if you want me to post the results.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-5505198062084568399?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/5505198062084568399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=5505198062084568399' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5505198062084568399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/5505198062084568399'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2007/01/merging-tables-horizontally.html' title='Merging Side-by-Side Tables'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-116380910511588979</id><published>2006-11-17T19:13:00.000-05:00</published><updated>2006-11-17T19:18:25.126-05:00</updated><title type='text'>AppSettings and Visual Studio Test System</title><content type='html'>I started using Visual Studio Test System today, and quickly ran into a problem with my application's app.config not being available to my test project.  But a few keystrokes brought me to Todd Girvin's &lt;a href="http://integralpath.blogs.com/thinkingoutloud/2005/09/appsettings_and.html"&gt;AppSettings and Visual Studio Test System&lt;/a&gt;.  Exactly what I needed to know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-116380910511588979?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/116380910511588979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=116380910511588979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/116380910511588979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/116380910511588979'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2006/11/appsettings-and-visual-studio-test.html' title='AppSettings and Visual Studio Test System'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-116242161330196977</id><published>2006-11-01T17:17:00.000-05:00</published><updated>2006-11-01T18:11:10.216-05:00</updated><title type='text'>Custom Properties on Typed Datasets</title><content type='html'>In .Net 2.0 it's possible to define custom properties for a typed Dataset and retain them when the code is regenerated, thanks to the wonders of partial classes.  I was writing a UI prototype recently for a Windows application, and used typed Datasets and TableAdapters to speed up development. &lt;br /&gt;&lt;br /&gt;It's always been possible to define an expression for a calculated column in a DataTable, using a syntax that I think is supposed to remind us of SQL.  But you're limited in what you can put in there, restricted to a few defined functions.  To pick one example, there is, as far as I can tell, no way to specify that the current date be used as one of the expression's operands. &lt;br /&gt;&lt;br /&gt;This led me to writing a custom property for my typed DataRow, one that used some business rules about effective dates and anniversary dates to calculate a duration.  In Object Explorer, this property looked like all the others.  Could I use it in Windows databinding?&lt;br /&gt;&lt;br /&gt;The answer appears to be "No", although I haven't found anything written about it one way or the other.   But it won't appear in the Property window's field picker, and specifying it leads to an runtime error.  I don't know the reason for sure, but I suspect it's because the object you're connecting your controls to when you bind to a DataTable is really a DataView.  A custom property on the typed DataRow wouldn't be accessible through a DataRowView. &lt;br /&gt;&lt;br /&gt;And this is a pity.  When you're writing a little three-day minimum-investment project like my prototype, you want an easy, clean solution, one where you do the hard stuff once if at all and don't lock yourself into any particular architecture.  A typed DataRow that could expose bindable custom properties would be a good stand-in for the custom business objects that it's too early in the project to create.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-116242161330196977?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/116242161330196977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=116242161330196977' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/116242161330196977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/116242161330196977'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2006/11/custom-properties-on-typed-datasets.html' title='Custom Properties on Typed Datasets'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-116172491303795670</id><published>2006-10-24T16:57:00.000-04:00</published><updated>2006-10-25T18:16:54.116-04:00</updated><title type='text'>Active Directory and User Roles</title><content type='html'>The WinForms app I'm working on has two modes: edit and read-only. It's all or nothing: either you can edit everything or you can edit nothing. If you're not allowed even read-only access you can't run the app.&lt;br /&gt;&lt;br /&gt;So I am faced with the challenge, familiar to many of you, of providing read-only vs. edit access in a nice, clean way. There's an article by Irena Kennedy called &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwinforms/html/Attbasauth.asp"&gt;Granular Role Based Security Without a Line of Code: Attribute-Based Authorization&lt;/a&gt; that I really like. It uses attributes to indicate default values to be set for object properties based on their authorization to specific actions in Authorization Manager. I like this idea. I could put something in a post-InitializeComponent method in my form base class that ran through the controls declared in its descendant and set default properties based on the role membership of the user.&lt;br /&gt;&lt;br /&gt;But I'm using AD and WinForms. So how do we shoehorn AD groups into the Identity, Principal, and Role model? The user's groups seem obvious choices for roles, but the WindowsIdentity object already has its own collection of groups. I thought about loading the AD groups of each user into the Roles collection of a GenericPrincipal, but it seems counter-intuitive to replace an authenticated WindowsPrincipal with an unauthenticated GenericPrincipal.&lt;br /&gt;&lt;br /&gt;So I was thinking about turning around and heading in the opposite direction. Maybe I should create Attributes that didn't pretend to be other than AD-specific: IsInGroupAttribute(string groupName, string propertyName, object defaultValue) and maybe NotInGroupAttribute(string groupName, string propertyName, object defaultValue). When processed by the initialization routine we would just do an AD lookup (cached, of course) and check group membership.&lt;br /&gt;&lt;br /&gt;Go on, tell me why this is a bad idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-116172491303795670?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/116172491303795670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=116172491303795670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/116172491303795670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/116172491303795670'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2006/10/active-directory-and-user-roles.html' title='Active Directory and User Roles'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-116008310826965104</id><published>2006-10-05T16:58:00.000-04:00</published><updated>2006-10-05T17:45:18.733-04:00</updated><title type='text'>To Refactor or not to Refactor</title><content type='html'>I created a WinForms combo box that restricts what options you can choose.  This is for the situation where only a few of the options are valid choices at this point in your process, but the data you are binding to includes other values that must appear in the combo box to avoid binding errors.   For example, it might be possible to manually change the status of any order only to Canceled or Hold, but the application allows the users to query and view orders of any status. &lt;br /&gt;&lt;br /&gt;(ETA:  we're assuming in-place editing, here.  The problem goes away if you have separate read-only "Status" and write-only "New Status" controls.  I'm not sure if you can do that with databinding alone.)&lt;br /&gt;&lt;br /&gt;I created a stand-alone combo box version of this -- the RestrictedComboBox -- and also a DataGridView version.  After a day or so of work it became obvious that rather than building column, cell, and editing control classes on top of the RestrictedComboBox, it made more sense to subclass the ComboBox versions of these classes.&lt;br /&gt;&lt;br /&gt;This means that the RestrictedComboBox and DataGridViewRestrictedComboBoxEditingControl code files are made up of almost identical code.  Both of them are descended from the ComboBox (directly in the case of the RestrictedComboBox, more distantly in the case of the other) and do their thing by interfering with combo box item selection and drawing.  I'm toying with refactoring the common logic into a helper class.  What do you think -- go to the trouble or not go to the trouble?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-116008310826965104?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/116008310826965104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=116008310826965104' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/116008310826965104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/116008310826965104'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2006/10/to-refactor-or-not-to-refactor.html' title='To Refactor or not to Refactor'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-115800836365902702</id><published>2006-09-11T16:13:00.000-04:00</published><updated>2006-11-01T18:13:42.936-05:00</updated><title type='text'>DataGridView, DateTimePicker, and Nullable Types</title><content type='html'>I'm building a WinForms app with C# 2.0, and I need to display some data in a grid. I want to use the new DataGridView, since it supercedes the DataGrid.&lt;br /&gt;&lt;br /&gt;One of the fields in the data being bound is a DateTime. I would like to display a DateTimePicker in that column when it's being edited.&lt;br /&gt;&lt;br /&gt;That part isn't hard. One &lt;a href="http://www.codeproject.com/script/Articles/list_articles.asp?userid=236354"&gt;Yildirim Kocdag&lt;/a&gt; posted an &lt;a href="http://www.codeproject.com/useritems/GenericDataGridView.asp"&gt;article&lt;/a&gt; on CodeProject that includes a DataGridViewCalendarColumn. It's simple, yet effective. One hurdle vaulted.&lt;br /&gt;&lt;br /&gt;But, the DateTime value can sometimes be null. I want the DateTimePicker to handle nulls appropriately. Once again to CodeProject: &lt;a href="http://www.codeproject.com/script/Articles/list_articles.asp?userid=587121"&gt;Claudio Grazioli&lt;/a&gt; wrote an &lt;a href="http://www.codeproject.com/cs/miscctrl/NullableDateTimePicker.asp"&gt;article&lt;/a&gt; on implementing a nullable DateTimePicker. Two hurdles jumped, now. All I need to do is adapt the DataGridViewCalendarColumn to use a nullable DateTimePicker. This requires some changes to the nullable DateTimePicker and some additions to the DataGridViewCalendarColumn, but eventually it works.&lt;br /&gt;&lt;br /&gt;The support for it in Visual Studio 2005 is beautiful, just beautiful: all I had to do was add a reference to the project in which I implemented the new controls and my DataGridViewCalendarColumn appears in a list with all the other DataGridViewColumns when you edit the columns of a DataGridView. I was so surprised to see it there already that I actually canceled out of that operation and double-checked that it really was &lt;u&gt;my&lt;/u&gt; DataGridViewCalendarColumn that was appearing. It was. Three cheers for Visual Studio and three hurdles jumped.&lt;br /&gt;&lt;br /&gt;So I try running the app to see how it works in context. For some reason it takes three clicks on a DataGridView cell to get an editable textbox, and it won't let me simply type in a date, but if you click on the Picker you can pick a date without difficulty. Clicking away from it updates the date in the data source. We're partway over the last hurdle: in mid-air, you might say.&lt;br /&gt;&lt;br /&gt;But, I try to change an existing date to null and save that. I'm able to delete the contents of the DateTimePicker without problems, but when I click away the original date comes back. I do a little debugging and find that it's refusing to be set to the value I gave it for a null DateTime.&lt;br /&gt;&lt;br /&gt;A bit of background: I hadn't decided just what flavor of nullable type I was going to use for my business objects, so in these initial forays I was simply using DateTime.MinValue as a proxy for Null (or DBNull). I forgot that the DateTimePicker doesn't like that: it only supports dates going back to 1753. That's why the cell won't accept the new, empty value: deep down within a Try... Catch, it's rejecting DateTime.MinValue with a supercilious message. It's serious about it, too: a quick check with Reflector reveals that 1/1/1753 is hardcoded in several places to make sure that no matter what anybody does with the MinValue property of the DateTimePicker, it doesn't go below 1753.&lt;br /&gt;&lt;br /&gt;I momentarily consider expanding my definition of Null to include 1/1/1753 but immediately abandon that as A Very Bad Idea. So it looks like I have to make up my mind about nullable types right now.&lt;br /&gt;&lt;br /&gt;So, to Nullable&amp;lt;T&amp;gt;. I love generics. But I &lt;a href="http://orbitalspacelaser.com/blog/archive/2006/06/28/15039.aspx"&gt;already know&lt;/a&gt; that there's no easy conversion between DBNull and Nullable&amp;lt;T&amp;gt;. A little Googling reveals that WinForms databinding doesn't go out of its way to support Nullable&amp;lt;T&amp;gt;, either. In fact, it doesn't support it at all! But, again, there is a workaround! The very helpful &lt;a href="http://www.thejoyofcode.com/Bruusi.aspx"&gt;Bruusi&lt;/a&gt; has posted a blog entry titled &lt;a href="http://www.thejoyofcode.com/Databinding_and_Nullable_types_in_WinForms.NET.aspx"&gt;Data Binding and Nullable types in WinForms.NET&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The secret, it appears, is an extender provider. But his example is for binding to a TextBox. Can an extender provider be made to work with the DateTimePicker? In a DataGridView?&lt;br /&gt;&lt;br /&gt;I don't know. But tune in tomorrow. I'll let you know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-115800836365902702?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/115800836365902702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=115800836365902702' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/115800836365902702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/115800836365902702'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2006/09/datagridview-datetimepicker-and.html' title='DataGridView, DateTimePicker, and Nullable Types'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-115749918923292690</id><published>2006-09-05T19:22:00.000-04:00</published><updated>2006-09-05T19:33:09.243-04:00</updated><title type='text'>"Just like CodeSmith, only more complicated"</title><content type='html'>That's my initial response to Microsoft's Guidance Automation Toolkit. It combines Visual Studio add-ins with code templates that look remarkably like CodeSmith's.   Programming of "recipes" is done with an XML-based declaration language. "Actions" encapsulate project and project item manipulation as well as code generation from the previously mentioned templates. Wizards organize it all for the user. Declarations in an xml configuration file add commands to the familiar project and item context menus. It's completely extensible, too.&lt;br /&gt;&lt;br /&gt;Getting into it is more difficult than it should be, since the available labs aren't from the final version of the product and don't always match the sample files you're supposed to manipulate. Some of the best stuff -- the actions to generate and insert code from templates -- isn't documented at all. But it's worth working with. It brings the promise of integrating your architecture standards and your preferred formats for boilerplate code into the Visual Studio environment for others to use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-115749918923292690?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/115749918923292690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=115749918923292690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/115749918923292690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/115749918923292690'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2006/09/just-like-codesmith-only-more.html' title='&quot;Just like CodeSmith, only more complicated&quot;'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-115127866192291944</id><published>2006-06-25T19:30:00.000-04:00</published><updated>2006-06-25T19:37:41.930-04:00</updated><title type='text'>CodeSmith 2.6 (Freeware) Still Available</title><content type='html'>CodeSmith, which many of us depend on, has become a &lt;a href="www.codesmithtools.com"&gt;commercial tool&lt;/a&gt;, and I wish them plenty of success with that.  Every development group should have it in its arsenal of tools.&lt;br /&gt;&lt;br /&gt;But for those of us not able to authorize a corporate purchase, the freeware version is &lt;a href="http://www.codesmithtools.com/freeware.aspx"&gt;still available&lt;/a&gt;. It's just a little hard to find.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-115127866192291944?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/115127866192291944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=115127866192291944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/115127866192291944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/115127866192291944'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2006/06/codesmith-26-freeware-still-available.html' title='CodeSmith 2.6 (Freeware) Still Available'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-115066527173623708</id><published>2006-06-18T17:04:00.000-04:00</published><updated>2006-06-25T19:55:42.353-04:00</updated><title type='text'>VS 2003 Property Expansion in Debugger Windows Bug</title><content type='html'>I found a solution on the web to an obscure bug in VS 2003, and since the solution was many Google pages deep I thought I'd post it here.&lt;br /&gt;&lt;br /&gt;People working with VS 2003 solutions with multiple projects sometimes encounter a bug where the property expansion of objects viewed in the debugger windows no longer works.  The object may or may not have a plus sign when viewed in the Watches, QuickWatch, or Locals window, but if you click the plus sign, it merely disappears.  The properties of the object are not displayed and there is no easy way to inspect them.   This seriously impairs the debugger's usefulness as a tool.&lt;br /&gt;&lt;br /&gt;The root cause of this is having a project in your solution that doesn't have any classes.  Build projects and catchall projects with non-code items often fit the bill.  Adding a dummy class -- just a skeletal declaration -- makes the problem go away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-115066527173623708?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/115066527173623708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=115066527173623708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/115066527173623708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/115066527173623708'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2006/06/vs-2003-property-expansion-in-debugger.html' title='VS 2003 Property Expansion in Debugger Windows Bug'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-115066443468130853</id><published>2006-06-18T16:54:00.000-04:00</published><updated>2006-06-25T19:53:31.813-04:00</updated><title type='text'>Computer Recycling Collection Event</title><content type='html'>If you live in Hamilton County and you've been accumulating bits of old computers because you're too conscientious to throw their lead-ridden carcasses into the dumpster, this is for you:&lt;br /&gt;&lt;p style="MARGIN-LEFT: 30px"&gt;HCDOES Solid Waste Management Division is once again hosting a computer recycling event. The 6th Annual Computer Recycling Collection Event will be held &lt;strong&gt;July 11– 16, 2006&lt;/strong&gt; at Technology Recycling Group located in St. Bernard, Ohio. All businesses, schools, and non-profits must pre-register for the event. &lt;strong&gt;Residents do not need to pre-register&lt;/strong&gt;. The registration deadline is June 9, 2006. Hamilton County Residents only.&lt;br /&gt;&lt;a href="http://www.keepcincinnatibeautiful.org/Programs/sourcered.html#Computer" target="_BLANK"&gt;http://www.keepcincinnatibeautiful.org&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-115066443468130853?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/115066443468130853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=115066443468130853' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/115066443468130853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/115066443468130853'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2006/06/computer-recycling-collection-event.html' title='Computer Recycling Collection Event'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-114920060900364577</id><published>2006-06-01T17:49:00.000-04:00</published><updated>2006-06-01T18:23:29.060-04:00</updated><title type='text'>Client-side C#</title><content type='html'>I've always had a soft spot for "little" languages and the translators that read them. "Little" languages typically compile to source code in some other language rather than to an executable. The first one of these I encountered was RPG/free, Paul Conte's innovative free-form, arbitrarily-long-variable-name version of RPG (so old at this point that I couldn't even find a link.)&lt;br /&gt;&lt;br /&gt;I was reminded of this when I encountered &lt;a href="http://www.nikhilk.net/ScriptSharpIntro.aspx"&gt;Script#&lt;/a&gt;, by &lt;a href="http://www.nikhilk.net"&gt;Nikhil Kothari&lt;/a&gt;. Quite simply, it allows you to write C#, complete with classes, inheritance, and strong typing, and then compile it into javascript. Because the source code is C#, you have the use of all the intellisense and other support in Visual Studio, as VS reflects on the core sscorlib assembly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-114920060900364577?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/114920060900364577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=114920060900364577' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/114920060900364577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/114920060900364577'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2006/06/client-side-c.html' title='Client-side C#'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-114779992769735663</id><published>2006-05-16T12:56:00.000-04:00</published><updated>2006-05-16T13:18:47.750-04:00</updated><title type='text'>Selenium IDE and ASP.NET validators</title><content type='html'>After reading &lt;a href="http://jesstedder.com/dev/blogs/jess_tedder/archive/2006/03/29/304.aspx"&gt;Jess Tedder's&lt;/a&gt; praise of Selenium IDE, I went to give it a try. I liked it, thought it was very easy to use and very effective.&lt;br /&gt;&lt;br /&gt;There were two problems I had with it: one, that there doesn't appear to be a way to stop a test once it is in progress without closing the IDE (a problem if you accidentally get yourself into a wait state for something that will never happen), and two, that there doesn't seem to be a straightforward way to test for the appearance of ASP.NET validator control indicators and messages on the page.&lt;br /&gt;&lt;br /&gt;Validator indicators and messages are rendered on the page, but initially have their &lt;span style="font-family:courier new;"&gt;style.visibility&lt;/span&gt; attribute set to &lt;span style="font-family:courier new;"&gt;hidden&lt;/span&gt;. Indicators appear at the site of the validator control in the page, while messages are commonly dynamically collected displayed in validation summary controls, elsewhere on the page. Selenium has methods to test for the presence of text on a page, but since the messages and indicators are indeed on the page but not necessarily visible, you get a lot of false positives. I tried using methods that looked for attributes of specific elements, but ran into problems because it isn't always possible to predict what the id will wind up being for a control on an ASP.NET page, depending on what it's nested in and how the markup was generated. Indeed, some controls (like the &lt;span style="font-family:courier new;"&gt;&amp;lt;li&amp;gt;&lt;/span&gt; error message elements that are added to validation summary controls during validation) don't even get their own ids.   Finding the control by its location rather than its id can be problematic in ASP.NET because since the error messages are added dynamically, you don't necessarily know where in the sequence the list entry with your message will be.*&lt;br /&gt;&lt;br /&gt;I'm sure eventually someone will write a Selenium extension that will take care of this -- a text-on-page test that tests for the visibility of the text. It would be nice if it also allowed expressions for the search text. I might even try it myself once I get past my home programming backlog.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;*  Yes, ideally you'll know exactly which messages to expect and can predict where in the sequence the message you're testing for will fall.  But the test you're running might be just for one function generating one message, and not concerned with nor wishing to specify what other validation messages might be visible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-114779992769735663?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/114779992769735663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=114779992769735663' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/114779992769735663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/114779992769735663'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2006/05/selenium-ide-and-aspnet-validators.html' title='Selenium IDE and ASP.NET validators'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-114635674230234807</id><published>2006-04-29T20:10:00.000-04:00</published><updated>2006-04-29T20:25:42.310-04:00</updated><title type='text'>Linking Wizard Controls</title><content type='html'>.NET 2.0 has a wizard control, in which you define steps in markup and then step through them.   Starting in December I was working at a client who needed a seven or eight step wizard, with each step having complex validating and navigation requirements.  The user control in which we built this wizard became enormous and disorganized, as successive steps used different data structures and sprouted subroutines and event handlers.   We wished we could make several sub-wizards of a few related pages each and link them together. &lt;br /&gt;&lt;br /&gt;Well, you can, sort of.  What you can do is implement a user control that contains a wizard control, implement whatever page-specific logic you can factor out of the big wizard, and then expose the WizardSteps collection as a property.  Then you can have your parent user control (with the big wizard) load the user control, but add each step in the WizardSteps property to the WizardSteps collection of the big wizard.  The steps will behave to the user as if they were defined in the big wizard, with their titles appearing as steps in the big wizard's sidebar, but the event handlers for all the controls will still be handled by the original user control. &lt;br /&gt;&lt;br /&gt;To reference the big wizard, which is now the parent of the steps, set up a private property on the subwizard user control that references the Wizard property of one of the steps.  This will now be the big wizard.   The subwizard will now be inert and won't have a useful ActiveStepIndex or generate NextStepClicked events.  If you need handlers for that in the subwizard user control you'll have to explicitly hook them up to your new Wizard property.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-114635674230234807?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/114635674230234807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=114635674230234807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/114635674230234807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/114635674230234807'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2006/04/linking-wizard-controls.html' title='Linking Wizard Controls'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26619214.post-114557334626451121</id><published>2006-04-20T18:39:00.000-04:00</published><updated>2006-04-20T18:49:06.273-04:00</updated><title type='text'>Client-side objects for server controls</title><content type='html'>I had a conversation with Chris Peterson on Tuesday regarding the difficulty of manipulating the HTML controls inside composite or templated .NET controls with Javascript.  The controls have ids that you can't easily predict unless you are generating the javascript from within the templated control, and even if you could predict them you'd be violating one of the rules of encapsulation, namely that code manipulating an object (your server control) shouldn't have to know the internals of that control.&lt;br /&gt;&lt;br /&gt;Given that Javascript can create objects with arbitrary properties, it occurred to me that it would be possible to expose the objects in a .NET templated control as properties of a client-side object, making them available for manipulating by javascript not generated by the control.  Validation controls in .NET 2.0 already do this, using the AddExpandoProperty method of the ClientScriptManager object.  I see an area here for experimentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26619214-114557334626451121?l=www.annlewkowicz.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.annlewkowicz.com/feeds/114557334626451121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26619214&amp;postID=114557334626451121' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/114557334626451121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26619214/posts/default/114557334626451121'/><link rel='alternate' type='text/html' href='http://www.annlewkowicz.com/2006/04/client-side-objects-for-server.html' title='Client-side objects for server controls'/><author><name>Ann</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='32' src='http://1.bp.blogspot.com/_01JGW8dV4UU/S9cphZCqDxI/AAAAAAAAAAM/3d_xUVEfUDs/S220/Self-portrait.JPG'/></author><thr:total>0</thr:total></entry></feed>
