<?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>Penguinsoft &#187; t-sql</title>
	<atom:link href="http://penguinsoft.us/tag/t-sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://penguinsoft.us</link>
	<description>Application Development, Web Development, Innovative Software Solutions</description>
	<lastBuildDate>Mon, 23 Jan 2012 18:45:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Multi-language support in T-SQL</title>
		<link>http://penguinsoft.us/2010/03/multi-language-support-in-t-sql/</link>
		<comments>http://penguinsoft.us/2010/03/multi-language-support-in-t-sql/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 06:02:55 +0000</pubDate>
		<dc:creator>Tomi Lehto</dc:creator>
				<category><![CDATA[Code and Servers]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[t-sql]]></category>

		<guid isPermaLink="false">http://penguinsoft.us/?p=200</guid>
		<description><![CDATA[This is brilliant, a little scary, but brilliant. (note added July 2010: OK, A LOT SCARY!) While back we built a website supporting unlimited languages and articles. For a reason unknown I decided to keep all my content in one table, index it and link my other tables to it. This concept is quite interesting, ...]]></description>
			<content:encoded><![CDATA[<p>This is brilliant, a little scary, but brilliant. (note added July 2010: OK, A LOT SCARY!)</p>
<p>While back we built a website supporting unlimited languages and articles. For a reason unknown I decided to keep all my content in one table, index it and link my other tables to it.<span id="more-200"></span></p>
<p>This concept is quite interesting, I think it&#8217;s worth a look. Check out a sample Stored Procedure:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">PROCEDURE</span> dbo<span style="color: #66cc66;">.</span>SPSelectArticles
	@categoryid <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">,</span>
	@languageid <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">,</span>
	@defaultlanguageid <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">,</span>
	@maxarticles <span style="color: #993333; font-weight: bold;">INT</span>
<span style="color: #993333; font-weight: bold;">AS</span>
<span style="color: #993333; font-weight: bold;">SET</span> ROWCOUNT @maxarticles
	<span style="color: #993333; font-weight: bold;">SELECT</span>
			A<span style="color: #66cc66;">.</span>id <span style="color: #993333; font-weight: bold;">AS</span> id<span style="color: #66cc66;">,</span> CT<span style="color: #66cc66;">.</span>content <span style="color: #993333; font-weight: bold;">AS</span> title<span style="color: #66cc66;">,</span> CD<span style="color: #66cc66;">.</span>content <span style="color: #993333; font-weight: bold;">AS</span> description<span style="color: #66cc66;">,</span> A<span style="color: #66cc66;">.</span>publishdate <span style="color: #993333; font-weight: bold;">AS</span> publishdate<span style="color: #66cc66;">,</span> AC<span style="color: #66cc66;">.</span>color <span style="color: #993333; font-weight: bold;">AS</span> categorycolor<span style="color: #66cc66;">,</span>
			<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AS</span> iscorrectlanguage
	<span style="color: #993333; font-weight: bold;">FROM</span>	articles A
	<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span>
		contentitems CT <span style="color: #993333; font-weight: bold;">ON</span> CT<span style="color: #66cc66;">.</span>cid <span style="color: #66cc66;">=</span> A<span style="color: #66cc66;">.</span>title_cid <span style="color: #993333; font-weight: bold;">AND</span> CT<span style="color: #66cc66;">.</span>languageid <span style="color: #66cc66;">=</span> @languageid
	<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span>
		contentitems CD <span style="color: #993333; font-weight: bold;">ON</span> CD<span style="color: #66cc66;">.</span>cid <span style="color: #66cc66;">=</span> A<span style="color: #66cc66;">.</span>description_cid <span style="color: #993333; font-weight: bold;">AND</span> CD<span style="color: #66cc66;">.</span>languageid <span style="color: #66cc66;">=</span> @languageid
	<span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span>
		articlecategories AC <span style="color: #993333; font-weight: bold;">ON</span> A<span style="color: #66cc66;">.</span>categoryid <span style="color: #66cc66;">=</span> AC<span style="color: #66cc66;">.</span>id
	<span style="color: #993333; font-weight: bold;">WHERE</span>	A<span style="color: #66cc66;">.</span>publishdate &amp;lt; GETDATE<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span>
		A<span style="color: #66cc66;">.</span>categoryid <span style="color: #66cc66;">=</span> @categoryid <span style="color: #993333; font-weight: bold;">AND</span>
		CT<span style="color: #66cc66;">.</span>content <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>
<span style="color: #993333; font-weight: bold;">UNION</span> <span style="color: #993333; font-weight: bold;">ALL</span>
	<span style="color: #993333; font-weight: bold;">SELECT</span>
			A<span style="color: #66cc66;">.</span>id <span style="color: #993333; font-weight: bold;">AS</span> id<span style="color: #66cc66;">,</span> CTD<span style="color: #66cc66;">.</span>content <span style="color: #993333; font-weight: bold;">AS</span> title<span style="color: #66cc66;">,</span> CDD<span style="color: #66cc66;">.</span>content <span style="color: #993333; font-weight: bold;">AS</span> description<span style="color: #66cc66;">,</span> A<span style="color: #66cc66;">.</span>publishdate <span style="color: #993333; font-weight: bold;">AS</span> publishdate<span style="color: #66cc66;">,</span> AC<span style="color: #66cc66;">.</span>color <span style="color: #993333; font-weight: bold;">AS</span> categorycolor<span style="color: #66cc66;">,</span>
			<span style="color: #cc66cc;">0</span> <span style="color: #993333; font-weight: bold;">AS</span> iscorrectlanguage
	<span style="color: #993333; font-weight: bold;">FROM</span>	articles A
	<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span>
		contentitems CTD <span style="color: #993333; font-weight: bold;">ON</span> CTD<span style="color: #66cc66;">.</span>cid <span style="color: #66cc66;">=</span> A<span style="color: #66cc66;">.</span>title_cid <span style="color: #993333; font-weight: bold;">AND</span> CTD<span style="color: #66cc66;">.</span>languageid <span style="color: #66cc66;">=</span> @defaultlanguageid
	<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span>
		contentitems CDD <span style="color: #993333; font-weight: bold;">ON</span> CDD<span style="color: #66cc66;">.</span>cid <span style="color: #66cc66;">=</span> A<span style="color: #66cc66;">.</span>description_cid <span style="color: #993333; font-weight: bold;">AND</span> CDD<span style="color: #66cc66;">.</span>languageid <span style="color: #66cc66;">=</span> @defaultlanguageid
	<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span>
		contentitems CT <span style="color: #993333; font-weight: bold;">ON</span> CT<span style="color: #66cc66;">.</span>cid <span style="color: #66cc66;">=</span> A<span style="color: #66cc66;">.</span>title_cid <span style="color: #993333; font-weight: bold;">AND</span> CT<span style="color: #66cc66;">.</span>languageid <span style="color: #66cc66;">=</span> @languageid
	<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span>
		contentitems CD <span style="color: #993333; font-weight: bold;">ON</span> CD<span style="color: #66cc66;">.</span>cid <span style="color: #66cc66;">=</span> A<span style="color: #66cc66;">.</span>description_cid <span style="color: #993333; font-weight: bold;">AND</span> CD<span style="color: #66cc66;">.</span>languageid <span style="color: #66cc66;">=</span> @languageid
	<span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span>
		articlecategories AC <span style="color: #993333; font-weight: bold;">ON</span> A<span style="color: #66cc66;">.</span>categoryid <span style="color: #66cc66;">=</span> AC<span style="color: #66cc66;">.</span>id
	<span style="color: #993333; font-weight: bold;">WHERE</span>	A<span style="color: #66cc66;">.</span>publishdate &amp;lt; GETDATE<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span>
		A<span style="color: #66cc66;">.</span>categoryid <span style="color: #66cc66;">=</span> @categoryid <span style="color: #993333; font-weight: bold;">AND</span>
		CT<span style="color: #66cc66;">.</span>content <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span>
		<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> A<span style="color: #66cc66;">.</span>publishdate <span style="color: #993333; font-weight: bold;">DESC</span></pre></div></div>

<p>The big idea is to pass a language id to this SP, and it does the rest. All the content on a page just changes based on the languageid. I built SP&#8217;s like this for main content, random words here and there and this one for articles.</p>
<p>Beauty in this beast is the fact that it looks if translation exists, and returns the default language if not found &#8211; in this case English. And it&#8217;s reasonably fast, this is written around 4 years ago!</p>
<p>Site has now served almost 6 million (yes, millions) page views in the past 2 years, and is still going strong.</p>
<p>Let me know what you think!</p>
]]></content:encoded>
			<wfw:commentRss>http://penguinsoft.us/2010/03/multi-language-support-in-t-sql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

