<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" version="2.0">
  <channel>
    <title>deepdark.net - James Green's Blog - Code Generation</title>
    <link>http://deepdark.net/</link>
    <description>.NET, SQL Server and *.*</description>
    <image>
      <url>http://deepdark.net/files/deepdark.jpg</url>
      <title>deepdark.net - James Green's Blog - Code Generation</title>
      <link>http://deepdark.net/</link>
    </image>
    <language>en-us</language>
    <copyright>James Green</copyright>
    <lastBuildDate>Wed, 21 Feb 2007 07:32:28 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>James.Green@deepdark.net</managingEditor>
    <webMaster>James.Green@deepdark.net</webMaster>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=9f7fd404-796e-4353-a954-d8fcd8465cd4</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,9f7fd404-796e-4353-a954-d8fcd8465cd4.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,9f7fd404-796e-4353-a954-d8fcd8465cd4.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=9f7fd404-796e-4353-a954-d8fcd8465cd4</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>More different ways to script database objects a different way</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,9f7fd404-796e-4353-a954-d8fcd8465cd4.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,9f7fd404-796e-4353-a954-d8fcd8465cd4.aspx</link>
      <pubDate>Wed, 21 Feb 2007 07:32:28 GMT</pubDate>
      <description>Rob Farley posted a &lt;a href="http://msmvps.com/blogs/robfarley/archive/2007/02/21/scripting-database-objects-a-different-way.aspx"&gt;very
