<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mark Tremaine</title>
	<atom:link href="http://mark.tremaine.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://mark.tremaine.net</link>
	<description>programmer extraordinaire</description>
	<lastBuildDate>Thu, 17 Dec 2009 12:54:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Continuous Integration</title>
		<link>http://mark.tremaine.net/whitepaper/continuous-integration/</link>
		<comments>http://mark.tremaine.net/whitepaper/continuous-integration/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 12:49:00 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[whitepaper]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[CruiseControl.Net]]></category>
		<category><![CDATA[NAnt]]></category>
		<category><![CDATA[NUnit]]></category>
		<category><![CDATA[SVN]]></category>

		<guid isPermaLink="false">http://mark.tremaine.net/whitepaper/continuous-integration/</guid>
		<description><![CDATA[1. Summary An important part of any software development process is getting reliable builds of the software. Despite its importance, we are often surprised when this isn&#8217;t done. (Fowler, 2006) Continuous Integration (CI) is the strategy and practice of making sure that changes to a software project’s code base are successfully built, tested, reported on, [...]]]></description>
			<content:encoded><![CDATA[<h1>1. Summary</h1>
<p><font color="#808080"><strong><em>An important part of any software development process is getting reliable builds of the software. Despite its importance, we are often surprised when this isn&#8217;t done.</em></strong></font> <a href="#AdditionalResources">(Fowler, 2006)</a></p>
<p>Continuous Integration (CI) is the strategy and practice of making sure that changes to a software project’s code base are successfully built, tested, reported on, and rapidly made available to all parties after they are introduced.</p>
<h1>2. Business Challenge</h1>
<p>The current build process is immature. It is limited to only the code base; requires many manual steps; lacks structured testing; lacks status broadcasting; and introduces more complexities for projects with more than one developer. Ideally, the build process would include not only the code base but anything necessary to deploy to a clean machine; include both unit testing and integration testing; provide status updates to members of the project team; be the same process for all developers regardless of team size; and perform the majority of operations automatically.</p>
<h1>3. Solution Description</h1>
<p><strong><em><font color="#808080">Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily &#8211; leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly.</font></em></strong> <a href="#AdditionalResources">(Fowler, 2006)</a></p>
<p>The key practices that make up an effective Continuous Integration (CI) are the following:</p>
<ol>
<li><b>Source Repository (<a href="http://subversion.tigris.org/">SVN</a>)</b>: There should be a mainline, a single branch of the project as it is being developed; alternate branches should be kept to a minimum (production bug fixes or temporary experimentation); Everything needed to build the project on a clean machine should be included (i.e. test scripts, install scripts, third party libraries, etc.) and any other useful files (i.e. IDE configurations) can optionally be included. </li>
<li><b>Build Automation (<a href="http://nant.sourceforge.net/">NAnt</a>)</b>: Everything necessary to bring in a clean machine, check the source out of the repository, issue a single command, and have a running system on the machine. </li>
<li><b>Test Automation (<a href="http://www.nunit.org/index.php">NUnit</a> / <a href="http://msdn.microsoft.com/en-us/library/bb385902.aspx">VS2008 Test Projects</a>)</b>: Run all unit tests; Run all functional / integration tests. The tests should be automated so that a single command executes them, and each must report the results of the test. </li>
<li><b>Mainline Committal</b>: CI is primarily about communication, allowing developers to tell other developers about the changes they have made. Frequent communication allows people to know quickly as changes develop. So, at a minimum, developers should commit to the mainline once every day. The more frequent the integration the sooner a conflict can be detected. The key to fixing problems quickly is finding them quickly and at a point that not much has happened, therefore they are easy to resolve. </li>
<li><b>Continuous Integration Server (<a href="http://confluence.public.thoughtworks.org/display/CCNET">CruiseControl.Net</a>)</b>: A CI server monitors the repository. Each committal initiates the CI server to automatically check out the source, build, test, and notify the committer of the results. The committer isn&#8217;t done until notification is received. </li>
<li><b>Build Time</b>: The whole point of CI is to provide rapid feedback. A ten minute build is perfectly within reason. For builds that take more than 10 minutes investigate implementing a staged build (a.k.a. a build pipeline). </li>
<li><b>Production Environment</b>: The point of testing is to flush out, under controlled conditions, any problem that the system will have in production. A significant part of this is the environment within which the production system will run. If you test in a different environment, every difference results in a risk that what happens under test won&#8217;t happen in production. As a result, you want to set up your test environment to be as exact a mimic of your production environment as possible. </li>
<li><b>The Latest and Greatest</b>: The resulting code should be available for anyone involved for demonstrations, exploratory testing, or just to see what changed. It&#8217;s very hard to specify what you want in advance and be correct; it’s much easier to see something that&#8217;s not quite right and say how it needs to be changed. </li>
<li><b>Information Dissemination</b>: CI is all about communication, so you want to ensure that everyone can easily see the state of the system, how long it&#8217;s been in that state and the changes that have been made to it. </li>
<li><b>Deployment Automation</b>: Although this is merely just the aforementioned steps executing on the desired application server, this is a crucial process, as it eliminates potential human error and, almost as important, provides the ability to perform automated rollbacks. </li>
</ol>
<h1>4. Benefits</h1>
<ol>
<li><b>Reduced Risk</b>: By integrating many times a day, you can reduce risks on your project. Doing so facilitates the detection of defects, the measurement of software health, and a reduction of assumptions. </li>
<li><b>Increased Productivity</b>: Often, it takes more time to locate a bug then it does to correct it and the more bugs there are, the more difficult it is to remove each one, due to bug interactions. With CI, the vast majority of integration bugs are known as the build is created; more importantly, the offending code (at least ½ of it) is identified. This dramatically reduces the scope of the search for the bug. Furthermore, as bugs are identified and corrected on a continuous basis, there are fewer bugs in the development process which may impede developers working on other sections of code. </li>
<li><b>Increased Portability</b>: CI can enable you to release deployable software at any point in time. </li>
<li><b>Improved Product Timeline</b>: With developers spending more time on coding and less time on investigation, manual testing and building releases combined with the knowledge of which sections of code contain bugs and how many bugs in each, adhering to the project timeline is more easily attainable. Additionally, if adjustments are necessary to the timeline, more information is available to assist with the forecasting. </li>
<li><b>Increase in Customer Confidence / IT Reputation</b>: With most integration bugs identified, it becomes a decision rather than a mistake to release code with known bugs, resulting in fewer bugs being deployed to production and a more stable product. </li>
</ol>
<h1>5. Technical Specifications</h1>
<p>A server environment separate from that of the one housing the application is necessary for the various automation tasks.</p>
<h1>6. Target Market</h1>
<p>Anyone involved with any application implementing CI, including, but not limited to, developers, business analysts, project managers and customers. </p>
<h1>7. Case Studies</h1>
<h1>8. Additional Resources</h1>
<ol>
<li>(Fowler, 2006): Fowler, M. (2006, 05 01). <i>Continuous Integration</i>. Retrieved 12 14, 2009, from <a href="http://martinfowler.com/articles/continuousIntegration.html">http://martinfowler.com/articles/continuousIntegration.html</a> </li>
<li>SVN: <a href="http://subversion.tigris.org/">http://subversion.tigris.org/</a> </li>
<li>NAnt: <a href="http://nant.sourceforge.net/">http://nant.sourceforge.net/</a> </li>
<li>NUnit: <a href="http://www.nunit.org/index.php">http://www.nunit.org/index.php</a> </li>
<li>VS2008 Test Projects: <a href="http://msdn.microsoft.com/en-us/library/bb385902.aspx">http://msdn.microsoft.com/en-us/library/bb385902.aspx</a> </li>
<li>CruiseControl.Net: <a href="http://confluence.public.thoughtworks.org/display/CCNET">http://confluence.public.thoughtworks.org/display/CCNET</a> </li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://mark.tremaine.net/whitepaper/continuous-integration/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WCF Tutorial</title>
		<link>http://mark.tremaine.net/howto/wcf-tutorial/</link>
		<comments>http://mark.tremaine.net/howto/wcf-tutorial/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 15:09:58 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Decorator Pattern]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Repository Pattern]]></category>
		<category><![CDATA[Service Layers]]></category>
		<category><![CDATA[SRP]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://mark.tremaine.net/howto/wcf-tutorial/</guid>
		<description><![CDATA[The following is a relatively simple address lookup service that illustrates how to create a loosely coupled WCF service with commonly accepted best practices: SRP; Repository Pattern; Service Layers; and Dependency Injection. The first step is to identify the data that will need to be exchanged by the service.&#160; Often, it will be necessary / [...]]]></description>
			<content:encoded><![CDATA[<p>The following is a relatively simple address lookup service that illustrates how to create a loosely coupled WCF service with commonly accepted best practices: <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle" target="_blank">SRP</a>; <a href="http://martinfowler.com/eaaCatalog/repository.html" target="_blank">Repository Pattern</a>; <a href="http://martinfowler.com/eaaCatalog/serviceLayer.html" target="_blank">Service Layers</a>; and <a href="http://martinfowler.com/articles/injection.html#FormsOfDependencyInjection" target="_blank">Dependency Injection</a>.</p>
<p>The first step is to identify the data that will need to be exchanged by the service.&#160; Often, it will be necessary / desired to utilize objects for this data exchange.&#160; This is accomplished through the use of <a href="http://msdn.microsoft.com/en-us/library/ms733127.aspx" target="_blank">Data Contracts</a>.&#160; Here is a sample Data Contact that one might have for an address lookup service:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>&lt;DataContract()&gt; _</pre>
<pre><span class="lnum">   2:  </span><span class="kwrd">Public</span> <span class="kwrd">Class</span> Address</pre>
<pre class="alt"><span class="lnum">   3:  </span>&#160;</pre>
<pre><span class="lnum">   4:  </span>    <span class="kwrd">Private</span> _address <span class="kwrd">As</span> <span class="kwrd">String</span></pre>
<pre class="alt"><span class="lnum">   5:  </span>    <span class="kwrd">Private</span> _city <span class="kwrd">As</span> <span class="kwrd">String</span></pre>
<pre><span class="lnum">   6:  </span>    <span class="kwrd">Private</span> _state <span class="kwrd">As</span> <span class="kwrd">String</span></pre>
<pre class="alt"><span class="lnum">   7:  </span>    <span class="kwrd">Private</span> _zip <span class="kwrd">As</span> <span class="kwrd">String</span></pre>
<pre><span class="lnum">   8:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">   9:  </span>    &lt;DataMember()&gt; _</pre>
<pre><span class="lnum">  10:  </span>    <span class="kwrd">Public</span> <span class="kwrd">Property</span> Address() <span class="kwrd">As</span> <span class="kwrd">String</span></pre>
<pre class="alt"><span class="lnum">  11:  </span>        <span class="kwrd">Get</span></pre>
<pre><span class="lnum">  12:  </span>            <span class="kwrd">Return</span> _address</pre>
<pre class="alt"><span class="lnum">  13:  </span>        <span class="kwrd">End</span> <span class="kwrd">Get</span></pre>
<pre><span class="lnum">  14:  </span>        <span class="kwrd">Set</span>(<span class="kwrd">ByVal</span> varAddress <span class="kwrd">As</span> <span class="kwrd">String</span>)</pre>
<pre class="alt"><span class="lnum">  15:  </span>            _address = varAddress</pre>
<pre><span class="lnum">  16:  </span>        <span class="kwrd">End</span> <span class="kwrd">Set</span></pre>
<pre class="alt"><span class="lnum">  17:  </span>    <span class="kwrd">End</span> <span class="kwrd">Property</span></pre>
<pre><span class="lnum">  18:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  19:  </span>    &lt;DataMember()&gt; _</pre>
<pre><span class="lnum">  20:  </span>    <span class="kwrd">Public</span> <span class="kwrd">Property</span> City() <span class="kwrd">As</span> <span class="kwrd">String</span></pre>
<pre class="alt"><span class="lnum">  21:  </span>        <span class="kwrd">Get</span></pre>
<pre><span class="lnum">  22:  </span>            <span class="kwrd">Return</span> _city</pre>
<pre class="alt"><span class="lnum">  23:  </span>        <span class="kwrd">End</span> <span class="kwrd">Get</span></pre>
<pre><span class="lnum">  24:  </span>        <span class="kwrd">Set</span>(<span class="kwrd">ByVal</span> varCity <span class="kwrd">As</span> <span class="kwrd">String</span>)</pre>
<pre class="alt"><span class="lnum">  25:  </span>            _city = varCity</pre>
<pre><span class="lnum">  26:  </span>        <span class="kwrd">End</span> <span class="kwrd">Set</span></pre>
<pre class="alt"><span class="lnum">  27:  </span>    <span class="kwrd">End</span> <span class="kwrd">Property</span></pre>
<pre><span class="lnum">  28:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  29:  </span>    &lt;DataMember()&gt; _</pre>
<pre><span class="lnum">  30:  </span>    <span class="kwrd">Public</span> <span class="kwrd">Property</span> State() <span class="kwrd">As</span> <span class="kwrd">String</span></pre>
<pre class="alt"><span class="lnum">  31:  </span>        <span class="kwrd">Get</span></pre>
<pre><span class="lnum">  32:  </span>            <span class="kwrd">Return</span> _state</pre>
<pre class="alt"><span class="lnum">  33:  </span>        <span class="kwrd">End</span> <span class="kwrd">Get</span></pre>
<pre><span class="lnum">  34:  </span>        <span class="kwrd">Set</span>(<span class="kwrd">ByVal</span> varState <span class="kwrd">As</span> <span class="kwrd">String</span>)</pre>
<pre class="alt"><span class="lnum">  35:  </span>            _state = varState</pre>
<pre><span class="lnum">  36:  </span>        <span class="kwrd">End</span> <span class="kwrd">Set</span></pre>
<pre class="alt"><span class="lnum">  37:  </span>    <span class="kwrd">End</span> <span class="kwrd">Property</span></pre>
<pre><span class="lnum">  38:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  39:  </span>    &lt;DataMember()&gt; _</pre>
<pre><span class="lnum">  40:  </span>    <span class="kwrd">Public</span> <span class="kwrd">Property</span> Zip() <span class="kwrd">As</span> <span class="kwrd">String</span></pre>
<pre class="alt"><span class="lnum">  41:  </span>        <span class="kwrd">Get</span></pre>
<pre><span class="lnum">  42:  </span>            <span class="kwrd">Return</span> _zip</pre>
<pre class="alt"><span class="lnum">  43:  </span>        <span class="kwrd">End</span> <span class="kwrd">Get</span></pre>
<pre><span class="lnum">  44:  </span>        <span class="kwrd">Set</span>(<span class="kwrd">ByVal</span> varZip <span class="kwrd">As</span> <span class="kwrd">String</span>)</pre>
<pre class="alt"><span class="lnum">  45:  </span>            _zip = varZip</pre>
<pre><span class="lnum">  46:  </span>        <span class="kwrd">End</span> <span class="kwrd">Set</span></pre>
<pre class="alt"><span class="lnum">  47:  </span>    <span class="kwrd">End</span> <span class="kwrd">Property</span></pre>
<pre><span class="lnum">  48:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  49:  </span><span class="kwrd">End</span> Class</pre>
</div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Now that our data contracts are defined we need to create our Repository interface:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">Public</span> <span class="kwrd">Interface</span> IAddressRepository</pre>
<pre><span class="lnum">   2:  </span>    <span class="kwrd">Function</span> ListAddresses(<span class="kwrd">ByVal</span> varAddress <span class="kwrd">As</span> <span class="kwrd">String</span>) <span class="kwrd">As</span> List(Of Address)</pre>
<pre class="alt"><span class="lnum">   3:  </span><span class="kwrd">End</span> Interface</pre>
</div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>and our Repository concrete class:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">Imports</span> System.Data.SqlClient</pre>
<pre><span class="lnum">   2:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">   3:  </span><span class="kwrd">Public</span> <span class="kwrd">Class</span> AddressRepository_DataServices</pre>
<pre><span class="lnum">   4:  </span>    <span class="kwrd">Implements</span> IAddressRepository</pre>
<pre class="alt"><span class="lnum">   5:  </span>&#160;</pre>
<pre><span class="lnum">   6:  </span>    <span class="kwrd">Public</span> <span class="kwrd">Function</span> ListAddresses(<span class="kwrd">ByVal</span> varAddress <span class="kwrd">As</span> <span class="kwrd">String</span>) _</pre>
<pre class="alt"><span class="lnum">   7:  </span>                <span class="kwrd">As</span> List(Of Address) _</pre>
<pre><span class="lnum">   8:  </span>                <span class="kwrd">Implements</span> IAddressRepository.ListAddresses</pre>
<pre class="alt"><span class="lnum">   9:  </span>        <span class="kwrd">Dim</span> _address <span class="kwrd">As</span> Address</pre>
<pre><span class="lnum">  10:  </span>        <span class="kwrd">Dim</span> _addressList <span class="kwrd">As</span> List(Of Address) = <span class="kwrd">New</span> List(Of Address)</pre>
<pre class="alt"><span class="lnum">  11:  </span>        <span class="kwrd">Dim</span> _commandText <span class="kwrd">As</span> <span class="kwrd">String</span></pre>
<pre><span class="lnum">  12:  </span>        <span class="kwrd">Dim</span> _connectionString <span class="kwrd">As</span> <span class="kwrd">String</span> = <span class="str">&quot;$SOME_CONNECTION_STRING$&quot;</span></pre>
<pre class="alt"><span class="lnum">  13:  </span>        <span class="kwrd">Dim</span> _sqlCommand <span class="kwrd">As</span> SqlCommand</pre>
<pre><span class="lnum">  14:  </span>        <span class="kwrd">Dim</span> _sqlDataReader <span class="kwrd">As</span> SqlDataReader</pre>
<pre class="alt"><span class="lnum">  15:  </span>&#160;</pre>
<pre><span class="lnum">  16:  </span>        Using _sqlConnection <span class="kwrd">As</span> <span class="kwrd">New</span> SqlConnection(_connectionString)</pre>
<pre class="alt"><span class="lnum">  17:  </span>            _sqlCommand = <span class="kwrd">New</span> SqlCommand()</pre>
<pre><span class="lnum">  18:  </span>            _commandText = <span class="str">&quot;USP_ADDRESS_SELECT&quot;</span></pre>
<pre class="alt"><span class="lnum">  19:  </span>            <span class="kwrd">With</span> _sqlCommand</pre>
<pre><span class="lnum">  20:  </span>                .Connection = _sqlConnection</pre>
<pre class="alt"><span class="lnum">  21:  </span>                .Parameters.AddWithValue(<span class="str">&quot;@ADDRESS&quot;</span>, varAddress)</pre>
<pre><span class="lnum">  22:  </span>                .CommandText = _commandText</pre>
<pre class="alt"><span class="lnum">  23:  </span>                .CommandType = CommandType.StoredProcedure</pre>
<pre><span class="lnum">  24:  </span>            <span class="kwrd">End</span> <span class="kwrd">With</span></pre>
<pre class="alt"><span class="lnum">  25:  </span>            _sqlConnection.Open()</pre>
<pre><span class="lnum">  26:  </span>            _sqlDataReader = _sqlCommand.ExecuteReader()</pre>
<pre class="alt"><span class="lnum">  27:  </span>            <span class="kwrd">If</span> _sqlDataReader.HasRows <span class="kwrd">Then</span></pre>
<pre><span class="lnum">  28:  </span>                <span class="kwrd">Do</span> <span class="kwrd">While</span> _sqlDataReader.Read()</pre>
<pre class="alt"><span class="lnum">  29:  </span>                    _address = <span class="kwrd">New</span> Address()</pre>
<pre><span class="lnum">  30:  </span>                    <span class="kwrd">With</span> _address</pre>
<pre class="alt"><span class="lnum">  31:  </span>                        .Address = _sqlDataReader(<span class="str">&quot;ADDRESS&quot;</span>).ToString()</pre>
<pre><span class="lnum">  32:  </span>                        .City = _sqlDataReader(<span class="str">&quot;CITY&quot;</span>).ToString()</pre>
<pre class="alt"><span class="lnum">  33:  </span>                        .State = _sqlDataReader(<span class="str">&quot;STATE&quot;</span>).ToString()</pre>
<pre><span class="lnum">  34:  </span>                        .Zip = _sqlDataReader(<span class="str">&quot;ZIP&quot;</span>).ToString()</pre>
<pre class="alt"><span class="lnum">  35:  </span>                    <span class="kwrd">End</span> <span class="kwrd">With</span></pre>
<pre><span class="lnum">  36:  </span>                    _addressList.Add(_address)</pre>
<pre class="alt"><span class="lnum">  37:  </span>                <span class="kwrd">Loop</span></pre>
<pre><span class="lnum">  38:  </span>            <span class="kwrd">End</span> <span class="kwrd">If</span></pre>
<pre class="alt"><span class="lnum">  39:  </span>        <span class="kwrd">End</span> Using</pre>
<pre><span class="lnum">  40:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  41:  </span>        <span class="kwrd">Return</span> _addressList</pre>
<pre><span class="lnum">  42:  </span>    <span class="kwrd">End</span> <span class="kwrd">Function</span></pre>
<pre class="alt"><span class="lnum">  43:  </span>&#160;</pre>
<pre><span class="lnum">  44:  </span><span class="kwrd">End</span> <span class="kwrd">Class</span></pre>
</div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p><p>This example is relatively simple and as such only has one interface and corresponding concrete class.&#160; Since the Repository is to handle any and all data requests, a typically Repository would have many more. However, as this Repository is complete, we can move on to creating our Service Layer; which will contain all of our business logic.&#160; Again we create both an interface:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">Public</span> <span class="kwrd">Interface</span> IAddressServiceLibrary</pre>
<pre><span class="lnum">   2:  </span>    <span class="kwrd">Function</span> Search(<span class="kwrd">ByVal</span> varAddress <span class="kwrd">As</span> <span class="kwrd">String</span>) <span class="kwrd">As</span> List(Of Address)</pre>
<pre class="alt"><span class="lnum">   3:  </span><span class="kwrd">End</span> Interface</pre>
</p></div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>and concrete class:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">Public</span> <span class="kwrd">Class</span> AddressServiceLibrary</pre>
<pre><span class="lnum">   2:  </span>    <span class="kwrd">Implements</span> IAddressServiceLibrary</pre>
<pre class="alt"><span class="lnum">   3:  </span>&#160;</pre>
<pre><span class="lnum">   4:  </span>    <span class="kwrd">Private</span> _addressRepository <span class="kwrd">As</span> IAddressRepository = <span class="kwrd">New</span> AddressRepository_DataServices()</pre>
<pre class="alt"><span class="lnum">   5:  </span>&#160;</pre>
<pre><span class="lnum">   6:  </span>    <span class="kwrd">Public</span> <span class="kwrd">Function</span> Search(<span class="kwrd">ByVal</span> varAddress <span class="kwrd">As</span> <span class="kwrd">String</span>) <span class="kwrd">As</span> List(Of Address) <span class="kwrd">Implements</span> IAddressServiceLibrary.Search</pre>
<pre class="alt"><span class="lnum">   7:  </span>        <span class="kwrd">Return</span> _addressRepository.ListAddresses(varAddress)</pre>
<pre><span class="lnum">   8:  </span>    <span class="kwrd">End</span> <span class="kwrd">Function</span></pre>
<pre class="alt"><span class="lnum">   9:  </span>&#160;</pre>
<pre><span class="lnum">  10:  </span><span class="kwrd">End</span> Class</pre>
</p></div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>With the business logic taken care of it is time to create our WCF service, consisting of a Service Contract and one or more Operation Contracts.&#160; Once again we create an interface:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>&lt;ServiceContract()&gt; _</pre>
<pre><span class="lnum">   2:  </span><span class="kwrd">Public</span> <span class="kwrd">Interface</span> IAddressLookupService</pre>
<pre class="alt"><span class="lnum">   3:  </span>    &lt;OperationContract()&gt; _</pre>
<pre><span class="lnum">   4:  </span>    <span class="kwrd">Function</span> Search(<span class="kwrd">ByVal</span> varAddress <span class="kwrd">As</span> <span class="kwrd">String</span>) <span class="kwrd">As</span> List(Of Address)</pre>
<pre class="alt"><span class="lnum">   5:  </span><span class="kwrd">End</span> Interface</pre>
</p></div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>and a concrete class:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">Public</span> <span class="kwrd">Class</span> AddressLookupService</pre>
<pre><span class="lnum">   2:  </span>    <span class="kwrd">Implements</span> IAddressLookupService</pre>
<pre class="alt"><span class="lnum">   3:  </span>&#160;</pre>
<pre><span class="lnum">   4:  </span>    <span class="kwrd">Private</span> _addressServiceLibrary <span class="kwrd">As</span> IAddressServiceLibrary = <span class="kwrd">New</span> AddressServiceLibrary()</pre>
<pre class="alt"><span class="lnum">   5:  </span>&#160;</pre>
<pre><span class="lnum">   6:  </span>    <span class="kwrd">Public</span> <span class="kwrd">Function</span> Search(<span class="kwrd">ByVal</span> varAddress <span class="kwrd">As</span> <span class="kwrd">String</span>) <span class="kwrd">As</span> List(Of Address) <span class="kwrd">Implements</span> IAddressLookupService.Search</pre>
<pre class="alt"><span class="lnum">   7:  </span>        <span class="kwrd">Return</span> _addressServiceLibrary.Search(varAddress)</pre>
<pre><span class="lnum">   8:  </span>    <span class="kwrd">End</span> <span class="kwrd">Function</span></pre>
<pre class="alt"><span class="lnum">   9:  </span>&#160;</pre>
<pre><span class="lnum">  10:  </span><span class="kwrd">End</span> Class</pre>
</p></div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Our WCF service is now complete.&#160; This sample could be extended to also utilize the <a href="http://en.wikipedia.org/wiki/Decorator_pattern" target="_blank">Decorator Pattern</a>; however, in the interest of brevity I have opted to not include in this posting.</p></p>
]]></content:encoded>
			<wfw:commentRss>http://mark.tremaine.net/howto/wcf-tutorial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Passing &#8220;Order By&#8221; parameters w/o utilizing dynamic sql</title>
		<link>http://mark.tremaine.net/tips-tricks/passing-order-by-parameters-wo-utilizing-dynamic-sql/</link>
		<comments>http://mark.tremaine.net/tips-tricks/passing-order-by-parameters-wo-utilizing-dynamic-sql/#comments</comments>
		<pubDate>Thu, 14 May 2009 13:10:00 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[SQL Server 2005]]></category>

		<guid isPermaLink="false">http://mark.tremaine.net/tips-tricks/passing-order-by-parameters-wo-utilizing-dynamic-sql/</guid>
		<description><![CDATA[Similar to the SELECT and WHERE clauses, the ORDER BY clause can also utilize CASE statements.&#160; Within these CASE statements, the input parameter is evaluated and used to sort the result set as desired. For example, if you have a table with the following schema: 1: CREATE TABLE [CONTACT_TX_TB] ( 2: [CONTACT_SYSID] [int] IDENTITY(1,1) NOT [...]]]></description>
			<content:encoded><![CDATA[<p>Similar to the SELECT and WHERE clauses, the ORDER BY clause can also utilize CASE statements.&#160; Within these CASE statements, the input parameter is evaluated and used to sort the result set as desired.</p>
<p>For example, if you have a table with the following schema:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">CREATE</span> <span class="kwrd">TABLE</span> [CONTACT_TX_TB] (</pre>
<pre><span class="lnum"> 2: </span>[CONTACT_SYSID] [<span class="kwrd">int</span>] <span class="kwrd">IDENTITY</span>(1,1) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum"> 3: </span>, [TYPE_SYSID] [<span class="kwrd">int</span>] <span class="kwrd">NOT</span> <span class="kwrd">NULL</span></pre>
<pre><span class="lnum"> 4: </span>, [TITLE] [<span class="kwrd">varchar</span>](100) <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum"> 5: </span>, [FIRST_NAME] [<span class="kwrd">varchar</span>](100) <span class="kwrd">NULL</span></pre>
<pre><span class="lnum"> 6: </span>, [MIDDLE_NAME] [<span class="kwrd">varchar</span>](100) <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum"> 7: </span>, [LAST_NAME] [<span class="kwrd">varchar</span>](100) <span class="kwrd">NULL</span></pre>
<pre><span class="lnum"> 8: </span>, [CREATED] [datetime] <span class="kwrd">NOT</span> <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum"> 9: </span>, [CREATED_BY] [<span class="kwrd">int</span>] <span class="kwrd">NOT</span> <span class="kwrd">NULL</span></pre>
<pre><span class="lnum"> 10: </span>, [UPDATED] [datetime] <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum"> 11: </span>, [UPDATED_BY] [<span class="kwrd">int</span>] <span class="kwrd">NULL</span></pre>
<pre><span class="lnum"> 12: </span>, [INACTIVE] [<span class="kwrd">bit</span>] <span class="kwrd">NOT</span> <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum"> 13: </span>)</pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>And the following stored procedure:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">CREATE</span> <span class="kwrd">PROCEDURE</span> [CONTACT_SELECT_SP] (</pre>
<pre><span class="lnum"> 2: </span>@CONTACT_SYSID <span class="kwrd">int</span> = <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum"> 3: </span>, @TYPE_SYSID <span class="kwrd">int</span> = <span class="kwrd">NULL</span></pre>
<pre><span class="lnum"> 4: </span>, @TITLE <span class="kwrd">varchar</span>(100) = <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum"> 5: </span>, @FIRST_NAME <span class="kwrd">varchar</span>(100) = <span class="kwrd">NULL</span></pre>
<pre><span class="lnum"> 6: </span>, @MIDDLE_NAME <span class="kwrd">varchar</span>(100) = <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum"> 7: </span>, @LAST_NAME <span class="kwrd">varchar</span>(100) = <span class="kwrd">NULL</span></pre>
<pre><span class="lnum"> 8: </span>, @CREATED_FROM datetime = <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum"> 9: </span>, @CREATED_TO datetime = <span class="kwrd">NULL</span></pre>
<pre><span class="lnum"> 10: </span>, @CREATED_BY <span class="kwrd">int</span> = <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum"> 11: </span>, @UPDATED_FROM datetime = <span class="kwrd">NULL</span></pre>
<pre><span class="lnum"> 12: </span>, @UPDATED_TO datetime = <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum"> 13: </span>, @UPDATED_BY <span class="kwrd">int</span> = <span class="kwrd">NULL</span></pre>
<pre><span class="lnum"> 14: </span>, @INACTIVE <span class="kwrd">bit</span> = <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum"> 15: </span>)</pre>
<pre><span class="lnum"> 16: </span><span class="kwrd">AS</span></pre>
<pre class="alt"><span class="lnum"> 17: </span><span class="kwrd">BEGIN</span></pre>
<pre><span class="lnum"> 18: </span> <span class="kwrd">SET</span> NOCOUNT <span class="kwrd">ON</span>;</pre>
<pre class="alt"><span class="lnum"> 19: </span>&#160;</pre>
<pre><span class="lnum"> 20: </span> <span class="kwrd">SELECT</span> <span class="kwrd">TOP</span> 5001</pre>
<pre class="alt"><span class="lnum"> 21: </span>[CONTACT_SYSID]</pre>
<pre><span class="lnum"> 22: </span>, [TYPE_SYSID]</pre>
<pre class="alt"><span class="lnum"> 23: </span>, [TITLE]</pre>
<pre><span class="lnum"> 24: </span>, [FIRST_NAME]</pre>
<pre class="alt"><span class="lnum"> 25: </span>, [MIDDLE_NAME]</pre>
<pre><span class="lnum"> 26: </span>, [LAST_NAME]</pre>
<pre class="alt"><span class="lnum"> 27: </span>, [CREATED]</pre>
<pre><span class="lnum"> 28: </span>, [CREATED_BY]</pre>
<pre class="alt"><span class="lnum"> 29: </span>, [UPDATED]</pre>
<pre><span class="lnum"> 30: </span>, [UPDATED_BY]</pre>
<pre class="alt"><span class="lnum"> 31: </span>, [INACTIVE]</pre>
<pre><span class="lnum"> 32: </span> <span class="kwrd">FROM</span> [CONTACT_TX_TB]</pre>
<pre class="alt"><span class="lnum"> 33: </span> <span class="kwrd">WHERE</span> <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 34: </span> <span class="kwrd">WHEN</span> @CONTACT_SYSID <span class="kwrd">IS</span> <span class="kwrd">NULL</span> <span class="kwrd">THEN</span> 1</pre>
<pre class="alt"><span class="lnum"> 35: </span> <span class="kwrd">WHEN</span> [CONTACT_SYSID] = @CONTACT_SYSID <span class="kwrd">THEN</span> 1</pre>
<pre><span class="lnum"> 36: </span> <span class="kwrd">ELSE</span> 0</pre>
<pre class="alt"><span class="lnum"> 37: </span> <span class="kwrd">END</span> = 1</pre>
<pre><span class="lnum"> 38: </span> <span class="kwrd">AND</span> <span class="kwrd">CASE</span></pre>
<pre class="alt"><span class="lnum"> 39: </span> <span class="kwrd">WHEN</span> @TYPE_SYSID <span class="kwrd">IS</span> <span class="kwrd">NULL</span> <span class="kwrd">THEN</span> 1</pre>
<pre><span class="lnum"> 40: </span> <span class="kwrd">WHEN</span> [TYPE_SYSID] = @TYPE_SYSID <span class="kwrd">THEN</span> 1</pre>
<pre class="alt"><span class="lnum"> 41: </span> <span class="kwrd">ELSE</span> 0</pre>
<pre><span class="lnum"> 42: </span> <span class="kwrd">END</span> = 1</pre>
<pre class="alt"><span class="lnum"> 43: </span> <span class="kwrd">AND</span> <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 44: </span> <span class="kwrd">WHEN</span> @TITLE <span class="kwrd">IS</span> <span class="kwrd">NULL</span> <span class="kwrd">THEN</span> 1</pre>
<pre class="alt"><span class="lnum"> 45: </span> <span class="kwrd">WHEN</span> [TITLE] <span class="kwrd">LIKE</span> @TITLE + <span class="str">'%'</span><span class="kwrd">THEN</span> 1</pre>
<pre><span class="lnum"> 46: </span> <span class="kwrd">ELSE</span> 0</pre>
<pre class="alt"><span class="lnum"> 47: </span> <span class="kwrd">END</span> = 1</pre>
<pre><span class="lnum"> 48: </span> <span class="kwrd">AND</span> <span class="kwrd">CASE</span></pre>
<pre class="alt"><span class="lnum"> 49: </span> <span class="kwrd">WHEN</span> @FIRST_NAME <span class="kwrd">IS</span> <span class="kwrd">NULL</span> <span class="kwrd">THEN</span> 1</pre>
<pre><span class="lnum"> 50: </span> <span class="kwrd">WHEN</span> [FIRST_NAME] <span class="kwrd">LIKE</span> @FIRST_NAME + <span class="str">'%'</span><span class="kwrd">THEN</span> 1</pre>
<pre class="alt"><span class="lnum"> 51: </span> <span class="kwrd">ELSE</span> 0</pre>
<pre><span class="lnum"> 52: </span> <span class="kwrd">END</span> = 1</pre>
<pre class="alt"><span class="lnum"> 53: </span> <span class="kwrd">AND</span> <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 54: </span> <span class="kwrd">WHEN</span> @MIDDLE_NAME <span class="kwrd">IS</span> <span class="kwrd">NULL</span> <span class="kwrd">THEN</span> 1</pre>
<pre class="alt"><span class="lnum"> 55: </span> <span class="kwrd">WHEN</span> [MIDDLE_NAME] <span class="kwrd">LIKE</span> @MIDDLE_NAME + <span class="str">'%'</span><span class="kwrd">THEN</span> 1</pre>
<pre><span class="lnum"> 56: </span> <span class="kwrd">ELSE</span> 0</pre>
<pre class="alt"><span class="lnum"> 57: </span> <span class="kwrd">END</span> = 1</pre>
<pre><span class="lnum"> 58: </span> <span class="kwrd">AND</span> <span class="kwrd">CASE</span></pre>
<pre class="alt"><span class="lnum"> 59: </span> <span class="kwrd">WHEN</span> @LAST_NAME <span class="kwrd">IS</span> <span class="kwrd">NULL</span> <span class="kwrd">THEN</span> 1</pre>
<pre><span class="lnum"> 60: </span> <span class="kwrd">WHEN</span> [LAST_NAME] <span class="kwrd">LIKE</span> @LAST_NAME + <span class="str">'%'</span><span class="kwrd">THEN</span> 1</pre>
<pre class="alt"><span class="lnum"> 61: </span> <span class="kwrd">ELSE</span> 0</pre>
<pre><span class="lnum"> 62: </span> <span class="kwrd">END</span> = 1</pre>
<pre class="alt"><span class="lnum"> 63: </span> <span class="kwrd">AND</span> <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 64: </span> <span class="kwrd">WHEN</span> @CREATED_FROM <span class="kwrd">IS</span> <span class="kwrd">NULL</span> <span class="kwrd">THEN</span> 1</pre>
<pre class="alt"><span class="lnum"> 65: </span> <span class="kwrd">WHEN</span> [CREATED] &gt;= @CREATED_FROM <span class="kwrd">THEN</span> 1</pre>
<pre><span class="lnum"> 66: </span> <span class="kwrd">ELSE</span> 0</pre>
<pre class="alt"><span class="lnum"> 67: </span> <span class="kwrd">END</span> = 1</pre>
<pre><span class="lnum"> 68: </span> <span class="kwrd">AND</span> <span class="kwrd">CASE</span></pre>
<pre class="alt"><span class="lnum"> 69: </span> <span class="kwrd">WHEN</span> @CREATED_TO <span class="kwrd">IS</span> <span class="kwrd">NULL</span> <span class="kwrd">THEN</span> 1</pre>
<pre><span class="lnum"> 70: </span> <span class="kwrd">WHEN</span> [CREATED] &lt;= @CREATED_TO <span class="kwrd">THEN</span> 1</pre>
<pre class="alt"><span class="lnum"> 71: </span> <span class="kwrd">ELSE</span> 0</pre>
<pre><span class="lnum"> 72: </span> <span class="kwrd">END</span> = 1</pre>
<pre class="alt"><span class="lnum"> 73: </span> <span class="kwrd">AND</span> <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 74: </span> <span class="kwrd">WHEN</span> @CREATED_BY <span class="kwrd">IS</span> <span class="kwrd">NULL</span> <span class="kwrd">THEN</span> 1</pre>
<pre class="alt"><span class="lnum"> 75: </span> <span class="kwrd">WHEN</span> [CREATED_BY] = @CREATED_BY <span class="kwrd">THEN</span> 1</pre>
<pre><span class="lnum"> 76: </span> <span class="kwrd">ELSE</span> 0</pre>
<pre class="alt"><span class="lnum"> 77: </span> <span class="kwrd">END</span> = 1</pre>
<pre><span class="lnum"> 78: </span> <span class="kwrd">AND</span> <span class="kwrd">CASE</span></pre>
<pre class="alt"><span class="lnum"> 79: </span> <span class="kwrd">WHEN</span> @UPDATED_FROM <span class="kwrd">IS</span> <span class="kwrd">NULL</span> <span class="kwrd">THEN</span> 1</pre>
<pre><span class="lnum"> 80: </span> <span class="kwrd">WHEN</span> [UPDATED] &gt;= @UPDATED_FROM <span class="kwrd">THEN</span> 1</pre>
<pre class="alt"><span class="lnum"> 81: </span> <span class="kwrd">ELSE</span> 0</pre>
<pre><span class="lnum"> 82: </span> <span class="kwrd">END</span> = 1</pre>
<pre class="alt"><span class="lnum"> 83: </span> <span class="kwrd">AND</span> <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 84: </span> <span class="kwrd">WHEN</span> @UPDATED_TO <span class="kwrd">IS</span> <span class="kwrd">NULL</span> <span class="kwrd">THEN</span> 1</pre>
<pre class="alt"><span class="lnum"> 85: </span> <span class="kwrd">WHEN</span> [UPDATED] &lt;= @UPDATED_TO <span class="kwrd">THEN</span> 1</pre>
<pre><span class="lnum"> 86: </span> <span class="kwrd">ELSE</span> 0</pre>
<pre class="alt"><span class="lnum"> 87: </span> <span class="kwrd">END</span> = 1</pre>
<pre><span class="lnum"> 88: </span> <span class="kwrd">AND</span> <span class="kwrd">CASE</span></pre>
<pre class="alt"><span class="lnum"> 89: </span> <span class="kwrd">WHEN</span> @UPDATED_BY <span class="kwrd">IS</span> <span class="kwrd">NULL</span> <span class="kwrd">THEN</span> 1</pre>
<pre><span class="lnum"> 90: </span> <span class="kwrd">WHEN</span> [UPDATED_BY] = @UPDATED_BY <span class="kwrd">THEN</span> 1</pre>
<pre class="alt"><span class="lnum"> 91: </span> <span class="kwrd">ELSE</span> 0</pre>
<pre><span class="lnum"> 92: </span> <span class="kwrd">END</span> = 1</pre>
<pre class="alt"><span class="lnum"> 93: </span> <span class="kwrd">AND</span> <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 94: </span> <span class="kwrd">WHEN</span> @INACTIVE <span class="kwrd">IS</span> <span class="kwrd">NULL</span> <span class="kwrd">THEN</span> 1</pre>
<pre class="alt"><span class="lnum"> 95: </span> <span class="kwrd">WHEN</span> [INACTIVE] = @INACTIVE <span class="kwrd">THEN</span> 1</pre>
<pre><span class="lnum"> 96: </span> <span class="kwrd">ELSE</span> 0</pre>
<pre class="alt"><span class="lnum"> 97: </span> <span class="kwrd">END</span> = 1</pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>If you add one additional input parameter:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum"> 1: </span>, @ORDER_BY <span class="kwrd">varchar</span>(100) = <span class="kwrd">NULL</span></pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>And the following ORDER BY clause:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum"> 1: </span> <span class="kwrd">ORDER</span> <span class="kwrd">BY</span></pre>
<pre><span class="lnum"> 2: </span> <span class="rem">-- ASCENDING</span></pre>
<pre class="alt"><span class="lnum"> 3: </span> <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 4: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'CONTACT_SYSID'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'1'</span> <span class="kwrd">THEN</span> [CONTACT_SYSID]</pre>
<pre class="alt"><span class="lnum"> 5: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'TYPE_SYSID'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'2'</span> <span class="kwrd">THEN</span> [TYPE_SYSID]</pre>
<pre><span class="lnum"> 6: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'CREATED_BY'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'8'</span> <span class="kwrd">THEN</span> [CREATED_BY]</pre>
<pre class="alt"><span class="lnum"> 7: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'UPDATED_BY'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'10'</span> <span class="kwrd">THEN</span> [UPDATED_BY]</pre>
<pre><span class="lnum"> 8: </span> <span class="kwrd">END</span></pre>
<pre class="alt"><span class="lnum"> 9: </span>, <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 10: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'TITLE'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'3'</span> <span class="kwrd">THEN</span> [TITLE]</pre>
<pre class="alt"><span class="lnum"> 11: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'FIRST_NAME'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'4'</span> <span class="kwrd">THEN</span> [FIRST_NAME]</pre>
<pre><span class="lnum"> 12: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'MIDDLE_NAME'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'5'</span> <span class="kwrd">THEN</span> [MIDDLE_NAME]</pre>
<pre class="alt"><span class="lnum"> 13: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'LAST_NAME'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'6'</span> <span class="kwrd">THEN</span> [LAST_NAME]</pre>
<pre><span class="lnum"> 14: </span> <span class="kwrd">END</span></pre>
<pre class="alt"><span class="lnum"> 15: </span>, <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 16: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'CREATED'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'7'</span> <span class="kwrd">THEN</span> [CREATED]</pre>
<pre class="alt"><span class="lnum"> 17: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'UPDATED'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'9'</span> <span class="kwrd">THEN</span> [UPDATED]</pre>
<pre><span class="lnum"> 18: </span> <span class="kwrd">END</span></pre>
<pre class="alt"><span class="lnum"> 19: </span>, <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 20: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'INACTIVE'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'11'</span> <span class="kwrd">THEN</span> [INACTIVE]</pre>
<pre class="alt"><span class="lnum"> 21: </span> <span class="kwrd">END</span></pre>
<pre><span class="lnum"> 22: </span> <span class="rem">-- DESCENDING</span></pre>
<pre class="alt"><span class="lnum"> 23: </span>, <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 24: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'-CONTACT_SYSID'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'-1'</span> <span class="kwrd">THEN</span> [CONTACT_SYSID]</pre>
<pre class="alt"><span class="lnum"> 25: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'-TYPE_SYSID'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'-2'</span> <span class="kwrd">THEN</span> [TYPE_SYSID]</pre>
<pre><span class="lnum"> 26: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'-CREATED_BY'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'-8'</span> <span class="kwrd">THEN</span> [CREATED_BY]</pre>
<pre class="alt"><span class="lnum"> 27: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'-UPDATED_BY'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'-10'</span> <span class="kwrd">THEN</span> [UPDATED_BY]</pre>
<pre><span class="lnum"> 28: </span> <span class="kwrd">END</span> <span class="kwrd">DESC</span></pre>
<pre class="alt"><span class="lnum"> 29: </span>, <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 30: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'-TITLE'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'3'</span> <span class="kwrd">THEN</span> [TITLE]</pre>
<pre class="alt"><span class="lnum"> 31: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'-FIRST_NAME'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'-4'</span> <span class="kwrd">THEN</span> [FIRST_NAME]</pre>
<pre><span class="lnum"> 32: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'-MIDDLE_NAME'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'-5'</span> <span class="kwrd">THEN</span> [MIDDLE_NAME]</pre>
<pre class="alt"><span class="lnum"> 33: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'-LAST_NAME'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'-6'</span> <span class="kwrd">THEN</span> [LAST_NAME]</pre>
<pre><span class="lnum"> 34: </span> <span class="kwrd">END</span> <span class="kwrd">DESC</span></pre>
<pre class="alt"><span class="lnum"> 35: </span>, <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 36: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'-CREATED'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'-7'</span> <span class="kwrd">THEN</span> [CREATED]</pre>
<pre class="alt"><span class="lnum"> 37: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'-UPDATED'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'-9'</span> <span class="kwrd">THEN</span> [UPDATED]</pre>
<pre><span class="lnum"> 38: </span> <span class="kwrd">END</span> <span class="kwrd">DESC</span></pre>
<pre class="alt"><span class="lnum"> 39: </span>, <span class="kwrd">CASE</span></pre>
<pre><span class="lnum"> 40: </span> <span class="kwrd">WHEN</span> @ORDER_BY = <span class="str">'-INACTIVE'</span> <span class="kwrd">OR</span> <span class="kwrd">CONVERT</span>( <span class="kwrd">varchar</span>(100), @ORDER_BY ) = <span class="str">'-11'</span> <span class="kwrd">THEN</span> [INACTIVE]</pre>
<pre class="alt"><span class="lnum"> 41: </span> <span class="kwrd">END</span> DESC</pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>You will be able to pass in the desired column (either by name or ordinal) as well as the direction (ascending or descending).</p>
<p>*Note: Each unique datatype requires its own CASE statement</p>
<p>&#160;</p>
<div class="csharpcode"></div>
]]></content:encoded>
			<wfw:commentRss>http://mark.tremaine.net/tips-tricks/passing-order-by-parameters-wo-utilizing-dynamic-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enabling SQL Cache Dependency within your .Net Application</title>
		<link>http://mark.tremaine.net/howto/enabling-sql-cache-dependency-within-your-net-application/</link>
		<comments>http://mark.tremaine.net/howto/enabling-sql-cache-dependency-within-your-net-application/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 18:11:28 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[SQL Cache Dependancy]]></category>
		<category><![CDATA[SQL Server 2005]]></category>

		<guid isPermaLink="false">http://mark.tremaine.net/howto/enabling-sql-cache-dependency-within-your-net-application/</guid>
		<description><![CDATA[This one&#8217;s short and sweet &#8230; add the following snippet to your web.config file (within the configuration &#62; system.web &#62; pages node): 1: &#60;caching&#62; 2: &#60;sqlCacheDependency enabled=&#34;true&#34;/&#62; 3: &#60;/caching&#62; .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode [...]]]></description>
			<content:encoded><![CDATA[<p>This one&#8217;s short and sweet &#8230; add the following snippet to your web.config file (within the configuration &gt; system.web &gt; pages node):</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>    <span class="kwrd">&lt;</span><span class="html">caching</span><span class="kwrd">&gt;</span></pre>
<pre><span class="lnum">   2:  </span>      <span class="kwrd">&lt;</span><span class="html">sqlCacheDependency</span> <span class="attr">enabled</span><span class="kwrd">=&quot;true&quot;</span><span class="kwrd">/&gt;</span></pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">&lt;/</span><span class="html">caching</span><span class="kwrd">&gt;</span></pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>Also, don&#8217;t forget to add the following property and value to the desired providers node:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>sqlCacheDependency=&quot;CommandNotification&quot;</pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>Finally, make sure your SQL Server has the <a href="/tips-tricks/sql-server-service-broker/" target="_blank">Service Broker</a> feature enabled.</p>
<p>(You can read more about SQL Cache Dependency <a href="http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx" target="_blank">here</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://mark.tremaine.net/howto/enabling-sql-cache-dependency-within-your-net-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recursive Queries in SQL Server 2005 using CTE</title>
		<link>http://mark.tremaine.net/tips-tricks/recursive-queries-in-sql-server-2005-using-cte/</link>
		<comments>http://mark.tremaine.net/tips-tricks/recursive-queries-in-sql-server-2005-using-cte/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 15:58:38 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[CTE]]></category>
		<category><![CDATA[recursion]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[SQL Server 2005]]></category>

		<guid isPermaLink="false">http://mark.tremaine.net/tips-tricks/recursive-queries-in-sql-server-2005-using-cte/</guid>
		<description><![CDATA[Common table expressions (CTEs) provide the significant advantage of being able to reference themselves, making recursion far simpler then earlier versions of SQL Server.&#160; CTEs consist of three parts: a name, an optional column list and a query.&#160; A recursive query also consists of three parts: an anchor member, a recursive member and a termination [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://msdn.microsoft.com/en-us/library/ms190766.aspx" target="_blank">Common table expressions</a> (CTEs) provide the significant advantage of being able to reference themselves, making <a href="http://msdn.microsoft.com/en-us/library/ms186243.aspx" target="_blank">recursion</a> far simpler then earlier versions of SQL Server.&#160; CTEs consist of three parts: a name, an optional column list and a query.&#160; A recursive query also consists of three parts: an anchor member, a recursive member and a termination check.&#160; In the case of recursive CTEs, the termination check is implicit; recursion stops when no rows are returned from the previous invocation.&#160; This leaves only anchor member and recursive member for further discussion.&#160; The anchor member is relatively simple, this is your base query; think starting point; hierarchy level 1.&#160; The recursive member is a bit more tricky.&#160; I try to first compose a query which would return hierarchy level 2.&#160; Once I am happy with the hierarchy level 1 query (the anchor member) and the hierarchy level 2 query (what will become the recursive member), I construct the CTE. </p>
<p>A CTE must either be the first command executed or follow a command that is terminated with &quot;;&quot;.&#160; So I have just become accustom to prefixing the CTE declaration with &quot;;&quot;:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>; <span class="kwrd">WITH</span> CTE_NAME [ ( COLUMN_NAME [,...n] ) ] <span class="kwrd">AS</span> (</pre>
<pre><span class="lnum">   2:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">   3:  </span>    HIERARCHY_LEVEL_1_QUERY</pre>
<pre><span class="lnum">   4:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">   5:  </span>    <span class="kwrd">UNION</span> <span class="kwrd">ALL</span></pre>
<pre><span class="lnum">   6:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">   7:  </span>    HIERARCHY_LEVEL_2_QUERY</pre>
<pre><span class="lnum">   8:  </span>    <span class="kwrd">INNER</span> <span class="kwrd">JOIN</span> CTE_NAME</pre>
<pre class="alt"><span class="lnum">   9:  </span>        <span class="kwrd">ON</span> COLUMN_NAME = CTE_NAME.COLUMN_NAME</pre>
<pre><span class="lnum">  10:  </span>)</pre>
<pre class="alt"><span class="lnum">  11:  </span><span class="kwrd">SELECT</span> *</pre>
<pre><span class="lnum">  12:  </span><span class="kwrd">FROM</span> CTE_NAME</pre>
</div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>The INNER JOIN statement should be the relationship of PARENT = CURRENT (the CTE is always the current hierarchy level) and the UNION ALL in effect iterates through all of the CHILDREN (the remainder of the hierarchy levels).</p>
]]></content:encoded>
			<wfw:commentRss>http://mark.tremaine.net/tips-tricks/recursive-queries-in-sql-server-2005-using-cte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fixed Positions in IE6</title>
		<link>http://mark.tremaine.net/tips-tricks/fixed-positions-in-ie6/</link>
		<comments>http://mark.tremaine.net/tips-tricks/fixed-positions-in-ie6/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 16:06:49 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Compliance]]></category>
		<category><![CDATA[Css]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://mark.tremaine.net/tips-tricks/fixed-positions-in-ie6/</guid>
		<description><![CDATA[okay, so your happy coding in css compliant world and then you remember &#8230; IE is not css compliant &#8230; but you&#8217;ve just written some code utilizing the &#34;position: fixed;&#34; property and value &#8230; you check IE 7 &#8230; all good &#8230; then IE 6 &#8230; rut roh raggy &#8230; enter conditional comments &#8230; yea [...]]]></description>
			<content:encoded><![CDATA[<p>okay, so your happy coding in css compliant world and then you remember &#8230; IE is not css compliant &#8230; but you&#8217;ve just written some code utilizing the &quot;position: fixed;&quot; property and value &#8230; you check IE 7 &#8230; all good &#8230; then IE 6 &#8230; rut roh raggy &#8230; enter <a href="http://msdn.microsoft.com/en-us/library/ms537512.aspx" target="_blank">conditional comments</a> &#8230; yea it&#8217;s a wee bit hacky &#8230; but sometimes non compliant browsers require non compliant solutions &#8230; the trick here is the use of conditional comments to target the browser then use IE specific css properties and values like overflow-y (however <a href="http://www.w3.org/TR/css3-roadmap/" target="_blank">css3</a> includes this <a href="http://www.w3.org/TR/css3-box/#overflow-y" target="_blank">property</a>) and <a href="http://msdn.microsoft.com/en-us/library/ms537634.aspx" target="_blank">expression</a> along with the so important <a href="http://www.w3.org/TR/CSS2/cascade.html#important-rules" target="_blank">!important</a> declaration &#8230;</p>
<p>for example:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="rem">&lt;!--[if lt IE 7]&gt;</span></pre>
<pre><span class="lnum">   2:  </span><span class="rem">&lt;style type=&quot;text/css&quot;&gt;</span></pre>
<pre class="alt"><span class="lnum">   3:  </span><span class="rem">body {</span></pre>
<pre><span class="lnum">   4:  </span><span class="rem">    overflow: hidden;</span></pre>
<pre class="alt"><span class="lnum">   5:  </span><span class="rem">}</span></pre>
<pre><span class="lnum">   6:  </span><span class="rem">#YOUR_MAIN_BODY_BLOCK_TAG {</span></pre>
<pre class="alt"><span class="lnum">   7:  </span><span class="rem">    height: expression(document.body.clientHeight + &quot;px&quot;) !important;</span></pre>
<pre><span class="lnum">   8:  </span><span class="rem">    overflow-y: scroll;</span></pre>
<pre class="alt"><span class="lnum">   9:  </span><span class="rem">    overflow-x: auto;</span></pre>
<pre><span class="lnum">  10:  </span><span class="rem">}</span></pre>
<pre class="alt"><span class="lnum">  11:  </span><span class="rem">#YOUR_FIXED_BLOCK_TAG {</span></pre>
<pre><span class="lnum">  12:  </span><span class="rem">    position: absolute !important;</span></pre>
<pre class="alt"><span class="lnum">  13:  </span><span class="rem">}</span></pre>
<pre><span class="lnum">  14:  </span><span class="rem">&lt;/style&gt;</span></pre>
<pre class="alt"><span class="lnum">  15:  </span><span class="rem">&lt;![endif]--&gt;</span></pre>
</div>
<p>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</p>
<p>also, ensure that #YOUR_FIXED_BLOCK_TAG is not a child tag of #YOUR_MAIN_BODY_BLOCK_TAG &#8230; they should be siblings &#8230; </p>
]]></content:encoded>
			<wfw:commentRss>http://mark.tremaine.net/tips-tricks/fixed-positions-in-ie6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SiteMap Providers</title>
		<link>http://mark.tremaine.net/lessons-learned/sitemap-providers/</link>
		<comments>http://mark.tremaine.net/lessons-learned/sitemap-providers/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 20:20:50 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Lessons Learned]]></category>
		<category><![CDATA[ProviderModel]]></category>
		<category><![CDATA[SiteMapProvider]]></category>
		<category><![CDATA[whitepaper]]></category>

		<guid isPermaLink="false">http://mark.tremaine.net/lessons-learned/sitemap-providers/</guid>
		<description><![CDATA[Task Implement a Microsoft approved strategy with regards to the usage of a sitemap provider allowing for dynamic updates without requiring a restart of the web application. Glossary of Terms The terms below are intended to provide a basic understanding of common terms and procedures used throughout the remainder of this document. Provider Model – [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>
<div><span style="font-family:Arial"><strong>Task<br />
</strong></span></div>
<p><span style="font-family:Arial; font-size:10pt"><strong>Implement a Microsoft approved strategy with regards to the usage of a sitemap provider allowing for dynamic updates without requiring a restart of the web application.<br />
</strong></span></p>
</li>
<li>
<div><span style="font-family:Arial"><strong>Glossary of Terms<br />
</strong></span></div>
<p><span style="font-family:Arial; font-size:10pt"><strong>The terms below are intended to provide a basic understanding of common terms and procedures used throughout the remainder of this document.<br />
</strong></span></p>
<ol>
<li>
<div><a href="http://msdn.microsoft.com/en-us/asp.net/aa336558.aspx"><span style="font-family:Arial; font-size:10pt">Provider Model</span></a><span style="font-family:Arial; font-size:10pt"> – an extensibility model that lets developers pull out and replace the built-in implementations of the core .net framework building block services allowing developers to quickly and easily make use of the rich productivity features.<br />
</span></div>
<ol>
<li><span style="font-family:Arial; font-size:10pt">Is open source as of asp.net 2.0;<br />
</span></li>
<li><span style="font-family:Arial; font-size:10pt">Is used throughout asp.net;<br />
</span></li>
<li><span style="font-family:Arial; font-size:10pt">Makes asp.net much more flexible, expandable, and customizable;<br />
</span></li>
<li><span style="font-family:Arial; font-size:10pt">Includes, but is not limited to, the following providers: Membership; Role, Site Map, Session State and Profile;<br />
</span></li>
</ol>
</li>
<li>
<div><a href="http://msdn.microsoft.com/en-us/library/aa479033.aspx"><span style="font-family:Arial; font-size:10pt">Site Map Providers</span></a><span style="font-family:Arial; font-size:10pt"> – provide the interface between ASP.NET&#8217;s data-driven site-navigation features and site map data sources.  The fundamental job of a site map provider is to read site map data from a data source and build an upside-down tree of SiteMapNode objects, and to provide methods for retrieving nodes from the site map.<br />
</span></div>
<ol>
<li><a href="http://msdn.microsoft.com/en-us/library/aa479033.aspx"><span style="font-family:Arial; font-size:10pt">Site Map Provider</span></a><span style="font-family:Arial; font-size:10pt"> – Defines the basic contract between ASP.NET and site map providers<br />
</span></li>
<li><a href="http://msdn.microsoft.com/en-us/library/aa479033.aspx"><span style="font-family:Arial; font-size:10pt">Static Site Map Provider</span></a><span style="font-family:Arial; font-size:10pt"> – Aids developers in implementing the contract between ASP.NET and site map providers; is the base class for the XmlSiteMapProvider; can be used as the base class for custom site map providers; provider classes that derive from StaticSiteMapProvider require considerably less code than providers derived from SiteMapProvider; The word &#8220;Static&#8221; in StaticSiteMapProvider refers to the fact that the site map data source is static<br />
</span></li>
</ol>
<p style="margin-left: 7pt"><span style="color:#4f81bd; font-family:Arial; font-size:8pt"><strong><em>MSDN &#8211; Inside the ASP.NET Team: ASP.NET&#8217;s XmlSiteMapProvider goes to the extra trouble of monitoring the site map file and reloading it if it changes. If site map data is stored in a Microsoft SQL Server database, consider using ASP.NET 2.0&#8242;s SqlCacheDependency class to monitor the database for changes.<br />
</em></strong></span></p>
</li>
<li>
<div><a href="http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx"><span style="font-family:Arial; font-size:10pt">SQL Cache Dependency</span></a><span style="font-family:Arial; font-size:10pt"> – Establishes a relationship between an item stored in an ASP.NET application&#8217;s Cache object and either a specific SQL Server database table or the results of a SQL Server 2005 query<br />
</span></div>
<ol>
<li>
<div><a href="http://msdn.microsoft.com/en-us/library/ms178604.aspx"><span style="font-family:Arial; font-size:10pt">Features</span></a><span style="font-family:Arial; font-size:10pt"><br />
								</span></div>
<ol>
<li><span style="font-family:Arial; font-size:10pt">Can be used with SQL Server 7.0 and later versions<br />
</span></li>
<li><span style="font-family:Arial; font-size:10pt">Can dramatically increase application performance<br />
</span></li>
<li><span style="font-family:Arial; font-size:10pt">Can be used for both the application cache and the page output cache<br />
</span></li>
<li><span style="font-family:Arial; font-size:10pt">You do not need extensive SQL knowledge to configure SQL cache dependency in your application and in SQL Server. ASP.NET includes tools that automate the configuration.<br />
</span></li>
<li><span style="font-family:Arial; font-size:10pt">SQL Server 2005 and later versions implement a change notification model where notifications are sent to subscribing application servers, rather than relying on the polling model required in earlier versions of SQL Server.<br />
</span></li>
</ol>
</li>
</ol>
</li>
</ol>
</li>
<li>
<div><span style="font-family:Arial"><strong>OPTIONS<br />
</strong></span></div>
<ol>
<li>
<div><a href="http://msdn.microsoft.com/en-us/library/system.web.xmlsitemapprovider.aspx"><span style="font-family:Arial; font-size:10pt">XML Site Map Provider</span></a><span style="font-family:Arial; font-size:10pt"> – site maps stored in XML files conforming to a particular schema<br />
</span></div>
<ol>
<li><span style="font-family:Arial; font-size:10pt">Is the default site map provider for ASP.NET<br />
</span></li>
</ol>
</li>
<li><a href="http://msdn.microsoft.com/en-us/library/aa479338.aspx"><span style="font-family:Arial; font-size:10pt">Folder Site Map Provider</span></a><span style="font-family:Arial; font-size:10pt"> – exposes the file system as a data source for site navigation<br />
</span></li>
<li>
<div><a href="http://msdn.microsoft.com/en-us/library/aa479033.aspx"><span style="font-family:Arial; font-size:10pt">SQL Site Map Provider</span></a><span style="font-family:Arial; font-size:10pt"> – site maps stored in databases alongside other content conforming to a particular schema; is a StaticSiteMapProvider-derivative<br />
</span></div>
<ol>
<li><span style="font-family:Arial; font-size:10pt">Jeff Procise – Contributing editor to MSDN Magazine; Author of several books; Co-founder of Wintellect.  In <a href="http://msdn.microsoft.com/en-us/magazine/cc163787.aspx">June 2005</a>, Jeff created an article indentifying an alternate solution to the xml site map provider, a new site map provider name SQLSiteMapProvider.  In <a href="http://msdn.microsoft.com/en-us/magazine/cc163657.aspx">February 2006</a>, Jeff updated his <a href="http://msdn.microsoft.com/en-us/magazine/cc164622.aspx?code=true&amp;level=root&amp;file=SqlSiteMapProvider.cs">SQLSiteMapProvider</a> to include the usage of the SQLCacheDependency which monitors the site map database and refreshes the site map if changes occur.<br />
</span></li>
</ol>
</li>
<li><a href="http://msdn.microsoft.com/en-us/library/aa479320.aspx"><span style="font-family:Arial; font-size:10pt">Custom Site Map Provider</span></a><span style="font-family:Arial; font-size:10pt"> – As the provider model is open source, one can create any site map provider desired.<br />
</span></li>
</ol>
</li>
<li>
<div><span style="font-family:Arial"><strong>Lessons Learned<br />
</strong></span></div>
<p><span style="font-family:Arial; font-size:10pt"><strong>My initial implementation for my application&#8217;s site map was the SQL Site Map Provider as identified in section 3.3 (without the utilization of the SQL Cache Dependency class).  My initial thought was that additional queries to the database for the site navigation would not impede the performance of the individual pages.  It is ironic that this very assumption is what caused my production issue of missing nodes at what seemed to be irregular intervals.  Since the SQLSiteMapProvider inherits from the StaticSiteMapProvider, the site map data source is static and is cached by the application.  To accommodate for this, the SQLSiteMapProvider provides methods for clearing and querying the site map data source, similar to the XMLSiteMapProvider.  These APIs will be entered by many worker threads in parallel in order to serve requests.  Clearing the data at the same time the data is being queried is dangerous and prone to causing intermittent failures.  By introducing the SQLDependancyCache class, these processes are isolated.<br />
</strong></span></p>
</li>
<li><span style="font-family:Arial"><strong>References<br />
</strong></span></li>
</ol>
<p>i <a href="http://msdn.microsoft.com/en-us/asp.net/aa336558.aspx">http://msdn.microsoft.com/en-us/asp.net/aa336558.aspx</a>
	</p>
<p>ii <a href="http://msdn.microsoft.com/en-us/library/aa479033.aspx">http://msdn.microsoft.com/en-us/library/aa479033.aspx</a>
	</p>
<p>iii <a href="http://msdn.microsoft.com/en-us/library/aa479033.aspx">http://msdn.microsoft.com/en-us/library/aa479033.aspx#aspnetprovmod_prt3_topic1</a>
	</p>
<p>iv <a href="http://msdn.microsoft.com/en-us/library/aa479033.aspx">http://msdn.microsoft.com/en-us/library/aa479033.aspx#aspnetprovmod_prt3_topic4</a>
	</p>
<p>v <a href="http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx">http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx</a>
	</p>
<p>vi <a href="http://msdn.microsoft.com/en-us/library/ms178604.aspx">http://msdn.microsoft.com/en-us/library/ms178604.aspx#sectionToggle0</a>
	</p>
<p>vii <a href="http://msdn.microsoft.com/en-us/library/system.web.xmlsitemapprovider.aspx">http://msdn.microsoft.com/en-us/library/system.web.xmlsitemapprovider.aspx</a>
	</p>
<p>viii <a href="http://msdn.microsoft.com/en-us/library/aa479338.aspx">http://msdn.microsoft.com/en-us/library/aa479338.aspx#extndsi_topic6</a>
	</p>
<p>ix <a href="http://msdn.microsoft.com/en-us/library/aa479033.aspx">http://msdn.microsoft.com/en-us/library/aa479033.aspx#aspnetprovmod_prt3_topic5</a>
	</p>
<p>x <a href="http://msdn.microsoft.com/en-us/magazine/cc163787.aspx">http://msdn.microsoft.com/en-us/magazine/cc163787.aspx</a>
	</p>
<p>xi <a href="http://msdn.microsoft.com/en-us/magazine/cc163657.aspx">http://msdn.microsoft.com/en-us/magazine/cc163657.aspx</a>
	</p>
<p>xii <a href="http://msdn.microsoft.com/en-us/magazine/cc164622.aspx?code=true&amp;level=root&amp;file=SqlSiteMapProvider.cs">http://msdn.microsoft.com/en-us/magazine/cc164622.aspx?code=true&amp;level=root&amp;file=SqlSiteMapProvider.cs</a>
	</p>
<p>xiii <a href="http://msdn.microsoft.com/en-us/library/aa479320.aspx">http://msdn.microsoft.com/en-us/library/aa479320.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mark.tremaine.net/lessons-learned/sitemap-providers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hierarchical SQL Role Provider</title>
		<link>http://mark.tremaine.net/howto/hierarchical-sql-role-provider/</link>
		<comments>http://mark.tremaine.net/howto/hierarchical-sql-role-provider/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 22:22:42 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[hierarchical]]></category>
		<category><![CDATA[SQL Role Provider]]></category>
		<category><![CDATA[SQL Server 2005]]></category>

		<guid isPermaLink="false">http://mark.tremaine.net/howto/hierarchical-sql-role-provider/</guid>
		<description><![CDATA[you can modify the .net sql role provider to be hierarchical in just a few simple steps &#8230; first you need to modify the aspnet_Roles table: 1: ALTER TABLE [dbo].[aspnet_Roles] ADD [ParentRoleId] [uniqueidentifier] NULL .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre [...]]]></description>
			<content:encoded><![CDATA[<p>you can modify the .net sql role provider to be hierarchical in just a few simple steps &#8230;</p>
<p>first you need to modify the aspnet_Roles table:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">ALTER</span> <span class="kwrd">TABLE</span> [dbo].[aspnet_Roles] <span class="kwrd">ADD</span> [ParentRoleId] [uniqueidentifier] NULL</pre>
</div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>then add two new table value functions:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">CREATE</span> <span class="kwrd">FUNCTION</span> [tos].[aspnet_Roles_Ancestor_TVF] (</pre>
<pre><span class="lnum">   2:  </span>    @RoleId uniqueidentifier</pre>
<pre class="alt"><span class="lnum">   3:  </span>)</pre>
<pre><span class="lnum">   4:  </span><span class="kwrd">RETURNS</span> </pre>
<pre class="alt"><span class="lnum">   5:  </span>@aspnet_Roles <span class="kwrd">TABLE</span> (</pre>
<pre><span class="lnum">   6:  </span>    ApplicationId uniqueidentifier</pre>
<pre class="alt"><span class="lnum">   7:  </span>    , RoleId uniqueidentifier</pre>
<pre><span class="lnum">   8:  </span>    , RoleName nvarchar(256)</pre>
<pre class="alt"><span class="lnum">   9:  </span>    , LoweredRoleName nvarchar(256)</pre>
<pre><span class="lnum">  10:  </span>    , Description nvarchar(256)</pre>
<pre class="alt"><span class="lnum">  11:  </span>    , ParentRoleId uniqueidentifier</pre>
<pre><span class="lnum">  12:  </span>)</pre>
<pre class="alt"><span class="lnum">  13:  </span><span class="kwrd">AS</span></pre>
<pre><span class="lnum">  14:  </span><span class="kwrd">BEGIN</span></pre>
<pre class="alt"><span class="lnum">  15:  </span>    ; <span class="kwrd">WITH</span> aspnet_Roles_CTE (</pre>
<pre><span class="lnum">  16:  </span>        ApplicationId</pre>
<pre class="alt"><span class="lnum">  17:  </span>        , RoleId</pre>
<pre><span class="lnum">  18:  </span>        , RoleName</pre>
<pre class="alt"><span class="lnum">  19:  </span>        , LoweredRoleName</pre>
<pre><span class="lnum">  20:  </span>        , Description</pre>
<pre class="alt"><span class="lnum">  21:  </span>        , ParentRoleId</pre>
<pre><span class="lnum">  22:  </span>        , HierarchyLevel</pre>
<pre class="alt"><span class="lnum">  23:  </span>    ) <span class="kwrd">AS</span> (</pre>
<pre><span class="lnum">  24:  </span>        <span class="kwrd">SELECT</span></pre>
<pre class="alt"><span class="lnum">  25:  </span>            ApplicationId</pre>
<pre><span class="lnum">  26:  </span>            , RoleId</pre>
<pre class="alt"><span class="lnum">  27:  </span>            , RoleName</pre>
<pre><span class="lnum">  28:  </span>            , LoweredRoleName</pre>
<pre class="alt"><span class="lnum">  29:  </span>            , Description</pre>
<pre><span class="lnum">  30:  </span>            , ParentRoleId</pre>
<pre class="alt"><span class="lnum">  31:  </span>            , 1 <span class="kwrd">AS</span> HierarchyLevel</pre>
<pre><span class="lnum">  32:  </span>        <span class="kwrd">FROM</span> aspnet_Roles</pre>
<pre class="alt"><span class="lnum">  33:  </span>        <span class="kwrd">WHERE</span> RoleId = @RoleId</pre>
<pre><span class="lnum">  34:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  35:  </span>        <span class="kwrd">UNION</span> <span class="kwrd">ALL</span></pre>
<pre><span class="lnum">  36:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  37:  </span>        <span class="kwrd">SELECT</span></pre>
<pre><span class="lnum">  38:  </span>            aspnet_Roles.ApplicationId</pre>
<pre class="alt"><span class="lnum">  39:  </span>            , aspnet_Roles.RoleId</pre>
<pre><span class="lnum">  40:  </span>            , aspnet_Roles.RoleName</pre>
<pre class="alt"><span class="lnum">  41:  </span>            , aspnet_Roles.LoweredRoleName</pre>
<pre><span class="lnum">  42:  </span>            , aspnet_Roles.Description</pre>
<pre class="alt"><span class="lnum">  43:  </span>            , aspnet_Roles.ParentRoleId</pre>
<pre><span class="lnum">  44:  </span>            , aspnet_Roles_CTE.HierarchyLevel + 1 <span class="kwrd">AS</span> HierarchyLevel</pre>
<pre class="alt"><span class="lnum">  45:  </span>        <span class="kwrd">FROM</span> aspnet_Roles</pre>
<pre><span class="lnum">  46:  </span>        <span class="kwrd">INNER</span> <span class="kwrd">JOIN</span> aspnet_Roles_CTE</pre>
<pre class="alt"><span class="lnum">  47:  </span>            <span class="kwrd">ON</span> aspnet_Roles.RoleId = aspnet_Roles_CTE.ParentRoleId</pre>
<pre><span class="lnum">  48:  </span>    )</pre>
<pre class="alt"><span class="lnum">  49:  </span>&#160;</pre>
<pre><span class="lnum">  50:  </span>    INSERT <span class="kwrd">INTO</span> @aspnet_Roles (</pre>
<pre class="alt"><span class="lnum">  51:  </span>        ApplicationId</pre>
<pre><span class="lnum">  52:  </span>        , RoleId</pre>
<pre class="alt"><span class="lnum">  53:  </span>        , RoleName</pre>
<pre><span class="lnum">  54:  </span>        , LoweredRoleName</pre>
<pre class="alt"><span class="lnum">  55:  </span>        , Description</pre>
<pre><span class="lnum">  56:  </span>        , ParentRoleId</pre>
<pre class="alt"><span class="lnum">  57:  </span>    )</pre>
<pre><span class="lnum">  58:  </span>    <span class="kwrd">SELECT</span></pre>
<pre class="alt"><span class="lnum">  59:  </span>        ApplicationId</pre>
<pre><span class="lnum">  60:  </span>        , RoleId</pre>
<pre class="alt"><span class="lnum">  61:  </span>        , RoleName</pre>
<pre><span class="lnum">  62:  </span>        , LoweredRoleName</pre>
<pre class="alt"><span class="lnum">  63:  </span>        , Description</pre>
<pre><span class="lnum">  64:  </span>        , ParentRoleId</pre>
<pre class="alt"><span class="lnum">  65:  </span>    <span class="kwrd">FROM</span> aspnet_Roles_CTE</pre>
<pre><span class="lnum">  66:  </span>    <span class="kwrd">ORDER</span> <span class="kwrd">BY</span> HierarchyLevel </pre>
<pre class="alt"><span class="lnum">  67:  </span>    </pre>
<pre><span class="lnum">  68:  </span>    <span class="kwrd">RETURN</span> </pre>
<pre class="alt"><span class="lnum">  69:  </span><span class="kwrd">END</span></pre>
</div>
<p>and:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">ALTER</span> <span class="kwrd">FUNCTION</span> [tos].[aspnet_Roles_Descendant_TVF] (</pre>
<pre><span class="lnum">   2:  </span>    @RoleId uniqueidentifier</pre>
<pre class="alt"><span class="lnum">   3:  </span>)</pre>
<pre><span class="lnum">   4:  </span><span class="kwrd">RETURNS</span> </pre>
<pre class="alt"><span class="lnum">   5:  </span>@aspnet_Roles <span class="kwrd">TABLE</span> (</pre>
<pre><span class="lnum">   6:  </span>    ApplicationId uniqueidentifier</pre>
<pre class="alt"><span class="lnum">   7:  </span>    , RoleId uniqueidentifier</pre>
<pre><span class="lnum">   8:  </span>    , RoleName nvarchar(256)</pre>
<pre class="alt"><span class="lnum">   9:  </span>    , LoweredRoleName nvarchar(256)</pre>
<pre><span class="lnum">  10:  </span>    , Description nvarchar(256)</pre>
<pre class="alt"><span class="lnum">  11:  </span>    , ParentRoleId uniqueidentifier</pre>
<pre><span class="lnum">  12:  </span>)</pre>
<pre class="alt"><span class="lnum">  13:  </span><span class="kwrd">AS</span></pre>
<pre><span class="lnum">  14:  </span><span class="kwrd">BEGIN</span></pre>
<pre class="alt"><span class="lnum">  15:  </span>    ; <span class="kwrd">WITH</span> aspnet_Roles_CTE (</pre>
<pre><span class="lnum">  16:  </span>        ApplicationId</pre>
<pre class="alt"><span class="lnum">  17:  </span>        , RoleId</pre>
<pre><span class="lnum">  18:  </span>        , RoleName</pre>
<pre class="alt"><span class="lnum">  19:  </span>        , LoweredRoleName</pre>
<pre><span class="lnum">  20:  </span>        , Description</pre>
<pre class="alt"><span class="lnum">  21:  </span>        , ParentRoleId</pre>
<pre><span class="lnum">  22:  </span>        , HierarchyLevel</pre>
<pre class="alt"><span class="lnum">  23:  </span>    ) <span class="kwrd">AS</span> (</pre>
<pre><span class="lnum">  24:  </span>        <span class="kwrd">SELECT</span></pre>
<pre class="alt"><span class="lnum">  25:  </span>            ApplicationId</pre>
<pre><span class="lnum">  26:  </span>            , RoleId</pre>
<pre class="alt"><span class="lnum">  27:  </span>            , RoleName</pre>
<pre><span class="lnum">  28:  </span>            , LoweredRoleName</pre>
<pre class="alt"><span class="lnum">  29:  </span>            , Description</pre>
<pre><span class="lnum">  30:  </span>            , ParentRoleId</pre>
<pre class="alt"><span class="lnum">  31:  </span>            , 1 <span class="kwrd">AS</span> HierarchyLevel</pre>
<pre><span class="lnum">  32:  </span>        <span class="kwrd">FROM</span> aspnet_Roles</pre>
<pre class="alt"><span class="lnum">  33:  </span>        <span class="kwrd">WHERE</span> RoleId = @RoleId</pre>
<pre><span class="lnum">  34:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  35:  </span>        <span class="kwrd">UNION</span> <span class="kwrd">ALL</span></pre>
<pre><span class="lnum">  36:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  37:  </span>        <span class="kwrd">SELECT</span></pre>
<pre><span class="lnum">  38:  </span>            aspnet_Roles.ApplicationId</pre>
<pre class="alt"><span class="lnum">  39:  </span>            , aspnet_Roles.RoleId</pre>
<pre><span class="lnum">  40:  </span>            , aspnet_Roles.RoleName</pre>
<pre class="alt"><span class="lnum">  41:  </span>            , aspnet_Roles.LoweredRoleName</pre>
<pre><span class="lnum">  42:  </span>            , aspnet_Roles.Description</pre>
<pre class="alt"><span class="lnum">  43:  </span>            , aspnet_Roles.ParentRoleId</pre>
<pre><span class="lnum">  44:  </span>            , aspnet_Roles_CTE.HierarchyLevel + 1 <span class="kwrd">AS</span> HierarchyLevel</pre>
<pre class="alt"><span class="lnum">  45:  </span>        <span class="kwrd">FROM</span> aspnet_Roles</pre>
<pre><span class="lnum">  46:  </span>        <span class="kwrd">INNER</span> <span class="kwrd">JOIN</span> aspnet_Roles_CTE</pre>
<pre class="alt"><span class="lnum">  47:  </span>            <span class="kwrd">ON</span> aspnet_Roles.ParentRoleId = aspnet_Roles_CTE.RoleId</pre>
<pre><span class="lnum">  48:  </span>    )</pre>
<pre class="alt"><span class="lnum">  49:  </span>&#160;</pre>
<pre><span class="lnum">  50:  </span>    INSERT <span class="kwrd">INTO</span> @aspnet_Roles (</pre>
<pre class="alt"><span class="lnum">  51:  </span>        ApplicationId</pre>
<pre><span class="lnum">  52:  </span>        , RoleId</pre>
<pre class="alt"><span class="lnum">  53:  </span>        , RoleName</pre>
<pre><span class="lnum">  54:  </span>        , LoweredRoleName</pre>
<pre class="alt"><span class="lnum">  55:  </span>        , Description</pre>
<pre><span class="lnum">  56:  </span>        , ParentRoleId</pre>
<pre class="alt"><span class="lnum">  57:  </span>    )</pre>
<pre><span class="lnum">  58:  </span>    <span class="kwrd">SELECT</span></pre>
<pre class="alt"><span class="lnum">  59:  </span>        ApplicationId</pre>
<pre><span class="lnum">  60:  </span>        , RoleId</pre>
<pre class="alt"><span class="lnum">  61:  </span>        , RoleName</pre>
<pre><span class="lnum">  62:  </span>        , LoweredRoleName</pre>
<pre class="alt"><span class="lnum">  63:  </span>        , Description</pre>
<pre><span class="lnum">  64:  </span>        , ParentRoleId</pre>
<pre class="alt"><span class="lnum">  65:  </span>    <span class="kwrd">FROM</span> aspnet_Roles_CTE</pre>
<pre><span class="lnum">  66:  </span>    <span class="kwrd">ORDER</span> <span class="kwrd">BY</span> HierarchyLevel </pre>
<pre class="alt"><span class="lnum">  67:  </span>    </pre>
<pre><span class="lnum">  68:  </span>    <span class="kwrd">RETURN</span> </pre>
<pre class="alt"><span class="lnum">  69:  </span>END</pre>
</div>
<p>then you&#8217;ll need to modify two stored procedures:</p>
<div class="csharpcode">
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">ALTER</span> <span class="kwrd">PROCEDURE</span> [tos].[aspnet_UsersInRoles_IsUserInRole]</pre>
<pre><span class="lnum">   2:  </span>    @ApplicationName  nvarchar(256),</pre>
<pre class="alt"><span class="lnum">   3:  </span>    @UserName         nvarchar(256),</pre>
<pre><span class="lnum">   4:  </span>    @RoleName         nvarchar(256),</pre>
<pre class="alt"><span class="lnum">   5:  </span>    @Exclusive        <span class="kwrd">bit</span> = 0</pre>
<pre><span class="lnum">   6:  </span><span class="kwrd">AS</span></pre>
<pre class="alt"><span class="lnum">   7:  </span><span class="kwrd">BEGIN</span></pre>
<pre><span class="lnum">   8:  </span>    <span class="kwrd">DECLARE</span> @ApplicationId uniqueidentifier</pre>
<pre class="alt"><span class="lnum">   9:  </span>    <span class="kwrd">SELECT</span>  @ApplicationId = <span class="kwrd">NULL</span></pre>
<pre><span class="lnum">  10:  </span>    <span class="kwrd">SELECT</span>  @ApplicationId = ApplicationId <span class="kwrd">FROM</span> aspnet_Applications <span class="kwrd">WHERE</span> <span class="kwrd">LOWER</span>(@ApplicationName) = LoweredApplicationName</pre>
<pre class="alt"><span class="lnum">  11:  </span>    <span class="kwrd">IF</span> (@ApplicationId <span class="kwrd">IS</span> <span class="kwrd">NULL</span>)</pre>
<pre><span class="lnum">  12:  </span>        <span class="kwrd">RETURN</span>(2)</pre>
<pre class="alt"><span class="lnum">  13:  </span>    <span class="kwrd">DECLARE</span> @UserId uniqueidentifier</pre>
<pre><span class="lnum">  14:  </span>    <span class="kwrd">SELECT</span>  @UserId = <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum">  15:  </span>    <span class="kwrd">DECLARE</span> @RoleId uniqueidentifier</pre>
<pre><span class="lnum">  16:  </span>    <span class="kwrd">SELECT</span>  @RoleId = <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum">  17:  </span>&#160;</pre>
<pre><span class="lnum">  18:  </span>    <span class="kwrd">SELECT</span>  @UserId = UserId</pre>
<pre class="alt"><span class="lnum">  19:  </span>    <span class="kwrd">FROM</span>    tos.aspnet_Users</pre>
<pre><span class="lnum">  20:  </span>    <span class="kwrd">WHERE</span>   LoweredUserName = <span class="kwrd">LOWER</span>(@UserName) <span class="kwrd">AND</span> ApplicationId = @ApplicationId</pre>
<pre class="alt"><span class="lnum">  21:  </span>&#160;</pre>
<pre><span class="lnum">  22:  </span>    <span class="kwrd">IF</span> (@UserId <span class="kwrd">IS</span> <span class="kwrd">NULL</span>)</pre>
<pre class="alt"><span class="lnum">  23:  </span>        <span class="kwrd">RETURN</span>(2)</pre>
<pre><span class="lnum">  24:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  25:  </span>    <span class="kwrd">SELECT</span>  @RoleId = RoleId</pre>
<pre><span class="lnum">  26:  </span>    <span class="kwrd">FROM</span>    tos.aspnet_Roles</pre>
<pre class="alt"><span class="lnum">  27:  </span>    <span class="kwrd">WHERE</span>   LoweredRoleName = <span class="kwrd">LOWER</span>(@RoleName) <span class="kwrd">AND</span> ApplicationId = @ApplicationId</pre>
<pre><span class="lnum">  28:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  29:  </span>    <span class="kwrd">IF</span> (@RoleId <span class="kwrd">IS</span> <span class="kwrd">NULL</span>)</pre>
<pre><span class="lnum">  30:  </span>        <span class="kwrd">RETURN</span>(3)</pre>
<pre class="alt"><span class="lnum">  31:  </span>&#160;</pre>
<pre><span class="lnum">  32:  </span>/*</pre>
<pre class="alt"><span class="lnum">  33:  </span>    <span class="kwrd">IF</span> (<span class="kwrd">EXISTS</span>( <span class="kwrd">SELECT</span> * <span class="kwrd">FROM</span> tos.aspnet_UsersInRoles <span class="kwrd">WHERE</span>  UserId = @UserId <span class="kwrd">AND</span> RoleId = @RoleId))</pre>
<pre><span class="lnum">  34:  </span>        <span class="kwrd">RETURN</span>(1)</pre>
<pre class="alt"><span class="lnum">  35:  </span>    <span class="kwrd">ELSE</span></pre>
<pre><span class="lnum">  36:  </span>        <span class="kwrd">RETURN</span>(0)</pre>
<pre class="alt"><span class="lnum">  37:  </span>*/</pre>
<pre><span class="lnum">  38:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  39:  </span>    <span class="kwrd">IF</span> @Exclusive = 1</pre>
<pre><span class="lnum">  40:  </span>        <span class="kwrd">BEGIN</span></pre>
<pre class="alt"><span class="lnum">  41:  </span>            <span class="kwrd">IF</span> (<span class="kwrd">EXISTS</span>( <span class="kwrd">SELECT</span> * <span class="kwrd">FROM</span> tos.aspnet_UsersInRoles <span class="kwrd">WHERE</span>  UserId = @UserId <span class="kwrd">AND</span> RoleId = @RoleId))</pre>
<pre><span class="lnum">  42:  </span>                <span class="kwrd">RETURN</span>(1)</pre>
<pre class="alt"><span class="lnum">  43:  </span>            <span class="kwrd">ELSE</span></pre>
<pre><span class="lnum">  44:  </span>                <span class="kwrd">RETURN</span>(0)</pre>
<pre class="alt"><span class="lnum">  45:  </span>        <span class="kwrd">END</span></pre>
<pre><span class="lnum">  46:  </span>    <span class="kwrd">ELSE</span></pre>
<pre class="alt"><span class="lnum">  47:  </span>        <span class="kwrd">BEGIN</span></pre>
<pre><span class="lnum">  48:  </span>            <span class="kwrd">IF</span>( <span class="kwrd">EXISTS</span>( <span class="kwrd">SELECT</span> * <span class="kwrd">FROM</span> tos.aspnet_Roles_Ancestor_TVF( @RoleId ) r <span class="kwrd">INNER</span> <span class="kwrd">JOIN</span> tos.aspnet_UsersInRoles ur <span class="kwrd">ON</span> r.RoleId = ur.RoleId <span class="kwrd">WHERE</span> ur.UserId = @UserId ) )</pre>
<pre class="alt"><span class="lnum">  49:  </span>                <span class="kwrd">RETURN</span>(1)</pre>
<pre><span class="lnum">  50:  </span>            <span class="kwrd">ELSE</span></pre>
<pre class="alt"><span class="lnum">  51:  </span>                <span class="kwrd">RETURN</span>(0)</pre>
<pre><span class="lnum">  52:  </span>        <span class="kwrd">END</span></pre>
<pre class="alt"><span class="lnum">  53:  </span>&#160;</pre>
<pre><span class="lnum">  54:  </span><span class="kwrd">END</span></pre>
</p></div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</div>
<div class="csharpcode">&#160;</div>
<div class="csharpcode">and:</div>
<div class="csharpcode">&#160;</div>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">ALTER</span> <span class="kwrd">PROCEDURE</span> [tos].[aspnet_UsersInRoles_GetRolesForUser]</pre>
<pre><span class="lnum">   2:  </span>    @ApplicationName nvarchar(256)</pre>
<pre class="alt"><span class="lnum">   3:  </span>    , @UserName nvarchar(256)</pre>
<pre><span class="lnum">   4:  </span>    , @Exclusive <span class="kwrd">bit</span> = 0</pre>
<pre class="alt"><span class="lnum">   5:  </span><span class="kwrd">AS</span></pre>
<pre><span class="lnum">   6:  </span><span class="kwrd">BEGIN</span></pre>
<pre class="alt"><span class="lnum">   7:  </span>    <span class="kwrd">DECLARE</span> @ApplicationId uniqueidentifier</pre>
<pre><span class="lnum">   8:  </span>    <span class="kwrd">SELECT</span>  @ApplicationId = <span class="kwrd">NULL</span></pre>
<pre class="alt"><span class="lnum">   9:  </span>    <span class="kwrd">SELECT</span>  @ApplicationId = ApplicationId</pre>
<pre><span class="lnum">  10:  </span>    <span class="kwrd">FROM</span> aspnet_Applications</pre>
<pre class="alt"><span class="lnum">  11:  </span>    <span class="kwrd">WHERE</span> <span class="kwrd">LOWER</span>(@ApplicationName) = LoweredApplicationName</pre>
<pre><span class="lnum">  12:  </span>    <span class="kwrd">IF</span> (@ApplicationId <span class="kwrd">IS</span> <span class="kwrd">NULL</span>)</pre>
<pre class="alt"><span class="lnum">  13:  </span>        <span class="kwrd">RETURN</span>(1)</pre>
<pre><span class="lnum">  14:  </span>    <span class="kwrd">DECLARE</span> @UserId uniqueidentifier</pre>
<pre class="alt"><span class="lnum">  15:  </span>    <span class="kwrd">SELECT</span>  @UserId = <span class="kwrd">NULL</span></pre>
<pre><span class="lnum">  16:  </span>    <span class="kwrd">SELECT</span>  @UserId = UserId</pre>
<pre class="alt"><span class="lnum">  17:  </span>    <span class="kwrd">FROM</span> tos.aspnet_Users</pre>
<pre><span class="lnum">  18:  </span>    <span class="kwrd">WHERE</span> LoweredUserName = <span class="kwrd">LOWER</span>(@UserName)</pre>
<pre class="alt"><span class="lnum">  19:  </span>    <span class="kwrd">AND</span> ApplicationId = @ApplicationId</pre>
<pre><span class="lnum">  20:  </span>    <span class="kwrd">IF</span> (@UserId <span class="kwrd">IS</span> <span class="kwrd">NULL</span>)</pre>
<pre class="alt"><span class="lnum">  21:  </span>        <span class="kwrd">RETURN</span>(1)</pre>
<pre><span class="lnum">  22:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  23:  </span>/*</pre>
<pre><span class="lnum">  24:  </span>    <span class="kwrd">SELECT</span> r.RoleName</pre>
<pre class="alt"><span class="lnum">  25:  </span>    <span class="kwrd">FROM</span> tos.aspnet_Roles r, tos.aspnet_UsersInRoles ur</pre>
<pre><span class="lnum">  26:  </span>    <span class="kwrd">WHERE</span>  r.RoleId = ur.RoleId</pre>
<pre class="alt"><span class="lnum">  27:  </span>    <span class="kwrd">AND</span> r.ApplicationId = @ApplicationId</pre>
<pre><span class="lnum">  28:  </span>    <span class="kwrd">AND</span> ur.UserId = @UserId</pre>
<pre class="alt"><span class="lnum">  29:  </span>    <span class="kwrd">ORDER</span> <span class="kwrd">BY</span> r.RoleName</pre>
<pre><span class="lnum">  30:  </span>*/</pre>
<pre class="alt"><span class="lnum">  31:  </span>&#160;</pre>
<pre><span class="lnum">  32:  </span>    <span class="kwrd">IF</span> @Exclusive = 1</pre>
<pre class="alt"><span class="lnum">  33:  </span>        <span class="kwrd">BEGIN</span></pre>
<pre><span class="lnum">  34:  </span>            <span class="kwrd">SELECT</span> r.RoleName</pre>
<pre class="alt"><span class="lnum">  35:  </span>            <span class="kwrd">FROM</span> tos.aspnet_Roles r, tos.aspnet_UsersInRoles ur</pre>
<pre><span class="lnum">  36:  </span>            <span class="kwrd">WHERE</span>  r.RoleId = ur.RoleId</pre>
<pre class="alt"><span class="lnum">  37:  </span>            <span class="kwrd">AND</span> r.ApplicationId = @ApplicationId</pre>
<pre><span class="lnum">  38:  </span>            <span class="kwrd">AND</span> ur.UserId = @UserId</pre>
<pre class="alt"><span class="lnum">  39:  </span>            <span class="kwrd">ORDER</span> <span class="kwrd">BY</span> r.RoleName</pre>
<pre><span class="lnum">  40:  </span>        <span class="kwrd">END</span></pre>
<pre class="alt"><span class="lnum">  41:  </span>    <span class="kwrd">ELSE</span></pre>
<pre><span class="lnum">  42:  </span>        <span class="kwrd">BEGIN</span></pre>
<pre class="alt"><span class="lnum">  43:  </span>            <span class="kwrd">DECLARE</span> @RoleId uniqueidentifier</pre>
<pre><span class="lnum">  44:  </span>            <span class="kwrd">DECLARE</span> @RoleName nvarchar(256)</pre>
<pre class="alt"><span class="lnum">  45:  </span>            <span class="kwrd">DECLARE</span> @aspnet_Roles <span class="kwrd">TABLE</span> (</pre>
<pre><span class="lnum">  46:  </span>                RoleName nvarchar(256)</pre>
<pre class="alt"><span class="lnum">  47:  </span>            )</pre>
<pre><span class="lnum">  48:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  49:  </span>            <span class="kwrd">SELECT</span> @RoleName = <span class="kwrd">MIN</span>( r.RoleName )</pre>
<pre><span class="lnum">  50:  </span>            <span class="kwrd">FROM</span> tos.aspnet_Roles r, tos.aspnet_UsersInRoles ur</pre>
<pre class="alt"><span class="lnum">  51:  </span>            <span class="kwrd">WHERE</span>  r.RoleId = ur.RoleId</pre>
<pre><span class="lnum">  52:  </span>            <span class="kwrd">AND</span> r.ApplicationId = @ApplicationId</pre>
<pre class="alt"><span class="lnum">  53:  </span>            <span class="kwrd">AND</span> ur.UserId = @UserId</pre>
<pre><span class="lnum">  54:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  55:  </span>            <span class="kwrd">WHILE</span> @RoleName <span class="kwrd">IS</span> <span class="kwrd">NOT</span> <span class="kwrd">NULL</span></pre>
<pre><span class="lnum">  56:  </span>                <span class="kwrd">BEGIN</span></pre>
<pre class="alt"><span class="lnum">  57:  </span>                    <span class="kwrd">SET</span> @RoleId = ( <span class="kwrd">SELECT</span> RoleId <span class="kwrd">FROM</span> tos.aspnet_Roles <span class="kwrd">WHERE</span> RoleName = @RoleName )</pre>
<pre><span class="lnum">  58:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  59:  </span>                    INSERT <span class="kwrd">INTO</span> @aspnet_Roles (</pre>
<pre><span class="lnum">  60:  </span>                        RoleName</pre>
<pre class="alt"><span class="lnum">  61:  </span>                    )</pre>
<pre><span class="lnum">  62:  </span>                    <span class="kwrd">SELECT</span></pre>
<pre class="alt"><span class="lnum">  63:  </span>                        RoleName</pre>
<pre><span class="lnum">  64:  </span>                    <span class="kwrd">FROM</span> tos.aspnet_Roles_Descendant_TVF( @RoleId ) rd</pre>
<pre class="alt"><span class="lnum">  65:  </span>&#160;</pre>
<pre><span class="lnum">  66:  </span>                    <span class="kwrd">SELECT</span> @RoleName = <span class="kwrd">MIN</span>( r.RoleName )</pre>
<pre class="alt"><span class="lnum">  67:  </span>                    <span class="kwrd">FROM</span> tos.aspnet_Roles r, tos.aspnet_UsersInRoles ur</pre>
<pre><span class="lnum">  68:  </span>                    <span class="kwrd">WHERE</span>  r.RoleId = ur.RoleId</pre>
<pre class="alt"><span class="lnum">  69:  </span>                    <span class="kwrd">AND</span> r.ApplicationId = @ApplicationId</pre>
<pre><span class="lnum">  70:  </span>                    <span class="kwrd">AND</span> ur.UserId = @UserId</pre>
<pre class="alt"><span class="lnum">  71:  </span>                    <span class="kwrd">AND</span> RoleName &gt; @RoleName</pre>
<pre><span class="lnum">  72:  </span>                <span class="kwrd">END</span></pre>
<pre class="alt"><span class="lnum">  73:  </span>&#160;</pre>
<pre><span class="lnum">  74:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  75:  </span>            <span class="kwrd">SELECT</span> <span class="kwrd">DISTINCT</span> RoleName</pre>
<pre><span class="lnum">  76:  </span>            <span class="kwrd">FROM</span> @aspnet_Roles r</pre>
<pre class="alt"><span class="lnum">  77:  </span>            <span class="kwrd">ORDER</span> <span class="kwrd">BY</span> r.RoleName</pre>
<pre><span class="lnum">  78:  </span>        <span class="kwrd">END</span></pre>
<pre class="alt"><span class="lnum">  79:  </span>&#160;</pre>
<pre><span class="lnum">  80:  </span>&#160;</pre>
<pre class="alt"><span class="lnum">  81:  </span>    <span class="kwrd">RETURN</span> (0)</pre>
<pre><span class="lnum">  82:  </span>END</pre>
</div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>add the parent unique identifiers as necessary and you&#8217;re done </p>
]]></content:encoded>
			<wfw:commentRss>http://mark.tremaine.net/howto/hierarchical-sql-role-provider/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Server Service Broker</title>
		<link>http://mark.tremaine.net/tips-tricks/sql-server-service-broker/</link>
		<comments>http://mark.tremaine.net/tips-tricks/sql-server-service-broker/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 11:52:21 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[whitepaper]]></category>

		<guid isPermaLink="false">http://mark.tremaine.net/tips-tricks/sql-server-service-broker/</guid>
		<description><![CDATA[There exists a new feature in Microsoft SQL Server 2005 called Service Broker.&#160; With Service Broker, internal or external processes can send and receive guaranteed, asynchronous messaging by using extensions to Transact-SQL. Read More One way to utilize this feature is by implementing SQLCacheDependency within a SqlSiteMapProvider.&#160; Thus allowing the SqlSiteMapProvider to update as changes [...]]]></description>
			<content:encoded><![CDATA[<p>There exists a new feature in Microsoft SQL Server 2005 called Service Broker.&#160; With Service Broker, internal or external processes can send and receive guaranteed, asynchronous messaging by using extensions to Transact-SQL.</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms345108.aspx" target="_blank">Read More</a></p>
<p>One way to utilize this feature is by implementing SQLCacheDependency within a SqlSiteMapProvider.&#160; Thus allowing the SqlSiteMapProvider to update as changes occur to the SiteMap table.</p>
<p>Here&#8217;s a quick snippet to enable this feature within the database:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">ALTER</span> <span class="kwrd">DATABASE</span> YOUR_DATABASE_NAME <span class="kwrd">SET</span> NEW_BROKER <span class="kwrd">WITH</span> <span class="kwrd">ROLLBACK</span> <span class="kwrd">IMMEDIATE</span></pre>
<pre><span class="lnum">   2:  </span><span class="kwrd">GO</span></pre>
<pre class="alt"><span class="lnum">   3:  </span><span class="kwrd">ALTER</span> <span class="kwrd">DATABASE</span> YOUR_DATABASE_NAME <span class="kwrd">SET</span> ENABLE_BROKER</pre>
<pre><span class="lnum">   4:  </span><span class="kwrd">GO</span></pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>If you plan to use Service Broker for your own notification queries be sure to follow the <a href="http://msdn.microsoft.com/en-us/library/ms181122.aspx" target="_blank">rules</a>.</p>
<p>Additionally, the SQL user must either be a member of the db_owner fixed database role for the intended database or the sysadmin fixed server role.&#160; I read that the user could alternately belong to the db_ddladmin fixed database role for the intended database, however; I was not able to get this configuration to work.</p>
<p>Lastly, if you are working within a schema other then dbo, the SQL user used to query the Service Broker must be the schema owner, not a SQL role.&#160; This has to do with the fact that a role cannot be assigned a default schema, and thus defaults to the dbo schema.&#160; </p>
]]></content:encoded>
			<wfw:commentRss>http://mark.tremaine.net/tips-tricks/sql-server-service-broker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recursive Queries in SQL Server 2005</title>
		<link>http://mark.tremaine.net/tips-tricks/recursive-queries-in-sql-server-2005/</link>
		<comments>http://mark.tremaine.net/tips-tricks/recursive-queries-in-sql-server-2005/#comments</comments>
		<pubDate>Thu, 18 Sep 2008 19:34:41 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[FOR XML]]></category>
		<category><![CDATA[PIVOT]]></category>
		<category><![CDATA[recursion]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[SQL Server 2005]]></category>

		<guid isPermaLink="false">http://mark.tremaine.net/uncategorized/recursive-queries-in-sql-server-2005/</guid>
		<description><![CDATA[among other improvements, SQL Server 2005 included a new XML datatype and enhanced XML functions &#8230; thus providing another solution for recursive queries &#8230; for example &#8230; if i want to get a list of all of the tables in my database with their associated columns &#8230;&#160; i might write the following query: 1: SELECT [...]]]></description>
			<content:encoded><![CDATA[<p>among other improvements, SQL Server 2005 included a new XML datatype and enhanced XML functions &#8230; thus providing another solution for recursive queries &#8230; </p>
<p>for example &#8230; if i want to get a list of all of the tables in my database with their associated columns &#8230;&#160; i might write the following query:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">SELECT</span></pre>
<pre><span class="lnum">   2:  </span>    sys.objects.object_id <span class="kwrd">AS</span> ENTITY_ID</pre>
<pre class="alt"><span class="lnum">   3:  </span>    , sys.objects.type <span class="kwrd">AS</span> ENTITY_TYPE</pre>
<pre><span class="lnum">   4:  </span>    , sys.objects.name <span class="kwrd">AS</span> ENTITY_NAME</pre>
<pre class="alt"><span class="lnum">   5:  </span>    , sys.columns.column_id <span class="kwrd">AS</span> COLUMN_ID</pre>
<pre><span class="lnum">   6:  </span>    , sys.columns.system_type_id <span class="kwrd">AS</span> COLUMN_TYPE</pre>
<pre class="alt"><span class="lnum">   7:  </span>    , sys.columns.name <span class="kwrd">AS</span> COLUMN_NAME</pre>
<pre><span class="lnum">   8:  </span><span class="kwrd">FROM</span> sys.objects</pre>
<pre class="alt"><span class="lnum">   9:  </span><span class="kwrd">INNER</span> <span class="kwrd">JOIN</span> sys.columns</pre>
<pre><span class="lnum">  10:  </span>    <span class="kwrd">ON</span> sys.objects.object_id = sys.columns.object_id</pre>
<pre class="alt"><span class="lnum">  11:  </span><span class="kwrd">ORDER</span> <span class="kwrd">BY</span> sys.objects.type, sys.objects.name, sys.columns.column_id</pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>however, if i want to return only as many rows as i have tables i would have to rewrite that query to either use a CTE pivot, a complex case statement, or i could take advantage of the new xml functions and xpath:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">SELECT</span></pre>
<pre><span class="lnum">   2:  </span>    sys.objects.object_id <span class="kwrd">AS</span> ENTITY_ID</pre>
<pre class="alt"><span class="lnum">   3:  </span>    , sys.objects.type <span class="kwrd">AS</span> ENTITY_TYPE</pre>
<pre><span class="lnum">   4:  </span>    , sys.objects.name <span class="kwrd">AS</span> ENTITY_NAME</pre>
<pre class="alt"><span class="lnum">   5:  </span>    , <span class="kwrd">CONVERT</span>(</pre>
<pre><span class="lnum">   6:  </span>        <span class="kwrd">varchar</span>(<span class="kwrd">max</span>), <span class="kwrd">CONVERT</span>(</pre>
<pre class="alt"><span class="lnum">   7:  </span>            xml, (</pre>
<pre><span class="lnum">   8:  </span>                <span class="kwrd">SELECT</span></pre>
<pre class="alt"><span class="lnum">   9:  </span>                    <span class="kwrd">CASE</span></pre>
<pre><span class="lnum">  10:  </span>                          <span class="kwrd">WHEN</span> sys.columns.column_id &gt; 1 <span class="kwrd">THEN</span> <span class="str">','</span></pre>
<pre class="alt"><span class="lnum">  11:  </span>                          <span class="kwrd">ELSE</span> <span class="str">''</span></pre>
<pre><span class="lnum">  12:  </span>                        <span class="kwrd">END</span> <span class="kwrd">AS</span> DELIMETER</pre>
<pre class="alt"><span class="lnum">  13:  </span>                    , sys.columns.name <span class="kwrd">AS</span> COLUMN_NAME</pre>
<pre><span class="lnum">  14:  </span>                <span class="kwrd">FROM</span> sys.columns</pre>
<pre class="alt"><span class="lnum">  15:  </span>                <span class="kwrd">WHERE</span> sys.columns.object_id = sys.objects.object_id</pre>
<pre><span class="lnum">  16:  </span>                <span class="kwrd">ORDER</span> <span class="kwrd">BY</span> sys.columns.column_id</pre>
<pre class="alt"><span class="lnum">  17:  </span>                <span class="kwrd">FOR</span> XML RAW, ROOT( <span class="str">'root'</span> ), ELEMENTS XSINIL</pre>
<pre><span class="lnum">  18:  </span>            )</pre>
<pre class="alt"><span class="lnum">  19:  </span>        ).query(<span class="str">'//row/*/text()'</span>)</pre>
<pre><span class="lnum">  20:  </span>    ) <span class="kwrd">AS</span> COLUMN_LIST</pre>
<pre class="alt"><span class="lnum">  21:  </span><span class="kwrd">FROM</span> sys.objects</pre>
<pre><span class="lnum">  22:  </span><span class="kwrd">ORDER</span> <span class="kwrd">BY</span> sys.objects.type, sys.objects.name</pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>happy programming!</p>
]]></content:encoded>
			<wfw:commentRss>http://mark.tremaine.net/tips-tricks/recursive-queries-in-sql-server-2005/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