interesting codegen post on scripting objects this morning&lt;/a&gt;, and as a reforming
codegen junky I just couldn't let it go without comment :-) 
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
Firstly, I modified his query as so:&lt;br&gt;
&lt;pre&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;select &lt;/font&gt;&lt;font color=#ff1493&gt;quotename&lt;/font&gt;(si&lt;font color=#0000ff&gt;.&lt;/font&gt;&lt;font color=#0000ff&gt;name) &lt;/font&gt;&lt;font color=#0000ff&gt;as &lt;/font&gt;"@IndexName", &lt;font color=#ff1493&gt;quotename&lt;/font&gt;(ss.&lt;font color=#0000ff&gt;name&lt;/font&gt;) &lt;font color=#0000ff&gt;AS &lt;/font&gt;"@SchemaName", &lt;font color=#ff1493&gt;quotename&lt;/font&gt;(so.&lt;font color=#0000ff&gt;name&lt;/font&gt;) &lt;font color=#0000ff&gt;AS &lt;/font&gt;"@ObjectName",&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#ff1493&gt;stuff&lt;/font&gt;((&lt;font color=#0000ff&gt;select &lt;/font&gt;&lt;font color=#ff0000&gt;','&lt;/font&gt; + &lt;font color=#ff1493&gt;quotename&lt;/font&gt;(sc.&lt;font color=#0000ff&gt;name&lt;/font&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;from &lt;/font&gt;&lt;font color=#008000&gt;sys.index_columns&lt;/font&gt; sic&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#808080&gt;join &lt;/font&gt;&lt;font color=#008000&gt;sys.columns&lt;/font&gt; sc&lt;br&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; &lt;font color=#0000ff&gt;on &lt;/font&gt;sc.column_id
= sic.column_id&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;where &lt;/font&gt;so.&lt;font color=#ff1493&gt;object_id&lt;/font&gt; =
sic.&lt;font color=#ff1493&gt;object_id&lt;/font&gt;
&lt;br&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; &lt;font color=#808080&gt;and &lt;/font&gt;sic.index_id
= si.index_id&lt;br&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; &lt;font color=#808080&gt;and &lt;/font&gt;sc.&lt;font color=#ff1493&gt;object_id &lt;/font&gt;=
so.&lt;font color=#ff1493&gt;object_id&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;order
by&lt;/font&gt; sic.key_ordinal&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;for xml
path&lt;/font&gt;(&lt;font color=#ff0000&gt;''&lt;/font&gt;)),1,1,&lt;font color=#ff0000&gt;''&lt;/font&gt;) &lt;font color=#0000ff&gt;as &lt;/font&gt;"@IndexColumns"&lt;br&gt;
&lt;font color=#0000ff&gt;from &lt;/font&gt;&lt;font color=#008000&gt;sys.indexes&lt;/font&gt; si&lt;br&gt;
&lt;font color=#808080&gt;join &lt;/font&gt;&lt;font color=#008000&gt;sys.objects&lt;/font&gt; so&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; on so.&lt;font color=#ff1493&gt;object_id&lt;/font&gt; = si.&lt;font color=#ff1493&gt;object_id&lt;/font&gt;
&lt;br&gt;
&lt;font color=#808080&gt;join &lt;/font&gt;&lt;font color=#008000&gt;sys.schemas&lt;/font&gt; ss&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;on &lt;/font&gt;ss.schema_id = so.schema_id&lt;br&gt;
&lt;font color=#0000ff&gt;where &lt;/font&gt;so.&lt;font color=#0000ff&gt;type &lt;/font&gt;= &lt;font color=#ff0000&gt;'U'&lt;/font&gt; &lt;font color=#808080&gt;and &lt;/font&gt;si.&lt;font color=#0000ff&gt;type &lt;/font&gt;=
1&lt;br&gt;
&lt;font color=#0000ff&gt;for xml path&lt;/font&gt;(&lt;font color=#ff0000&gt;'index'&lt;/font&gt;), &lt;font color=#0000ff&gt;root&lt;/font&gt;(&lt;font color=#ff0000&gt;'indexes'&lt;/font&gt;)&lt;/font&gt;
&lt;br&gt;
&lt;/pre&gt;
&lt;br&gt;
Things I'll point out:&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
Adding the extra &lt;font face="Courier New"&gt;for xml &lt;/font&gt;clause, this time specifying
a better row element name than 'row' and also adding a document node 
&lt;br&gt;
&lt;li&gt;
Once the outter for xml clause is in place, we can alias the columns using @ to have
them come out as elements in the results&lt;/li&gt;
&lt;/ul&gt;
We can feed the results of that query straight into the following XSLT:&lt;br&gt;
&lt;br&gt;
&lt;pre&gt;&lt;font face="Courier New"&gt;&amp;lt;?&lt;font color=#a52a2a&gt;xml&lt;/font&gt; &lt;font color=#ff0000&gt;version&lt;/font&gt;=&lt;font color=#006400&gt;"1.0"&lt;/font&gt; &lt;font color=#ff0000&gt;encoding&lt;/font&gt;=&lt;font color=#006400&gt;"iso-8859-1"&lt;/font&gt;&lt;font color=#a52a2a&gt;?&lt;/font&gt;&amp;gt;&lt;br&gt;
&amp;lt;&lt;font color=#0000ff&gt;xsl:stylesheet&lt;/font&gt; &lt;font color=#ff0000&gt;version&lt;/font&gt;=&lt;font color=#006400&gt;"1.0"&lt;/font&gt; &lt;font color=#ff0000&gt;xmlns:xsl&lt;/font&gt;=&lt;font color=#006400&gt;"http://www.w3.org/1999/XSL/Transform"&lt;/font&gt;&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;font color=#0000ff&gt;xsl:output&lt;/font&gt; &lt;font color=#ff0000&gt;method&lt;/font&gt;="&lt;font color=#006400&gt;text"&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;/&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;font color=#0000ff&gt;xsl:template&lt;/font&gt; &lt;font color=#ff0000&gt;match&lt;/font&gt;=&lt;font color=#006400&gt;'/'&lt;/font&gt;&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;font color=#0000ff&gt;xsl:apply-templates&lt;/font&gt; &lt;font color=#ff0000&gt;select &lt;/font&gt;=&lt;font color=#006400&gt;'indexes/index'&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;/&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;font color=#0000ff&gt;xsl:template&lt;/font&gt;&amp;gt;&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;lt;&lt;font color=#0000ff&gt;xsl:template&lt;/font&gt; &lt;font color=#ff0000&gt;match&lt;/font&gt;=&lt;font color=#006400&gt;'index'&lt;/font&gt; &amp;gt;&lt;br&gt;
create index &amp;lt;&lt;font color=#0000ff&gt;xsl:value-of&lt;/font&gt; &lt;font color=#ff0000&gt;select&lt;/font&gt;=&lt;font color=#006400&gt;'@IndexName'&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;/&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;gt; 
&lt;br&gt;
&amp;nbsp; on &amp;lt;&lt;font color=#0000ff&gt;xsl:value-of&lt;/font&gt; &lt;font color=#ff0000&gt;select&lt;/font&gt;=&lt;font color=#006400&gt;'@SchemaName'&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;/&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;gt;.&amp;lt;&lt;font color=#0000ff&gt;xsl:value-of&lt;/font&gt; &lt;font color=#ff0000&gt;select&lt;/font&gt;=&lt;font color=#006400&gt;'@ObjectName'&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;/&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;gt;
(&amp;lt;&lt;font color=#0000ff&gt;xsl:value-of&lt;/font&gt; &lt;font color=#ff0000&gt;select&lt;/font&gt;=&lt;font color=#006400&gt;'@IndexColumns'&lt;/font&gt;&lt;font color=#0000ff&gt;/&lt;/font&gt;&amp;gt;)&lt;br&gt;
&amp;nbsp; &amp;lt;/&lt;font color=#0000ff&gt;xsl:template&lt;/font&gt;&amp;gt;&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;lt;&lt;font color=#0000ff&gt;/xsl:stylesheet&lt;/font&gt;&amp;gt;&lt;/font&gt;
&lt;br&gt;
&lt;/pre&gt;
&lt;p class=MsoNormal&gt;
I'm not claiming this method is superior, just different, which I think is in keeping
with the spirit of Rob's post :-)&amp;nbsp; and I have learned more about the improvements
of the for xml clause in SQL Server 2005 in the process.&lt;br&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
I'll leave final judgment on the utility of this approach as an exercise to the reader;
my instinctive reaction is to include it as a build step to help you snapshot schema
changes between check-ins, or as Rob suggests to take objects from one database and
create slightly different objects in another database – there are no wrong answers
and if you think of something interesting please leave a comment :-)&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&lt;?xml:namespace prefix = o /&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
Grab the source files here: &lt;a href="http://deepdark.net/content/binary/ScriptObjects.zip"&gt;ScriptObjects.zip
(.78 KB)&lt;/a&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,9f7fd404-796e-4353-a954-d8fcd8465cd4.aspx</comments>
      <category>Code Generation</category>
      <category>Database</category>
      <category>Downloads</category>
      <category>T-SQL</category>
      <category>XSLT</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=3bc03dcd-ff01-4e88-b044-2538dfc04f62</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,3bc03dcd-ff01-4e88-b044-2538dfc04f62.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,3bc03dcd-ff01-4e88-b044-2538dfc04f62.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3bc03dcd-ff01-4e88-b044-2538dfc04f62</wfw:commentRss>
      <title>Code Generation in T-SQL</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,3bc03dcd-ff01-4e88-b044-2538dfc04f62.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,3bc03dcd-ff01-4e88-b044-2538dfc04f62.aspx</link>
      <pubDate>Mon, 11 Dec 2006 22:35:10 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face=Calibri&gt;OK,&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;so
I was trying to kick this &lt;a href="http://deepdark.net/PermaLink,guid,2350bc86-c0c4-496a-b788-8159bbeade2d.aspx"&gt;Code
Generation bent I have been on of late&lt;/a&gt;, but… opportunity knocked yesterday for
a query where one of the possible solutions involved codegen and I was weak &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;:-)&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font face=Calibri color=#000000 size=3&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face=Calibri&gt;So
imagine we have some convieniently breif and neatly anonymized canonical example like
the following table: 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face=Calibri&gt;&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;SELECT&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; customer_id&lt;/font&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt;&lt;font color=#000000&gt; order_id 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;FROM&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; OrderCustomer&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;table class=MsoNormalTable style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 4.65pt; BORDER-LEFT: medium none; WIDTH: 112.9pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing=0 cellpadding=0 width=151 border=1&gt;
&lt;tbody&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #404040; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; mso-border-alt: solid windowtext .5pt; mso-shading: windowtext; mso-pattern: gray-75 auto" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;font face=Calibri&gt;&lt;span style="COLOR: yellow; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;customer_id&lt;/span&gt;&lt;span style="COLOR: yellow; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #404040; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; mso-border-alt: solid windowtext .5pt; mso-shading: windowtext; mso-pattern: gray-75 auto; mso-border-left-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;font face=Calibri&gt;&lt;span style="COLOR: yellow; mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;order_id&lt;/span&gt;&lt;span style="COLOR: yellow; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 1"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;1&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;32&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 2"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;1&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;33&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 3"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;1&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;34&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 4"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;2&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;821&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 5"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;2&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;831&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 6"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;2&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;851&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 7"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;2&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;861&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 8"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;2&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;871&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 9"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;2&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;911&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 10"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;3&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;1&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 11"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;3&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;2&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 12"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;3&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;3&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 13"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;3&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;4&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 14; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63.65pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=85&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;3&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 49.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=66&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;5&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face=Calibri&gt;Now
imagine the project is to &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;i style="mso-bidi-font-style: normal"&gt;remove
all the rows from this table, except the lowest number order&lt;/i&gt;&lt;/b&gt; for&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;each
customer.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;The first step is to write
a query to exceptionalize these rows: 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;SELECT&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; customer_id&lt;/font&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: fuchsia"&gt;min&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;font color=#000000&gt;order_id&lt;/font&gt;&lt;span style="COLOR: gray"&gt;)&lt;/span&gt;&lt;font color=#000000&gt; AS &lt;/font&gt;&lt;span style="COLOR: blue"&gt;AS&lt;/span&gt;&lt;font color=#000000&gt; LowestOrderID&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;FROM&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; OrderCustomer&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;GROUP&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;BY&lt;/span&gt;&lt;font color=#000000&gt; customer_id&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;table class=MsoNormalTable style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 4.65pt; BORDER-LEFT: medium none; WIDTH: 139pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-border-insideh: .75pt solid windowtext; mso-border-insidev: .75pt solid windowtext" cellspacing=0 cellpadding=0 width=185 border=1&gt;
&lt;tbody&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #404040; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; mso-shading: windowtext; mso-pattern: gray-75 auto; mso-border-left-alt: .5pt; mso-border-top-alt: .5pt; mso-border-bottom-alt: .75pt; mso-border-right-alt: .75pt; mso-border-color-alt: windowtext; mso-border-style-alt: solid" valign=bottom nowrap width=84&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;
&lt;span style="COLOR: yellow; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;customer_id&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #404040; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 76pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; mso-shading: windowtext; mso-pattern: gray-75 auto; mso-border-left-alt: .75pt; mso-border-top-alt: .5pt; mso-border-bottom-alt: .75pt; mso-border-right-alt: .5pt; mso-border-color-alt: windowtext; mso-border-style-alt: solid" valign=bottom nowrap width=101&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;
&lt;span style="COLOR: yellow; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;LowestOrderID&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 1"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .75pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .75pt" valign=bottom nowrap width=84&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;1&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 76pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .75pt; mso-border-left-alt: solid windowtext .75pt; mso-border-top-alt: solid windowtext .75pt; mso-border-right-alt: solid windowtext .5pt" valign=bottom nowrap width=101&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;32&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 2"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .75pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .75pt" valign=bottom nowrap width=84&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;2&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 76pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .75pt; mso-border-left-alt: solid windowtext .75pt; mso-border-top-alt: solid windowtext .75pt; mso-border-right-alt: solid windowtext .5pt" valign=bottom nowrap width=101&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;821&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 3; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 63pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-left-alt: .5pt; mso-border-top-alt: .75pt; mso-border-bottom-alt: .5pt; mso-border-right-alt: .75pt; mso-border-color-alt: windowtext; mso-border-style-alt: solid" valign=bottom nowrap width=84&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;3&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 76pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-left-alt: .75pt; mso-border-top-alt: .75pt; mso-border-bottom-alt: .5pt; mso-border-right-alt: .5pt; mso-border-color-alt: windowtext; mso-border-style-alt: solid" valign=bottom nowrap width=101&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;1&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face=Calibri&gt;The
next step is to select some string literals with the original query so that the result
is valid T-SQL&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;SELECT&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: red"&gt;'DELETE
FROM OrderCustomer WHERE customer_id = '&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt;&lt;font color=#000000&gt; customer_id&lt;/font&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt;&lt;font color=#000000&gt; 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: red"&gt;'AND
order_id &amp;gt; '&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: fuchsia"&gt;min&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;font color=#000000&gt;order_id&lt;/font&gt;&lt;span style="COLOR: gray"&gt;)&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;AS&lt;/span&gt;&lt;font color=#000000&gt; LowestOrderID&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;FROM&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; OrderCustomer&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;GROUP&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;BY&lt;/span&gt;&lt;font color=#000000&gt; customer_id&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font face=Calibri&gt;Tangentally
the little unit of joy in this whole experience for me is that &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;the
&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;Ctrl-T&amp;gt;&lt;/span&gt;&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font face=Calibri&gt; keyboard
shortcut is the same in SQL Server 2005 Management Studio as it was back in Query
Analyzer.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font face=Calibri color=#000000 size=3&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font face=Calibri&gt;So,
hit &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;Ctrl-T&amp;gt;&lt;/span&gt;&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font face=Calibri&gt; to
output the results window as Text, then F5 to return the results to get something
like:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;DELETE
FROM OrderCustomer WHERE customer_id =&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;1&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AND
order_id &amp;gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;32&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;DELETE
FROM OrderCustomer WHERE customer_id =&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;2&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AND
order_id &amp;gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;821&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;DELETE
FROM OrderCustomer WHERE customer_id =&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;3&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AND
order_id &amp;gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;1&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;(2
row(s) affected)&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;(5
row(s) affected)&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;(4
row(s) affected)&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font face=Calibri&gt;Select
all the &lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;DELETE
FROM&lt;/span&gt;&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font face=Calibri&gt; statements
and copy and paste them into a new query window, then F5 to remove the rows.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font face=Calibri color=#000000 size=3&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="mso-bidi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face=Calibri&gt;Look
at the table to test the result:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;SELECT&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; customer_id&lt;/font&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt;&lt;font color=#000000&gt; order_id 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;FROM&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; OrderCustomer&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;table class=MsoNormalTable style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 4.65pt; BORDER-LEFT: medium none; WIDTH: 105.6pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing=0 cellpadding=0 width=141 border=1&gt;
&lt;tbody&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #404040; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 0.8in; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; mso-border-alt: solid windowtext .5pt; mso-shading: windowtext; mso-pattern: gray-75 auto" valign=bottom nowrap width=77&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;
&lt;span style="COLOR: yellow; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;customer_id&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #404040; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 48pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; mso-border-alt: solid windowtext .5pt; mso-shading: windowtext; mso-pattern: gray-75 auto; mso-border-left-alt: solid windowtext .5pt" valign=bottom nowrap width=64&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;
&lt;span style="COLOR: yellow; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;order_id&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 1"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 0.8in; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=77&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;1&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 48pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=64&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;32&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 2"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 0.8in; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=77&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;2&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 48pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=64&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;821&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 15pt; mso-yfti-irow: 3; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 0.8in; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=77&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;3&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ece9d8; WIDTH: 48pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign=bottom nowrap width=64&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: right" align=right&gt;
&lt;span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-font-family: 'Times New Roman'; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;font face=Calibri&gt;1&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;
&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,3bc03dcd-ff01-4e88-b044-2538dfc04f62.aspx</comments>
      <category>Code Generation</category>
      <category>Database</category>
      <category>Geeking Out!</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=3f4e2b96-9fc9-407a-8732-d2e0a77473fa</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,3f4e2b96-9fc9-407a-8732-d2e0a77473fa.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,3f4e2b96-9fc9-407a-8732-d2e0a77473fa.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3f4e2b96-9fc9-407a-8732-d2e0a77473fa</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">This is the last one <a href="http://deepdark.net/PermaLink,guid,7c8c89cd-5cc9-4be3-8456-abc6041210ff.aspx">in
this current thread </a>for a while :)<br /><br />
By the end of the last example we had code that would <a href="http://deepdark.net/Default.aspx#a2350bc86-c0c4-496a-b788-8159bbeade2d">discover
what stored procs were in a SQL Server database and generate a managed wrapper library</a> that <a href="http://deepdark.net/PermaLink,guid,7c8c89cd-5cc9-4be3-8456-abc6041210ff.aspx">could
be extended</a>.<br /><br />
The next step it occured to me was to be <a href="http://msdn2.microsoft.com/en-us/library/microsoft.visualbasic.vbcodeprovider.aspx">then
generate an assembly from this source</a> and <a href="http://msdn2.microsoft.com/en-us/library/system.reflection.assembly.loadfrom.aspx">load
it into the currently executing program</a>.  The MSDN pages I have linked to
have some good samples.<br /><br />
I'm adding this one to my toolbox of hammers looking for a nail.</body>
      <title>Basic Code Generation with XSLT (for Ninjas)</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,3f4e2b96-9fc9-407a-8732-d2e0a77473fa.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,3f4e2b96-9fc9-407a-8732-d2e0a77473fa.aspx</link>
      <pubDate>Mon, 04 Dec 2006 05:21:23 GMT</pubDate>
      <description>This is the last one &lt;a href="http://deepdark.net/PermaLink,guid,7c8c89cd-5cc9-4be3-8456-abc6041210ff.aspx"&gt;in
this current thread &lt;/a&gt;for a while :)&lt;br&gt;
&lt;br&gt;
By the end of the last example we had code that would &lt;a href="http://deepdark.net/Default.aspx#a2350bc86-c0c4-496a-b788-8159bbeade2d"&gt;discover
what stored procs were in a SQL Server database and generate a managed wrapper library&lt;/a&gt; that &lt;a href="http://deepdark.net/PermaLink,guid,7c8c89cd-5cc9-4be3-8456-abc6041210ff.aspx"&gt;could
be extended&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
The next step it occured to me was to be &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.visualbasic.vbcodeprovider.aspx"&gt;then
generate an assembly from this source&lt;/a&gt; and &lt;a href="http://msdn2.microsoft.com/en-us/library/system.reflection.assembly.loadfrom.aspx"&gt;load
it into the currently executing program&lt;/a&gt;.&amp;nbsp; The MSDN pages I have linked to
have some good samples.&lt;br&gt;
&lt;br&gt;I'm adding this one to my toolbox of hammers looking for a nail.</description>
      <comments>http://deepdark.net/CommentView,guid,3f4e2b96-9fc9-407a-8732-d2e0a77473fa.aspx</comments>
      <category>Code Generation</category>
      <category>Geeking Out!</category>
      <category>XSLT</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=7c8c89cd-5cc9-4be3-8456-abc6041210ff</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,7c8c89cd-5cc9-4be3-8456-abc6041210ff.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,7c8c89cd-5cc9-4be3-8456-abc6041210ff.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=7c8c89cd-5cc9-4be3-8456-abc6041210ff</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <font color="#808080">(this post is an appendix to my prior post on</font>
          <font color="#000000">
            <a href="http://deepdark.net/PermaLink,guid,2350bc86-c0c4-496a-b788-8159bbeade2d.aspx">Basic
Code Generation with XSLT</a>,</font>
          <font color="#808080"> because I forgot this
bit the first time!)</font>
        </p>
        <p>
I just wanted to expand on thsi line in the VB code part of the template:
</p>
        <pre>
          <font color="#0000ff">Public Class DatabaseAccess<br />
    Inherits ConvienientBaseClass</font>
        </pre>
        <p>
Including a (facetiously named) base class for the generated code was no accident. 
It provides a good way to seperate the generated code from the human written code. 
All the generated code should be the tedious, repetitive, error prone code. 
Exception handling, transaction enrolement, logging etc should be implemented in the
base class so it can be ripped out if need be and of equal importance; the generated
code can be re-generated without clobbering any human written code.
</p>
        <p>
But that isn't very .NET 2.0 now is it.  We can extend the concept of seperating
the generated code from any human written parts by changing our template to generate
partial classes:
</p>
        <p>
          <font color="#0000ff">Public <strong>Partial</strong> Class DatabaseAccess<br />
    Inherits ConvienientBaseClass</font>
        </p>
        <p>
 
</p>
        <p>
 
</p>
      </body>
      <title>Basic Code Generation with XSLT (...in a 2.0 world)</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,7c8c89cd-5cc9-4be3-8456-abc6041210ff.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,7c8c89cd-5cc9-4be3-8456-abc6041210ff.aspx</link>
      <pubDate>Mon, 27 Nov 2006 11:00:59 GMT</pubDate>
      <description>&lt;p&gt;
&lt;font color=#808080&gt;(this post is an appendix to my prior post on&lt;/font&gt;&lt;font color=#000000&gt; &lt;a href="http://deepdark.net/PermaLink,guid,2350bc86-c0c4-496a-b788-8159bbeade2d.aspx"&gt;Basic
Code Generation with XSLT&lt;/a&gt;,&lt;/font&gt;&lt;font color=#808080&gt; because I forgot this bit
the first time!)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
I just wanted to expand on thsi line in the VB code part of the template:
&lt;/p&gt;
&lt;pre&gt;&lt;font color=#0000ff&gt;Public Class DatabaseAccess&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits ConvienientBaseClass&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;
Including a (facetiously named) base class for the generated code was no accident.&amp;nbsp;
It provides a good way to seperate the generated code from the human written code.&amp;nbsp;
All the generated code should be the tedious, repetitive, error prone code.&amp;nbsp;
Exception handling, transaction enrolement, logging etc should be implemented in the
base class so it can be ripped out if need be and of equal importance; the generated
code can be re-generated without clobbering any human written code.
&lt;/p&gt;
&lt;p&gt;
But that isn't very .NET 2.0 now is it.&amp;nbsp; We can extend the concept of seperating
the generated code from any human written parts by changing our template to generate
partial classes:
&lt;/p&gt;
&lt;p&gt;
&lt;font color=#0000ff&gt;Public &lt;strong&gt;Partial&lt;/strong&gt; Class DatabaseAccess&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits ConvienientBaseClass&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,7c8c89cd-5cc9-4be3-8456-abc6041210ff.aspx</comments>
      <category>Code Generation</category>
      <category>Geeking Out!</category>
      <category>XSLT</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=2350bc86-c0c4-496a-b788-8159bbeade2d</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,2350bc86-c0c4-496a-b788-8159bbeade2d.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,2350bc86-c0c4-496a-b788-8159bbeade2d.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=2350bc86-c0c4-496a-b788-8159bbeade2d</wfw:commentRss>
      <title>Basic Code Generation with XSLT</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,2350bc86-c0c4-496a-b788-8159bbeade2d.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,2350bc86-c0c4-496a-b788-8159bbeade2d.aspx</link>
      <pubDate>Thu, 23 Nov 2006 23:58:13 GMT</pubDate>
      <description>&lt;p&gt;
This was meant as a "Part II" to &lt;a href="http://deepdark.net/PermaLink,guid,b018cbdd-2f27-49ee-9764-d26e208977be.aspx"&gt;my
prior post on generating Text, HTML &amp;amp; more XML with XSLT&lt;/a&gt;.&amp;nbsp; The point
for today's post is that source code files are text files.&amp;nbsp; The example I am
thinking of is generating a library of VB.NET wrapper classes for the stored procedures
in a SQL Server database.
&lt;/p&gt;
&lt;p&gt;
(I've also ticked the Continuous Integration category for this post.&amp;nbsp; It wouldn't
be hard to think of a scenario where a build process would generate a library from
a reference database on the check-in of a stored proc script, then deliver the latest
rev of the library to the developers, anyway...)
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Step one&lt;/strong&gt; would be fetch the meta data about the stored procedures,
for example:&amp;nbsp;
&lt;/p&gt;
&lt;font color=#0000ff size=1&gt; 
&lt;p&gt;
SELECT
&lt;/font&gt;&lt;font color=#000000 size=1&gt; procs&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font color=#000000 size=1&gt;Specific_Name&lt;/font&gt;&lt;font color=#808080 size=1&gt;,&lt;/font&gt;&lt;font color=#000000 size=1&gt; params&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font color=#000000 size=1&gt;Parameter_Name&lt;/font&gt;&lt;font color=#808080 size=1&gt;,&lt;/font&gt;&lt;font color=#000000 size=1&gt; params&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font color=#000000 size=1&gt;Data_Type&lt;/font&gt;&lt;font color=#808080 size=1&gt;,&lt;/font&gt;&lt;font color=#000000 size=1&gt; params&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt;Parameter_Mode&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;
&lt;br&gt;
FROM&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#008000 size=1&gt;INFORMATION_SCHEMA.ROUTINES&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; procs&lt;/font&gt;&lt;/font&gt; &lt;font color=#808080 size=1&gt;
&lt;br&gt;
LEFT&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#808080 size=1&gt;JOIN&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#008000 size=1&gt;INFORMATION_SCHEMA.PARAMETERS&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; params&lt;/font&gt; 
&lt;br&gt;
&lt;/font&gt;&lt;font color=#0000ff size=1&gt;ON&lt;/font&gt;&lt;font size=1&gt; params&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font size=1&gt;Specific_Name &lt;/font&gt;&lt;font color=#808080 size=1&gt;=&lt;/font&gt;&lt;font size=1&gt; procs&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font size=1&gt;Specific_Name&lt;/font&gt;&lt;font color=#0000ff size=1&gt; 
&lt;br&gt;
WHERE&lt;/font&gt;&lt;font color=#000000 size=1&gt; procs&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font color=#000000 size=1&gt;Routine_Type &lt;/font&gt;&lt;font color=#808080 size=1&gt;=&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#ff0000 size=1&gt;'PROCEDURE'&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#808080 size=1&gt;AND&lt;/font&gt; &lt;font size=1&gt;
&lt;br&gt;
procs&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font size=1&gt;Specific_Name &lt;/font&gt;&lt;font color=#808080 size=1&gt;NOT&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#808080 size=1&gt;LIKE&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#ff0000 size=1&gt;'dt_%'&lt;/font&gt; &lt;font color=#0000ff size=1&gt;
&lt;br&gt;
FOR&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#0000ff size=1&gt;XML&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#0000ff size=1&gt;AUTO&lt;/font&gt; &gt;
&lt;p&gt;
Once we add a document node to this, we will have a document that contains many element
sets like this one:
&lt;/p&gt;
&lt;pre&gt;&amp;nbsp; &amp;lt;&lt;font color=#008000&gt;procs&lt;/font&gt; Specific_Name=&lt;font color=#ff0000&gt;"GetContactByID"&lt;/font&gt;&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;font color=#008000&gt;params&lt;/font&gt; Parameter_Name=&lt;font color=#ff0000&gt;"@ContactID"&lt;/font&gt; Data_Type=&lt;font color=#ff0000&gt;"nvarchar"&lt;/font&gt; Parameter_Mode=&lt;font color=#ff0000&gt;"IN"&lt;/font&gt;/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;font color=#008000&gt;params&lt;/font&gt; Parameter_Name=&lt;font color=#ff0000&gt;"@ContactGUID"&lt;/font&gt; Data_Type=&lt;font color=#ff0000&gt;"int"&lt;/font&gt; Parameter_Mode=&lt;font color=#ff0000&gt;"INOUT"&lt;/font&gt;/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;font color=#008000&gt;params&lt;/font&gt; Parameter_Name=&lt;font color=#ff0000&gt;"@Found"&lt;/font&gt; Data_Type=&lt;font color=#ff0000&gt;"bit"&lt;/font&gt; Parameter_Mode=&lt;font color=#ff0000&gt;"INOUT"/&lt;/font&gt;&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;/&lt;font color=#008000&gt;procs&lt;/font&gt;&amp;gt;&lt;/pre&gt;
&lt;p&gt;
I think that's all we&amp;nbsp;need to get started.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Step two&lt;/strong&gt; is to transform this data into VB.NET code.&amp;nbsp; For today's
example it suits me to generate two files:&amp;nbsp; 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
One will contain classes that wrap ADO.NET calls to the database 
&lt;li&gt;
The other will provide types that wrap properties for passing into and out of the
first&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The text of the first template is as follows
&lt;/p&gt;
&lt;pre&gt;&lt;font color=#008000&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br&gt;
&amp;lt;xsl:stylesheet xmlns:xsl="&lt;/font&gt;&lt;a href="http://www.w3.org/1999/XSL/Transform"&gt;&lt;font color=#008000&gt;http://www.w3.org/1999/XSL/Transform&lt;/font&gt;&lt;/a&gt;&lt;font color=#0000ff&gt;&lt;font color=#008000&gt;"
version="2.0"&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;xsl:output method="text" indent="yes" /&amp;gt;&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &amp;lt;xsl:template match="/"&amp;gt;&lt;/font&gt;
&lt;br&gt;
Imports System&lt;br&gt;
Imports System.Data.SqlClient&lt;br&gt;
Imports System.Data&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;Public Class DatabaseAccess&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits ConvienientBaseClass&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
Public Sub New(ByVal cn As SqlConnection, ByVal trn As SqlTransaction)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.New(cn, trn)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:apply-templates select="/database/procs"
/&amp;gt;&lt;/font&gt; 
&lt;br&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br&gt;
End Class&lt;br&gt;
&amp;nbsp;&lt;font color=#008000&gt; &amp;lt;/xsl:template&amp;gt; 
&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &amp;lt;xsl:template match="procs"&amp;gt;&lt;br&gt;
&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; '&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ' Wraps stored proc: &lt;font color=#008000&gt;&amp;lt;xsl:value-of select="@Specific_Name"
/&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ' 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function Execute&lt;font color=#008000&gt;&amp;lt;xsl:value-of select="@Specific_Name"
/&amp;gt;&lt;/font&gt;(ByVal params As &lt;font color=#008000&gt;&amp;lt;xsl:value-of select="@Specific_Name"
/&amp;gt;&lt;/font&gt;Struct) _ &lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&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;&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;As &lt;font color=#008000&gt;&amp;lt;xsl:value-of
select="@Specific_Name" /&amp;gt;&lt;/font&gt;Struct&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
Dim exec As New SqlCommand&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim param As SqlParameter&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
With exec&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CommandText = &lt;/font&gt;&lt;a href='mailto:"&lt;xsl:value-of select="@Specific_Name'&gt;&lt;font color=#0000ff&gt;"&lt;/font&gt;&lt;font color=#008000&gt;&amp;lt;xsl:value-of
select="@Specific_Name&lt;/font&gt;&lt;/a&gt;&lt;font color=#0000ff&gt;&lt;font color=#008000&gt;" /&lt;/font&gt;&lt;font color=#008000&gt;&amp;gt;&lt;/font&gt;"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CommandType =
CommandType.StoredProcedure&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Connection = MyBase.DatabaseConnection&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Transaction =
MyBase.CurrentTransaction&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates
select="params" /&amp;gt; &lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
Try&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not exec.Connection.State
= ConnectionState.Open Then exec.Connection.Open()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exec.ExecuteNonQuery()&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
Catch ex As Exception&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Throw&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Finally&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not exec Is
Nothing Then exec.Dispose()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
End Function&lt;br&gt;
&lt;font color=#008000&gt;&amp;nbsp; &amp;lt;/xsl:template&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&lt;font color=#008000&gt;&amp;nbsp; &amp;lt;xsl:template match="params"&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; param = exec.CreateParameter&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; With param&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:if
test="@Parameter_Mode='INOUT'"&amp;gt;&lt;/font&gt;&lt;font color=#0000ff&gt;.&lt;/font&gt;Direction = ParameterDirection.Output&lt;font color=#008000&gt;&amp;lt;/xsl:if&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:if
test="@Parameter_Mode='IN'"&amp;gt;&lt;/font&gt;&lt;font color=#0000ff&gt;.&lt;/font&gt;Direction = ParameterDirection.Input&lt;font color=#008000&gt;&amp;lt;/xsl:if&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .DbType = DbType.&lt;font color=#008000&gt;&amp;lt;xsl:value-of
select="@Data_Type" /&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Value = params.&lt;font color=#008000&gt;&amp;lt;xsl:value-of
select="@Parameter_Name" /&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ParameterName
= &lt;/font&gt;&lt;a href='mailto:"&lt;xsl:value-of select="@Parameter_Name'&gt;&lt;font color=#0000ff&gt;"&lt;/font&gt;&lt;font color=#008000&gt;&amp;lt;xsl:value-of
select="@Parameter_Name&lt;/font&gt;&lt;/a&gt;&lt;font color=#0000ff&gt;&lt;font color=#008000&gt;" /&amp;gt;&lt;/font&gt;"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exec.Parameters.Add(param)&lt;br&gt;
&amp;nbsp;&lt;/font&gt;&lt;font color=#008000&gt; &amp;lt;/xsl:template&amp;gt;&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;
And the text of the second template is as follows:
&lt;/p&gt;
&lt;pre&gt;&lt;font color=#008000&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br&gt;
&amp;lt;xsl:stylesheet xmlns:xsl="&lt;/font&gt;&lt;a href="http://www.w3.org/1999/XSL/Transform"&gt;&lt;font color=#008000&gt;http://www.w3.org/1999/XSL/Transform&lt;/font&gt;&lt;/a&gt;&lt;font color=#0000ff&gt;&lt;font color=#008000&gt;"
version="2.0"&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;xsl:output method="text" indent="yes" /&amp;gt;&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &amp;lt;xsl:template match="/"&amp;gt;&lt;/font&gt;
&lt;br&gt;
Imports System&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp; &amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:apply-templates
select="/database/procs" /&amp;gt; 
&lt;br&gt;
&amp;nbsp; &amp;lt;/xsl:template&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:template match="procs"&amp;gt;&lt;/font&gt;
&lt;br&gt;
' 
&lt;br&gt;
' Parameters for method: Execute&lt;font color=#008000&gt;&amp;lt;xsl:value-of select="@Specific_Name"
/&amp;gt;&lt;br&gt;
&lt;/font&gt;' 
&lt;br&gt;
Public Class &lt;font color=#008000&gt;&amp;lt;xsl:value-of select="@Specific_Name" /&amp;gt;&lt;/font&gt;Struct&lt;br&gt;
&lt;font color=#008000&gt;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:apply-templates select="params" /&amp;gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;
&lt;br&gt;
End Class&amp;nbsp;&lt;br&gt;
&amp;nbsp; &lt;font color=#008000&gt;&amp;lt;/xsl:template&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:template match="params"&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; Private _&lt;font color=#008000&gt;&amp;lt;xsl:value-of select="substring(@Parameter_Name,2,string-length(@Parameter_Name)-1)"
/&amp;gt;&lt;/font&gt; As Date&lt;br&gt;
&amp;nbsp;Public Property &lt;font color=#008000&gt;&amp;lt;xsl:value-of select="substring(@Parameter_Name,2,string-length(@Parameter_Name)-1)"
/&amp;gt;&lt;/font&gt;() _ &lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&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;&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;&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;As&amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:value-of
select="@Data_Type" /&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return _&lt;font color=#008000&gt;&amp;lt;xsl:value-of select="substring(@Parameter_Name,2,string-length(@Parameter_Name)-1)"
/&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Set(ByVal Value As &amp;lt;xsl:value-of select="@Data_Type" /&amp;gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _&lt;font color=#008000&gt;&amp;lt;xsl:value-of select="substring(@Parameter_Name,2,string-length(@Parameter_Name)-1)"
/&amp;gt;&lt;/font&gt; = Value&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Set&lt;br&gt;
&amp;nbsp;&amp;nbsp; End Property&lt;br&gt;
&amp;nbsp; &lt;/font&gt;&lt;font color=#008000&gt;&amp;lt;/xsl:template&amp;gt;&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;
To my eye, these look more like VB.NET source files than XSLT templates.&amp;nbsp; That's
because they started life as .vb files.&amp;nbsp; Then I renamed them .xslt and started
inserting the XSLT tags in places where I needed substitution from the XML source.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
To emphasise the hybrid-ness (is that a word) of these files, I have highlighted the
VB.NET parts &lt;strong&gt;&lt;font color=#0000ff&gt;blue&lt;/font&gt;&lt;/strong&gt; and the XSLT parts &lt;font color=#008000&gt;&lt;strong&gt;green&lt;/strong&gt;&lt;/font&gt;&lt;font color=#000000&gt;,
rather than keeping the VB.NET syntax highlighting.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Some breif thoughts:&amp;nbsp; 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
The value of this to my mind is in not having to hand code *every* one.&amp;nbsp; You
hand code one, then generate the rest - &lt;strong&gt;in theory this reduces the opertunity
for bugs &lt;/strong&gt;which should be the focus of the exercise.&amp;nbsp; 
&lt;li&gt;
Maybe this may find a home in a long-running project to have this as part of the build
process, or maybe as part of some tooling focused on small one-off 
&lt;li&gt;
This are commercial products that do code gen based on XSLT.&amp;nbsp; I haven't used
them, but they may well be better than my home-brew sample :-) 
&lt;li&gt;
Maybe useful for trainers, or producting samples for demos etc.&amp;nbsp; I'm thinking
now about times where there may be&amp;nbsp;a need to generate side-by-side VB.Net, C#
&amp;amp; Java&amp;nbsp;sample code for example. 
&lt;li&gt;
Also include comment blocks that are readable by NDoc!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;font color=#a9a9a9&gt;[edit: added line breaks for formatting.]&lt;/font&gt;
&lt;/p&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,2350bc86-c0c4-496a-b788-8159bbeade2d.aspx</comments>
      <category>Code Generation</category>
      <category>Continuous-Integration</category>
      <category>Geeking Out!</category>
      <category>XSLT</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=c826fb45-e770-4dd2-8bc6-8dd5c3c1c666</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,c826fb45-e770-4dd2-8bc6-8dd5c3c1c666.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,c826fb45-e770-4dd2-8bc6-8dd5c3c1c666.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=c826fb45-e770-4dd2-8bc6-8dd5c3c1c666</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
Looks like it's about time for another post!<br /><br />
This one is about the SQL Server system tables.  These are a fav of mine because
I find them so useful in scripts.  
<br /><br />
The caveats when dealing with them are you need to be mindful of SQL Server versions. 
Everything that worked on SQL Server 7.0 will work on SQL Server 2000, but there are
some minor tweaks in SQL Server 2000 that are not valid in SQL Server 7.0.  Now
is not a good time to mention SQL Server &lt;= v6.5 because the system tables had
an overhaul for 7.0, and I haven't checked any of this code on Yukkon/SQL Server 2005
yet.<br /><br />
My fav thing to use the tables for is dealing with object existance in scripts. 
In my books a good T-SQL script can be run over and over without damaging the database. 
Put another way, if your SQL Script throws an error if it is run twice against the
same database it's not a good T-SQL script.<br /><br />
Consider we are dealing with the following table:<br /><br /><font face="Courier New"><font color="#0000ff">CREATE TABLE</font> testing_data (<br />
    pkey <font color="#0000ff">INT </font>IDENTITY (1,1) <font color="#808080">NOT
NULL</font>, 
<br />
    created <font color="#0000ff">DATETIME</font><font color="#0000ff">DEFAULT </font><font color="#ff1493">getdate</font>() <font color="#808080">NOT
NULL</font>,<br />
    modified <font color="#0000ff">DATETIME</font><font color="#808080">NULL</font>,<br />
    deleted <font color="#0000ff">BIT </font>DEFAULT 0 <font color="#808080">NOT
NULL</font>, 
<br />
    testing_val_1 <font color="#0000ff">NVARCHAR</font>(15) <font color="#808080">NOT
NULL</font>, 
<br />
    testing_val_2 <font color="#0000ff">NVARCHAR</font>(255)<br />
)</font><br /><br />
For whatever reason we want to drop and recreate this table each run, you could put
the following statement before it:<br /><br /><font face="Courier New">IF <font color="#808080">Exists </font>(<font color="#0000ff">select </font>*
from dbo.<font color="#008000">sysobjects</font><font color="#0000ff">where id = </font>object_id(N<font color="#ff0000">'[dbo].[testing_data]'</font>) 
<br />
    <font color="#808080">AND</font><font color="#ff1493">OBJECTPROPERTY</font>(id,
N<font color="#ff0000">'IsUserTable'</font>) = 1)<br />
    <font color="#0000ff">DROP TABLE</font> testing_data<br />
GO<br /><font face="Arial"><br /><font face="Verdana" size="2">This is the syntax you will see if you choose to include
Drops in scripts you generate from the Enterprise Manager, but I don't use it much,
mainly because I can never remember the <font face="Courier New">OBJECTPROPERTY() </font>syntax!<br /><br />
Typically I do the following: 
<br /><br /><font face="Courier New">IF <font color="#808080">Exists</font>(<font color="#0000ff">SELECT </font>[id]
FROM <font color="#008000">sysobjects </font><br />
    <font color="#0000ff">WHERE </font><font color="#008000">sysobjects</font>.[name]
= N<font color="#ff0000">'testing_data'</font><br />
    <font color="#808080">AND </font><font color="#008000">sysobjects</font>.[type]
= N<font color="#ff0000">'U'</font>)<br />
    <font color="#0000ff">DROP TABLE</font> testing_data<br />
GO<br /><br />
I feel that Microsoft are hinting us towards using OBJECTPROPERTY() for future version
compatability, but I still favor this syntax because apart from being easy to remember
it's easy to adapt for other kinds of objects, e.g:<br /><br />
IF <font color="#808080">Exists</font>(<font color="#0000ff">SELECT </font>[id] <font color="#0000ff">FROM</font><font color="#008000">sysobjects </font><br />
        <font color="#0000ff">WHERE </font><font color="#008000">sysobjects</font>.[name]
= <font color="#ff0000">'prGetTestingDataRows'</font><br />
        <font color="#808080">AND </font><font color="#008000">sysobjects</font>.[type]
= <font color="#ff0000">'P'</font>)<br />
   <font color="#0000ff"> DROP PROC</font> prGetTestingDataRows<br />
GO<br /></font><br />
So if the <font face="Courier New">Type </font>column in sysobjects is 'U' for user
tables, and 'P' for procedures then there are no prizes for guessing what TR, D &amp;
V might mean.<br /><br /></font></font></font><font size="2"><font face="Verdana">For a more complex example,
lets say you want to change the type of the fileds testing_val_1 to <font face="Courier New">NVARCHAR(35)<font face="Verdana"><b>ONLY </b>if
it has not been changed before,</font></font> you could wrap the <font face="Courier New">ALTER
TABLE </font>stateement in the following <font face="Courier New">BEGIN... END:</font><br /><br /><font face="Courier New"><font color="#0000ff">IF </font><font color="#808080">Exists</font>(<font color="#0000ff">SELECT</font><font color="#008000">syscolumns</font>.[name] 
<br />
    <font color="#0000ff">FROM </font>syscolumns<br />
    <font color="#ff1493">LEFT </font><font color="#808080">JOIN </font>sysobjects 
<br />
        ON <font color="#008000">syscolumns.[</font>id]
= <font color="#008000">sysobjects</font>.[id]<br />
    <font color="#ff1493">LEFT</font><font color="#808080">JOIN </font><font color="#008000">systypes</font><br />
        ON <font color="#008000">syscolumns</font>.[xtype]
= <font color="#008000">systypes</font>.[xtype] 
<br />
    <font color="#0000ff">WHERE </font><font color="#008000">syscolumns</font>.[name]
= <font color="#ff0000">'testing_val_1'</font><br />
    <font color="#808080">AND </font><font color="#008000">systypes</font>.[name]
= <font color="#ff0000">'nvarchar'</font><br />
    <font color="#808080">AND </font><font color="#008000">sysobjects</font>.[name]
= <font color="#ff0000">'testing_data'</font>)<br /><font color="#0000ff">BEGIN</font><br />
    <font color="#0000ff">ALTER TABLE</font><font color="#008000">--
... Implementation ommited for clarity</font><br /><font style="COLOR: rgb(0,0,255)" color="#008000">END</font><br /><br /><span style="COLOR: rgb(0,0,0); FONT-FAMILY: verdana">So having only touched two or
three sys tables we have a couple of good tools that are easy to use.  I'll cover
more at a later date, in the mean time enjoy the extra metadata!<br /><br /><font style="FONT-WEIGHT: bold; COLOR: rgb(128,128,128)" size="1">After blog mint
[<a href="http://neopoleon.com/blog/posts/5981.aspx">?</a>]:<br /><br /></font><font style="COLOR: rgb(128,128,128)" size="1"><span style="COLOR: rgb(0,0,0)">Here's
an actual practical example from a script I have been working  on recently (user
name changed).  This script makes a dozen or so procs, the svcapp account is
a login used by a service that only has rights to exec these procs, and no rights
granted to the base tables.  This automates granting access to the created procs,
and it much quicker than doing it in the SQL EM:</span><br style="COLOR: rgb(0,0,0)" /><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">PRINT</span><span style="COLOR: rgb(255,0,0)"><span style="COLOR: rgb(0,0,255)"></span>'PART
4 - Granting access to user account'</span></span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">GO</span><br style="COLOR: rgb(0,0,0)" /><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">DECLARE </span>@sql <span style="COLOR: rgb(0,0,255)">NVARCHAR</span>(512)</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">DECLARE </span>@name <span style="COLOR: rgb(0,0,255)">NVARCHAR(</span>128)</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">DECLARE </span>@usernm <span style="COLOR: rgb(0,0,255)">NVARCHAR</span>(128)</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">DECLARE </span>cr <span style="COLOR: rgb(0,0,255)">CURSOR
FOR </span></span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    <span style="COLOR: rgb(0,0,255)">SELECT </span>[name] <span style="COLOR: rgb(0,0,255)">FROM</span><span style="COLOR: rgb(0,128,0)">sysobjects</span></span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    <span style="COLOR: rgb(0,0,255)">WHERE </span>type=<span style="COLOR: rgb(255,0,0)">'P</span>'</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    <span style="COLOR: rgb(0,0,255)">ORDER
BY</span> [name]</span><br style="COLOR: rgb(0,0,0)" /><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">SET </span>@usernm
= <span style="COLOR: rgb(255,0,0)">'svcapp'</span></span><br style="COLOR: rgb(0,0,0)" /><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">OPEN </span>cr</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">FETCH NEXT FROM </span>cr <span style="COLOR: rgb(0,0,255)">INTO</span> @name</span><br style="COLOR: rgb(0,0,0)" /><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">WHILE </span><span style="COLOR: rgb(255,20,147)">@@fetch_status </span>=
0 </span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,255)">BEGIN</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    <span style="COLOR: rgb(0,0,255)">SET </span>@sql
= <span style="COLOR: rgb(255,0,0)">'grant exec on '</span> + @name + <span style="COLOR: rgb(255,0,0)">'
to '</span> + @usernm</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    <span style="COLOR: rgb(0,0,255)">EXEC </span><span style="COLOR: rgb(165,42,42)">sp_executesql</span> @sql</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    <span style="COLOR: rgb(0,0,255)">PRINT </span><span style="COLOR: rgb(255,0,0)">'Granting
EXEC on '</span> + @name + <span style="COLOR: rgb(255,0,0)">' to user: '</span></span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">    <span style="COLOR: rgb(0,0,255)">FETCH
NEXT FROM</span> cr <span style="COLOR: rgb(0,0,255)">INTO </span>@name</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,255)">END</span><br style="COLOR: rgb(0,0,0)" /><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">CLOSE </span>cr</span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">DEALLOCATE </span>cr</span><br style="COLOR: rgb(0,0,0)" /><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">PRINT </span><span style="COLOR: rgb(255,0,0)">'Done.'</span></span><br style="COLOR: rgb(0,0,0)" /><span style="COLOR: rgb(0,0,0)">GO</span></font><font style="FONT-WEIGHT: bold; COLOR: rgb(128,128,128)" size="1"><br style="COLOR: rgb(0,0,0)" /></font><br /></span></font></font></font></body>
      <title>SQL Server system tables for better scripting</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,c826fb45-e770-4dd2-8bc6-8dd5c3c1c666.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,c826fb45-e770-4dd2-8bc6-8dd5c3c1c666.aspx</link>
      <pubDate>Thu, 06 Oct 2005 13:24:38 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
Looks like it's about time for another post!&lt;br&gt;
&lt;br&gt;
This one is about the SQL Server system tables.&amp;nbsp; These are a fav of mine because
I find them so useful in scripts.&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
The caveats when dealing with them are you need to be mindful of SQL Server versions.&amp;nbsp;
Everything that worked on SQL Server 7.0 will work on SQL Server 2000, but there are
some minor tweaks in SQL Server 2000 that are not valid in SQL Server 7.0.&amp;nbsp; Now
is not a good time to mention SQL Server &amp;lt;= v6.5 because the system tables had
an overhaul for 7.0, and I haven't checked any of this code on Yukkon/SQL Server 2005
yet.&lt;br&gt;
&lt;br&gt;
My fav thing to use the tables for is dealing with object existance in scripts.&amp;nbsp;
In my books a good T-SQL script can be run over and over without damaging the database.&amp;nbsp;
Put another way, if your SQL Script throws an error if it is run twice against the
same database it's not a good T-SQL script.&lt;br&gt;
&lt;br&gt;
Consider we are dealing with the following table:&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;CREATE TABLE&lt;/font&gt; testing_data (&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; pkey &lt;font color=#0000ff&gt;INT &lt;/font&gt;IDENTITY (1,1) &lt;font color=#808080&gt;NOT
NULL&lt;/font&gt;, 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; created &lt;font color=#0000ff&gt;DATETIME&lt;/font&gt; &lt;font color=#0000ff&gt;DEFAULT &lt;/font&gt;&lt;font color=#ff1493&gt;getdate&lt;/font&gt;() &lt;font color=#808080&gt;NOT
NULL&lt;/font&gt;,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; modified &lt;font color=#0000ff&gt;DATETIME&lt;/font&gt; &lt;font color=#808080&gt;NULL&lt;/font&gt;,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; deleted &lt;font color=#0000ff&gt;BIT &lt;/font&gt;DEFAULT 0 &lt;font color=#808080&gt;NOT
NULL&lt;/font&gt;, 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; testing_val_1 &lt;font color=#0000ff&gt;NVARCHAR&lt;/font&gt;(15) &lt;font color=#808080&gt;NOT
NULL&lt;/font&gt;, 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; testing_val_2 &lt;font color=#0000ff&gt;NVARCHAR&lt;/font&gt;(255)&lt;br&gt;
)&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
For whatever reason we want to drop and recreate this table each run, you could put
the following statement before it:&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;IF &lt;font color=#808080&gt;Exists &lt;/font&gt;(&lt;font color=#0000ff&gt;select &lt;/font&gt;*
from dbo.&lt;font color=#008000&gt;sysobjects&lt;/font&gt; &lt;font color=#0000ff&gt;where id = &lt;/font&gt;object_id(N&lt;font color=#ff0000&gt;'[dbo].[testing_data]'&lt;/font&gt;) 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#808080&gt;AND&lt;/font&gt; &lt;font color=#ff1493&gt;OBJECTPROPERTY&lt;/font&gt;(id,
N&lt;font color=#ff0000&gt;'IsUserTable'&lt;/font&gt;) = 1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;DROP TABLE&lt;/font&gt; testing_data&lt;br&gt;
GO&lt;br&gt;
&lt;font face=Arial&gt;
&lt;br&gt;
&lt;font face=Verdana size=2&gt;This is the syntax you will see if you choose to include
Drops in scripts you generate from the Enterprise Manager, but I don't use it much,
mainly because I can never remember the &lt;font face="Courier New"&gt;OBJECTPROPERTY() &lt;/font&gt;syntax!&lt;br&gt;
&lt;br&gt;
Typically I do the following: 
&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;IF &lt;font color=#808080&gt;Exists&lt;/font&gt;(&lt;font color=#0000ff&gt;SELECT &lt;/font&gt;[id]
FROM &lt;font color=#008000&gt;sysobjects &lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;WHERE &lt;/font&gt;&lt;font color=#008000&gt;sysobjects&lt;/font&gt;.[name]
= N&lt;font color=#ff0000&gt;'testing_data'&lt;/font&gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#808080&gt;AND &lt;/font&gt;&lt;font color=#008000&gt;sysobjects&lt;/font&gt;.[type]
= N&lt;font color=#ff0000&gt;'U'&lt;/font&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;DROP TABLE&lt;/font&gt; testing_data&lt;br&gt;
GO&lt;br&gt;
&lt;br&gt;
I feel that Microsoft are hinting us towards using OBJECTPROPERTY() for future version
compatability, but I still favor this syntax because apart from being easy to remember
it's easy to adapt for other kinds of objects, e.g:&lt;br&gt;
&lt;br&gt;
IF &lt;font color=#808080&gt;Exists&lt;/font&gt;(&lt;font color=#0000ff&gt;SELECT &lt;/font&gt;[id] &lt;font color=#0000ff&gt;FROM&lt;/font&gt; &lt;font color=#008000&gt;sysobjects &lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;WHERE &lt;/font&gt;&lt;font color=#008000&gt;sysobjects&lt;/font&gt;.[name]
= &lt;font color=#ff0000&gt;'prGetTestingDataRows'&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#808080&gt;AND &lt;/font&gt;&lt;font color=#008000&gt;sysobjects&lt;/font&gt;.[type]
= &lt;font color=#ff0000&gt;'P'&lt;/font&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#0000ff&gt; DROP PROC&lt;/font&gt; prGetTestingDataRows&lt;br&gt;
GO&lt;br&gt;
&lt;/font&gt;
&lt;br&gt;
So if the &lt;font face="Courier New"&gt;Type &lt;/font&gt;column in sysobjects is 'U' for user
tables, and 'P' for procedures then there are no prizes for guessing what TR, D &amp;amp;
V might mean.&lt;br&gt;
&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size=2&gt;&lt;font face=Verdana&gt;For a more complex example, lets
say you want to change the type of the fileds testing_val_1 to &lt;font face="Courier New"&gt;NVARCHAR(35)&lt;font face=Verdana&gt; &lt;b&gt;ONLY &lt;/b&gt;if
it has not been changed before,&lt;/font&gt;&lt;/font&gt; you could wrap the &lt;font face="Courier New"&gt;ALTER
TABLE &lt;/font&gt;stateement in the following &lt;font face="Courier New"&gt;BEGIN... END:&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;IF &lt;/font&gt;&lt;font color=#808080&gt;Exists&lt;/font&gt;(&lt;font color=#0000ff&gt;SELECT&lt;/font&gt; &lt;font color=#008000&gt;syscolumns&lt;/font&gt;.[name] 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;FROM &lt;/font&gt;syscolumns&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#ff1493&gt;LEFT &lt;/font&gt;&lt;font color=#808080&gt;JOIN &lt;/font&gt;sysobjects 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ON &lt;font color=#008000&gt;syscolumns.[&lt;/font&gt;id]
= &lt;font color=#008000&gt;sysobjects&lt;/font&gt;.[id]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#ff1493&gt;LEFT&lt;/font&gt; &lt;font color=#808080&gt;JOIN &lt;/font&gt;&lt;font color=#008000&gt;systypes&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ON &lt;font color=#008000&gt;syscolumns&lt;/font&gt;.[xtype]
= &lt;font color=#008000&gt;systypes&lt;/font&gt;.[xtype] 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;WHERE &lt;/font&gt;&lt;font color=#008000&gt;syscolumns&lt;/font&gt;.[name]
= &lt;font color=#ff0000&gt;'testing_val_1'&lt;/font&gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#808080&gt;AND &lt;/font&gt;&lt;font color=#008000&gt;systypes&lt;/font&gt;.[name]
= &lt;font color=#ff0000&gt;'nvarchar'&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#808080&gt;AND &lt;/font&gt;&lt;font color=#008000&gt;sysobjects&lt;/font&gt;.[name]
= &lt;font color=#ff0000&gt;'testing_data'&lt;/font&gt;)&lt;br&gt;
&lt;font color=#0000ff&gt;BEGIN&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;ALTER TABLE&lt;/font&gt; &lt;font color=#008000&gt;-- ...
Implementation ommited for clarity&lt;/font&gt;
&lt;br&gt;
&lt;font style="COLOR: rgb(0,0,255)" color=#008000&gt;END&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: rgb(0,0,0); FONT-FAMILY: verdana"&gt;So having only touched two or
three sys tables we have a couple of good tools that are easy to use.&amp;nbsp; I'll cover
more at a later date, in the mean time enjoy the extra metadata!&lt;br&gt;
&lt;br&gt;
&lt;font style="FONT-WEIGHT: bold; COLOR: rgb(128,128,128)" size=1&gt;After blog mint [&lt;a href="http://neopoleon.com/blog/posts/5981.aspx"&gt;?&lt;/a&gt;]:&lt;br&gt;
&lt;br&gt;
&lt;/font&gt;&lt;font style="COLOR: rgb(128,128,128)" size=1&gt;&lt;span style="COLOR: rgb(0,0,0)"&gt;Here's
an actual practical example from a script I have been working&amp;nbsp; on recently (user
name changed).&amp;nbsp; This script makes a dozen or so procs, the svcapp account is
a login used by a service that only has rights to exec these procs, and no rights
granted to the base tables.&amp;nbsp; This automates granting access to the created procs,
and it much quicker than doing it in the SQL EM:&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&lt;span style="COLOR: rgb(0,0,255)"&gt;PRINT&lt;/span&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;&lt;span style="COLOR: rgb(0,0,255)"&gt; &lt;/span&gt;'PART
4 - Granting access to user account'&lt;/span&gt;&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;GO&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&lt;span style="COLOR: rgb(0,0,255)"&gt;DECLARE &lt;/span&gt;@sql &lt;span style="COLOR: rgb(0,0,255)"&gt;NVARCHAR&lt;/span&gt;(512)&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&lt;span style="COLOR: rgb(0,0,255)"&gt;DECLARE &lt;/span&gt;@name &lt;span style="COLOR: rgb(0,0,255)"&gt;NVARCHAR(&lt;/span&gt;128)&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&lt;span style="COLOR: rgb(0,0,255)"&gt;DECLARE &lt;/span&gt;@usernm &lt;span style="COLOR: rgb(0,0,255)"&gt;NVARCHAR&lt;/span&gt;(128)&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&lt;span style="COLOR: rgb(0,0,255)"&gt;DECLARE &lt;/span&gt;cr &lt;span style="COLOR: rgb(0,0,255)"&gt;CURSOR
FOR &lt;/span&gt;&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: rgb(0,0,255)"&gt;SELECT &lt;/span&gt;[name] &lt;span style="COLOR: rgb(0,0,255)"&gt;FROM&lt;/span&gt; &lt;span style="COLOR: rgb(0,128,0)"&gt;sysobjects&lt;/span&gt;&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: rgb(0,0,255)"&gt;WHERE &lt;/span&gt;type=&lt;span style="COLOR: rgb(255,0,0)"&gt;'P&lt;/span&gt;'&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: rgb(0,0,255)"&gt;ORDER
BY&lt;/span&gt; [name]&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&lt;span style="COLOR: rgb(0,0,255)"&gt;SET &lt;/span&gt;@usernm
= &lt;span style="COLOR: rgb(255,0,0)"&gt;'svcapp'&lt;/span&gt;&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&lt;span style="COLOR: rgb(0,0,255)"&gt;OPEN &lt;/span&gt;cr&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&lt;span style="COLOR: rgb(0,0,255)"&gt;FETCH NEXT FROM &lt;/span&gt;cr &lt;span style="COLOR: rgb(0,0,255)"&gt;INTO&lt;/span&gt; @name&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&lt;span style="COLOR: rgb(0,0,255)"&gt;WHILE &lt;/span&gt;&lt;span style="COLOR: rgb(255,20,147)"&gt;@@fetch_status &lt;/span&gt;=
0 &lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,255)"&gt;BEGIN&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: rgb(0,0,255)"&gt;SET &lt;/span&gt;@sql
= &lt;span style="COLOR: rgb(255,0,0)"&gt;'grant exec on '&lt;/span&gt; + @name + &lt;span style="COLOR: rgb(255,0,0)"&gt;'
to '&lt;/span&gt; + @usernm&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: rgb(0,0,255)"&gt;EXEC &lt;/span&gt;&lt;span style="COLOR: rgb(165,42,42)"&gt;sp_executesql&lt;/span&gt; @sql&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: rgb(0,0,255)"&gt;PRINT &lt;/span&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;'Granting
EXEC on '&lt;/span&gt; + @name + &lt;span style="COLOR: rgb(255,0,0)"&gt;' to user: '&lt;/span&gt; &lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: rgb(0,0,255)"&gt;FETCH
NEXT FROM&lt;/span&gt; cr &lt;span style="COLOR: rgb(0,0,255)"&gt;INTO &lt;/span&gt;@name&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,255)"&gt;END&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&lt;span style="COLOR: rgb(0,0,255)"&gt;CLOSE &lt;/span&gt;cr&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&lt;span style="COLOR: rgb(0,0,255)"&gt;DEALLOCATE &lt;/span&gt;cr&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;&lt;span style="COLOR: rgb(0,0,255)"&gt;PRINT &lt;/span&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;'Done.'&lt;/span&gt;&lt;/span&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;span style="COLOR: rgb(0,0,0)"&gt;GO&lt;/span&gt;&lt;/font&gt;&lt;font style="FONT-WEIGHT: bold; COLOR: rgb(128,128,128)" size=1&gt;
&lt;br style="COLOR: rgb(0,0,0)"&gt;
&lt;/font&gt;
&lt;br&gt;
&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,c826fb45-e770-4dd2-8bc6-8dd5c3c1c666.aspx</comments>
      <category>Code Generation</category>
      <category>Geeking Out!</category>
    </item>
  </channel>
</rss>