<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><title>scherbinin</title><link>http://scherbinin.blog.ru/</link><description>scherbinin - Блог.ру</description><lastBuildDate>Tue, 02 Aug 2011 21:26:53 GMT</lastBuildDate><generator>Блог.ру</generator><image><url>http://stat8.blog.ru/am/0812c1411bbaa719529ac1334e58462e</url><link>http://scherbinin.blog.ru/</link><title>scherbinin</title><width>75</width><height>100</height></image><item><guid isPermaLink="true">http://scherbinin.blog.ru/124161315.html</guid><pubDate>Tue, 02 Aug 2011 21:26:53 GMT</pubDate><title>Не очень известный факт о кластерном индексе</title><link>http://scherbinin.blog.ru/124161315.html</link><description>&lt;span class="Apple-style-span" style="border-collapse: separate; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium; font-family: 'Times New Roman'; color: #000000"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; font-family: Arial,Tahoma,Verdana,sans-serif; color: #222222"&gt;Казалось бы все уже давно разжевано, однако об одном интересном факте мало кто знает --&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;если кластерный индекс уникальный, то при создании неуникальных некластерных индексов,&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;ключ кластерного индекса будет не только на листовом уровне дерева, но и в промежуточных узлах.&lt;br&gt;&lt;br&gt;Об этом подробно написала Kalen Delaney в своем блоге:&lt;br&gt;&lt;a href="http://sqlblog.com/blogs/kalen_delaney/archive/2010/03/07/more-about-nonclustered-index-keys.aspx" target="_blank"&gt;http://sqlblog.com/blogs/kalen_delaney/archive/2010/03/07/more-about-nonclustered-index-keys.aspx&lt;/a&gt;&lt;br&gt;&lt;br&gt;Не пересказывая г-жу Дилани, отмечу только, что это приводит к интересному эффекту --&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;при наличии уникального кластерного индекса по полю X и неуникального некластерного&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;индекса по полю Y, для запроса вида&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre class="src" style="font-family: monospace; font-size: 10pt; border-width: 1px; border-style: solid; border-color: rgb(204, 182, 126) rgb(255, 254, 250) rgb(255, 254, 250) rgb(204, 182, 126); margin: 4px 0px; background-color: #fffaed; padding: 9px; overflow: auto"&gt;&lt;span style="color: blue"&gt;select&lt;/span&gt; ... &lt;span style="color: blue"&gt;where&lt;/span&gt; Y = @param1 &lt;span style="color: #777777"&gt;and&lt;/span&gt; X = @param2 &lt;/pre&gt;при использовании некластерного индекса, index seek будет по обоим полям -- Y, X, а не только по Y.&lt;br&gt;Если же этот индекс сделать уникальным, то, как и ожидается, ключ кластерного индекса будет только&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;на листовом уровне, и index seek будет только по Y.</description><category>sql server оптимизация запросов</category></item><item><guid isPermaLink="true">http://scherbinin.blog.ru/122893683.html</guid><pubDate>Sun, 10 Jul 2011 11:57:01 GMT</pubDate><title>SSAS parallel transactional incremental partitions processing</title><link>http://scherbinin.blog.ru/122893683.html</link><description>&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Calibri"&gt;Dealing with huge amounts of data and SSAS? Have you ever tried parallel transactional incremental partitions processing? Odd enough but in this typical (at least to me and my team) scenario AMO generates invalid XMLA-script (because in this case all &lt; Bindings &gt; tags must be outside of the &lt; Process &gt; tag). As a result, you will get an exception.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="font-family: Calibri"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;However, it is easy to fix &amp;ndash; let&amp;rsquo;s move all &lt; Bindings &gt; out of the &lt; Process &gt; command (I know, this code is far from perfect, feel free to refactor):&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="color: blue; font-family: Consolas; font-size: 8pt"&gt;static&lt;/span&gt; &lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; &lt;span style="color: #000000"&gt;FixXMLAForParallel(&lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; &lt;span style="color: #000000"&gt;log,&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; &lt;span style="color: #000000"&gt;SSASDatabaseName,&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; &lt;span style="color: #000000"&gt;SSASDatabaseId,&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; &lt;span style="color: #000000"&gt;DWHConnString)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; &lt;span style="color: #000000"&gt;bindings =&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&lt; Bindings &gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;while&lt;/span&gt; &lt;span style="color: #000000"&gt;(log.Contains(&lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;&lt; Bindings &gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; &lt;span style="color: #000000"&gt;bindingsOpen = log.IndexOf(&lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;&lt; Bindings &gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; &lt;span style="color: #000000"&gt;bindingsClose = log.IndexOf(&lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;&lt; /Bindings &gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; &lt;span style="color: #000000"&gt;bindOpen = log.IndexOf(&lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;&lt; Binding &gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, bindingsOpen +&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&lt; Bindings &gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;.Length);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; &lt;span style="color: #000000"&gt;bindClose = log.IndexOf(&lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;&lt; /Binding &gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; bindings += log.Substring(bindOpen, bindClose - bindOpen +&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&lt; /Bindings &gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;.Length);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; log = log.Remove(bindingsOpen, bindingsClose - bindingsOpen +&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&lt; Bindings &gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;.Length + 1);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; bindings +=&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&lt; /Bindings &gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; bindings += (&lt;/span&gt;&lt;span style="color: #a31515"&gt;@&amp;quot;&lt; DataSource xmlns:xsd=&amp;quot;&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&amp;quot; xmlns:xsi=&amp;quot;&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;quot; xsi:type=&amp;quot;&amp;quot;RelationalDataSource&amp;quot;&amp;quot; &gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&lt; ID &gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #000000"&gt;+ SSASDatabaseId +&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&lt; /ID &gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;&lt; Name &gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #000000"&gt;+ SSASDatabaseName +&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&lt; /Name &gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&lt; ConnectionString &gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #000000"&gt;+ DWHConnString +&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&lt; /ConnectionString &gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&lt; ConnectionStringSecurity &gt;Unchanged&lt; /ConnectionStringSecurity &gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&lt; /DataSource &gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; log = log.Insert(log.IndexOf(&lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;&lt; /Parallel &gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;) +&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&lt; /Parallel &gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;.Length, bindings);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #000000"&gt;log;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt"&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Calibri"&gt;And a usage example:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;srv.CaptureXml =&lt;/span&gt; &lt;span style="color: blue"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;ProcessDCPartitions(...);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;srv.CaptureXml =&lt;/span&gt; &lt;span style="color: blue"&gt;false&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;log = srv.ConcatenateCaptureLog(&lt;/span&gt;&lt;span style="color: blue"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt; &lt;span style="color: blue"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;results = srv.Execute(FixXMLAForParallel(log));&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;CheckProcessingError(results);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;srv.CaptureLog.Clear();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="line-height: 115%; font-size: 8pt"&gt;&lt;span style="color: #000000; font-family: Calibri"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="color: blue; font-family: 'Courier New'; font-size: 8pt"&gt;private&lt;/span&gt; &lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: blue"&gt;void&lt;/span&gt; &lt;span style="color: #000000"&gt;CheckProcessingError(&lt;/span&gt;&lt;span style="color: #2b91af"&gt;XmlaResultCollection&lt;/span&gt; &lt;span style="color: #000000"&gt;results)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal; text-indent: 35.4pt" class="MsoNormal"&gt;&lt;span style="color: blue; font-family: 'Courier New'; font-size: 8pt"&gt;string&lt;/span&gt; &lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;error =&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt 35.4pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="color: blue; font-family: 'Courier New'; font-size: 8pt"&gt;foreach&lt;/span&gt; &lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #2b91af"&gt;XmlaResult&lt;/span&gt; &lt;span style="color: #000000"&gt;result&lt;/span&gt; &lt;span style="color: blue"&gt;in&lt;/span&gt; &lt;span style="color: #000000"&gt;results)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal; text-indent: 35.4pt" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt 35.4pt; line-height: normal; text-indent: 35.4pt" class="MsoNormal"&gt;&lt;span style="color: blue; font-family: 'Courier New'; font-size: 8pt"&gt;foreach&lt;/span&gt; &lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #2b91af"&gt;XmlaMessage&lt;/span&gt; &lt;span style="color: #000000"&gt;message&lt;/span&gt; &lt;span style="color: blue"&gt;in&lt;/span&gt; &lt;span style="color: #000000"&gt;result.Messages)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; &lt;span style="color: #000000"&gt;(message&lt;/span&gt; &lt;span style="color: blue"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af"&gt;XmlaError&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; error = error + message.Description +&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal; text-indent: 35.4pt" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal; text-indent: 35.4pt" class="MsoNormal"&gt;&lt;span style="color: blue; font-family: 'Courier New'; font-size: 8pt"&gt;if&lt;/span&gt; &lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;(!&lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;.IsNullOrEmpty(error))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal; text-indent: 35.4pt" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Exception&lt;/span&gt;&lt;span style="color: #000000"&gt;(error);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal; text-indent: 35.4pt" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; font-size: 8pt"&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #000000; font-family: Calibri; font-size: 12pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description><category>ssas processing</category></item><item><guid isPermaLink="true">http://scherbinin.blog.ru/82039763.html</guid><pubDate>Sun, 15 Nov 2009 23:48:41 GMT</pubDate><title>Использование собственных (custom) сборок в SSIS</title><link>http://scherbinin.blog.ru/82039763.html</link><description>&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Начиная с версии 2005, в &lt;span&gt;MS&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt; появился серьезный &lt;span&gt;ETL&lt;/span&gt;-инструмент, пришедший на смену&amp;nbsp;&lt;span&gt;DTS&lt;/span&gt; &amp;ndash; &lt;span&gt;SSIS&lt;/span&gt;. &lt;span&gt;SSIS&lt;/span&gt; содержит массу встроенных трансформаций, но и их иногда бывает недостаточно. Что делать в таком случае? Нет ничего проще! Можно написать код на &lt;span&gt;C&lt;/span&gt;# и использовать его в компоненте &lt;span&gt;Script&lt;/span&gt; &lt;span&gt;Transformation&lt;/span&gt;. А если этот код используется в нескольких пакетах, и может быть в других частях приложения? Есть два подхода &amp;ndash; мой любимый &lt;span&gt;copy&lt;/span&gt; &lt;span&gt;paste&lt;/span&gt; (очень хорошо подходит, если вам платят за количество строк кода), или создание сборки и использование ее в пакетах и приложениях. За описанием технологии &lt;span&gt;copy&lt;/span&gt; &lt;span&gt;paste&lt;/span&gt; отправляю интересующихся читателей в документацию по &lt;span&gt;MS&lt;/span&gt; &lt;span&gt;Windows&lt;/span&gt; и в книгу &amp;ldquo;&lt;span&gt;Copy&lt;/span&gt; &lt;span&gt;Paste&lt;/span&gt; &amp;ndash; &lt;span&gt;Towards&lt;/span&gt; &lt;span&gt;a&lt;/span&gt; &lt;span&gt;Brighter&lt;/span&gt; &lt;span&gt;Future&lt;/span&gt;&amp;rdquo; издательства &lt;span&gt;Bangalore&lt;/span&gt; &lt;span&gt;Press&lt;/span&gt;, а здесь рассмотрим менее очевидный и более тернистый подход с использованием &lt;span&gt;custom&lt;/span&gt; &lt;span&gt;assemblies&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;h2 style="margin: 10pt 0cm 0pt"&gt;&lt;/h2&gt;&lt;h2 style="margin: 10pt 0cm 0pt"&gt;&lt;span style="font-size: 14pt; font-family: Cambria; color: #4f81bd"&gt;Задача&lt;/span&gt;&lt;/h2&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Допустим, решил я написать свою мощную систему поиска в Интернет, с кодовым названием &lt;span&gt;Booble&lt;/span&gt;. Система ходит по Интернету, скачивает и индексирует страницы, и аккуратно складывает их в базу данных для дальнейшего анализа. Неожиданно выяснилось, что в БД попадают какие-то странные нечитабельные &lt;span&gt;URL&lt;/span&gt;:&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;a href="http://lurkmore.ru/%D0%9C%D0%B0%D1%82%D0%B0%D0%BD"&gt;&lt;span style="font-size: 12pt; font-family: Calibri"&gt;http://lurkmore.ru/%D0%9C%D0%B0%D1%82%D0%B0%D0%BD&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;a href="http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0"&gt;&lt;span style="font-size: 12pt; font-family: Calibri"&gt;http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;и так далее. Очень сложно такое анализировать, да и места тратится много на все эти проценты и цифры.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Что же это такое? Как выясняется, RFC 1738, как бы намекает нам:&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;&amp;ldquo;Только цифры, буквы (причем только английские! [0-9a-zA-Z]), специальные символы $-_.+!*'(), и зарезервированные символы, используемые для этих самых зарезервированных целей, могут быть незакодированы в &lt;span&gt;URL&lt;/span&gt;&amp;rdquo;.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Не думали создатели этих ваших Интернетов, что они будут использоваться за пределами &lt;span&gt;USA&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;С другой стороны, &lt;span&gt;HTML&lt;/span&gt;4 позволяет использовать &lt;span&gt;Unicode&lt;/span&gt;, так что для корректного использования ссылок их надо закодировать! Для этого каждый символ в &lt;span&gt;URL&lt;/span&gt; начинается с символа %, за которым следует шестнадцатеричное представление (две цифры) символа:&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;a href="http://en.wikipedia.org/wiki/Percent-encoding"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-family: Calibri"&gt;&lt;span&gt;http&lt;/span&gt;://&lt;span&gt;en&lt;/span&gt;.&lt;span&gt;wikipedia&lt;/span&gt;.&lt;span&gt;org&lt;/span&gt;/&lt;span&gt;wiki&lt;/span&gt;/&lt;span&gt;Percent&lt;/span&gt;-&lt;span&gt;encoding&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Так что для анализа нам надо всего лишь взять поступившие в систему ссылки, раскодировать их и прикопать в какой-нибудь таблице.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Что может быть проще! Если вы, как и я, не любите изобретать велосипеды, то после недолгих поисков в Интернет, можно найти &lt;span&gt;OpenJDK&lt;/span&gt;, а внутри &amp;ndash; метод для раскодирования &lt;span&gt;URL&lt;/span&gt;, который несложно переписать с &lt;span&gt;Java&lt;/span&gt; на мой любимый C#. Этот метод я покажу позже.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Казалось бы, полдела сделано, осталось собрать сборку, и подключить ее к пакету &lt;span&gt;SSIS&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Подготовим БД и пакет &lt;span&gt;SSIS&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;create&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;database&lt;/span&gt; &lt;span style="color: #000000"&gt;CustomAssembliesNightmare&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;use&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;CustomAssembliesNightmare&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;create&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;table&lt;/span&gt; &lt;span style="color: #000000"&gt;dbo&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;raw_data&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; id&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;bigint&lt;/span&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;identity&lt;/span&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;primary&lt;/span&gt; &lt;span style="color: blue"&gt;key&lt;/span&gt; &lt;span style="color: blue"&gt;clustered&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; url&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;varchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: fuchsia"&gt;max&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;insert&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;into&lt;/span&gt; &lt;span style="color: #000000"&gt;dbo&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;raw_data&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; url&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;select&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: red"&gt;'http://lurkmore.ru/%D0%9C%D0%B0%D1%82%D0%B0%D0%BD'&lt;/span&gt; &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #000000"&gt;url&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;union&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: gray"&gt;all&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;select&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: red"&gt;'http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0'&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;union&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: gray"&gt;all&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;select&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: red"&gt;'http://www.google.com/#hl=en&amp;amp;q=%D0%B1%D0%BB%D0%BE%D0%B3+%D1%89%D0%B5%D1%80%D0%B1%D0%B8%D0%BD%D0%B8%D0%BD+sql&amp;amp;aq=f&amp;amp;aqi=&amp;amp;oq=&amp;amp;fp=94f5bc3d92523f1a'&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;create&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;table&lt;/span&gt; &lt;span style="color: #000000"&gt;dbo&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;human_readable_data&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; id&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;bigint&lt;/span&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;primary&lt;/span&gt; &lt;span style="color: blue"&gt;key&lt;/span&gt; &lt;span style="color: blue"&gt;clustered&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; url&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: fuchsia"&gt;max&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Calibri"&gt;Создайте пакет &lt;span&gt;SSIS&lt;/span&gt; и добавьте в него &lt;span&gt;Data&lt;/span&gt; &lt;span&gt;Flow&lt;/span&gt; &lt;span&gt;Task&lt;/span&gt;. Эта задача должна прочитать данные из &lt;span&gt;dbo&lt;/span&gt;.&lt;span&gt;raw&lt;/span&gt;_&lt;span&gt;data&lt;/span&gt;, выполнить декодирование и записать данные в dbo.human_readable_data. Такого стандартного преобразования в &lt;span&gt;SSIS&lt;/span&gt; нет, так что используем &lt;span&gt;Script&lt;/span&gt; &lt;span&gt;Component&lt;/span&gt;. Для &lt;span&gt;Script Component&lt;/span&gt; установите тип &lt;span&gt;&amp;ldquo;Transformation&amp;rdquo;:&lt;br&gt;&lt;img src="http://stat8.blog.ru/lr/092f07fe73f79764b2cc8af1aad4a8af" border="0" title="capture_16112009_131120.jpg" alt=""&gt;&amp;nbsp;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Calibri"&gt;Настроим &lt;span&gt;Script&lt;/span&gt; &lt;span&gt;Component&lt;/span&gt;, нажмите на нем правую кнопку мыши и выберите &lt;span&gt;Edit&lt;/span&gt;&amp;hellip; Перейдите на вкладку &lt;span&gt;Input Columns&lt;/span&gt; и выберите столбец &lt;span&gt;url:&lt;br&gt;&lt;img src="http://stat8.blog.ru/lr/092fb98a0fae7ec7faeeb5f027ef4ca2" border="0" title="capture_16112009_131310.jpg" alt=""&gt;&amp;nbsp;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Calibri"&gt;Перейдите на вкладку &lt;span&gt;&lt;span&gt;Inputs and Outputs,&lt;/span&gt;&lt;/span&gt; раскройте &lt;span&gt;&lt;span&gt;Output 0&lt;/span&gt;&lt;/span&gt; и в &lt;span&gt;&lt;span&gt;Output Columns&lt;/span&gt;&lt;/span&gt; добавьте столбец &lt;span&gt;&lt;span&gt;readable_url&lt;/span&gt;&lt;/span&gt; с типом &lt;span&gt;&lt;span&gt;Unicode text stream [DT_NTEXT]:&lt;br&gt;&lt;img src="http://stat8.blog.ru/lr/092ff48f5c2f42286f55cb5735ac8b4f" border="0" title="capture_16112009_152815.jpg" alt=""&gt;&amp;nbsp;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Нажмите ОК, и перейдем к созданию сборки, включающей метод для декодирования.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Откройте &lt;span&gt;Visual&lt;/span&gt; &lt;span&gt;Studio&lt;/span&gt; и создайте проект типа &lt;span&gt;Class&lt;/span&gt; &lt;span&gt;Library&lt;/span&gt;, со следующим кодом внутри:&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Calibri"&gt;URLUtils.cs&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;using&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;System;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;using&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;System.Collections.Generic;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;using&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;System.Linq;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;using&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;System.Text;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;namespace&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;URLUtilsAssembly&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;URLUtils&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal; text-indent: 35.4pt" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&amp;copy; OpenJDK&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; &lt;span style="color: #000000"&gt;DecodeURL(&lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; &lt;span style="color: #000000"&gt;s)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; &lt;span style="color: #000000"&gt;needToChange =&lt;/span&gt; &lt;span style="color: blue"&gt;false&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; &lt;span style="color: #000000"&gt;numChars = s.Length;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Encoding&lt;/span&gt; &lt;span style="color: #000000"&gt;enc =&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Encoding&lt;/span&gt;&lt;span style="color: #000000"&gt;.UTF8;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StringBuilder&lt;/span&gt; &lt;span style="color: #000000"&gt;sb =&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StringBuilder&lt;/span&gt;&lt;span style="color: #000000"&gt;(numChars  &gt; 500 ? numChars / 2 : numChars);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; &lt;span style="color: #000000"&gt;i = 0;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; &lt;span style="color: #000000"&gt;(enc ==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentException&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;URLDecoder: empty string enc parameter&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;char&lt;/span&gt; &lt;span style="color: #000000"&gt;c;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[] bytes =&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;while&lt;/span&gt; &lt;span style="color: #000000"&gt;(i &lt;  numChars)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; c = s[i];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;switch&lt;/span&gt; &lt;span style="color: #000000"&gt;(c)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;case&lt;/span&gt; &lt;span style="color: #a31515"&gt;'+'&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; sb.Append(&lt;/span&gt;&lt;span style="color: #a31515"&gt;' '&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; i++;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; needToChange =&lt;/span&gt; &lt;span style="color: blue"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;case&lt;/span&gt; &lt;span style="color: #a31515"&gt;'%'&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;try&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: green"&gt;// (numChars-i)/3 is an upper bound for the number&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: green"&gt;// of remaining bytes&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; &lt;span style="color: #000000"&gt;(bytes ==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; bytes =&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[(numChars - i) / 3];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; &lt;span style="color: #000000"&gt;pos = 0;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;while&lt;/span&gt; &lt;span style="color: #000000"&gt;(((i + 2) &lt;  = numChars) &amp;amp;&amp;amp; (c ==&lt;/span&gt; &lt;span style="color: #a31515"&gt;'%'&lt;/span&gt;&lt;span style="color: #000000"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; &lt;span style="color: #000000"&gt;v =&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;&lt;span style="color: #000000"&gt;.ToInt32(s.Substring(i + 1, 2), 16);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; &lt;span style="color: #000000"&gt;(v &lt;  0)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentException&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;URLDecoder: Illegal hex characters in escape (%) pattern - negative value&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; bytes[pos++] = (&lt;/span&gt;&lt;span style="color: blue"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;)v;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; i += 3;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; &lt;span style="color: #000000"&gt;(i &lt;  numChars)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; c = s[i];&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; &lt;span style="color: #000000"&gt;((i &lt;  numChars) &amp;amp;&amp;amp; (c ==&lt;/span&gt; &lt;span style="color: #a31515"&gt;'%'&lt;/span&gt;&lt;span style="color: #000000"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentException&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;URLDecoder: Incomplete trailing escape (%) pattern&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt;[] chars = enc.GetChars(bytes, 0, pos);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;for&lt;/span&gt; &lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt; &lt;span style="color: #000000"&gt;k = 0; k &lt;  chars.Length; k++)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; &lt;span style="color: #000000"&gt;(chars[k] == 0xFFFD)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentException&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;URLDecoder: Cannot decode the URL&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; sb.Append(chars);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;catch&lt;/span&gt; &lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #2b91af"&gt;FormatException&lt;/span&gt; &lt;span style="color: #000000"&gt;e)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentException&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;URLDecoder: Illegal hex characters in escape (%) pattern - &amp;quot;&lt;/span&gt; &lt;span style="color: #000000"&gt;+ e.Message);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; needToChange =&lt;/span&gt; &lt;span style="color: blue"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;default&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; sb.Append(c);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; i++;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #000000"&gt;(needToChange ? sb.ToString() : s);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Откомпилируйте сборку, и давайте попробуем использовать ее в пакете &lt;span&gt;SSIS&lt;/span&gt; в компоненте &lt;span&gt;Script&lt;/span&gt; &lt;span&gt;Component&lt;/span&gt;. Для этого выберите компонент, нажмите правую кнопку и выберите &lt;span&gt;Edit&lt;/span&gt;&amp;hellip; Далее нажмите кнопку &lt;span&gt;Edit&lt;/span&gt; &lt;span&gt;Script&lt;/span&gt;&amp;hellip; Чтобы пакет увидел наш код, надо добавить на него ссылку. Нажмите правую кнопку на узле &lt;span&gt;References&lt;/span&gt; и выберите &lt;span&gt;Add&lt;/span&gt; &lt;span&gt;Reference&lt;/span&gt;&amp;hellip; Перейдите на вкладку &lt;span&gt;Browse&lt;/span&gt; и найдите сборку. Добавьте на нее ссылку в секции &lt;span&gt;using&lt;/span&gt;:&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="line-height: 115%; font-size: 10pt; font-family: 'Courier New'; color: blue"&gt;using&lt;/span&gt; &lt;span style="line-height: 115%; font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;URLUtilsAssembly;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-size: 12pt; font-family: Calibri"&gt;В методе&lt;/span&gt; &lt;span style="line-height: 115%; font-size: 10pt; font-family: 'Courier New'"&gt;Input0_ProcessInputRow&lt;/span&gt; &lt;span style="font-size: 12pt; font-family: Calibri"&gt;выполним декодирование, для этого нам сначала придется преобразовать входящий URL из blob в string, а затем поместить в выходной &lt;span&gt;blob&lt;/span&gt;-столбец:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue"&gt;byte&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;[] data = Row.url.GetBlobData(0, (&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;)Row.url.Length);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;br&gt;Row.readableurl.AddBlobData(&lt;/span&gt;&lt;/span&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; Encoding&lt;/span&gt;&lt;span style="color: #000000"&gt;.Unicode.GetBytes(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; URLUtils.DecodeURL(&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Encoding&lt;/span&gt;&lt;span style="color: #000000"&gt;.ASCII.GetString(data))));&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-family: Calibri"&gt;&lt;span style="color: #000000"&gt;Отредактируйте приемник данных &lt;span&gt;(Human readable Data),&lt;/span&gt; сопоставив столбцы &lt;span&gt;readable_url&lt;/span&gt; и &lt;span&gt;url:&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt; line-height: normal" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;&lt;img src="http://stat8.blog.ru/lr/092f5f97c85bd21110fe3626c6376485" border="0" title="capture_16112009_133541.jpg" alt=""&gt;&amp;nbsp;&lt;br&gt;Казалось бы и все, но при запуске пакета вы получите ошибку, вроде этой:&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt 35.4pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-family: Calibri"&gt;&lt;span style="color: #000000"&gt;&lt;strong&gt;Невозможно загрузить файл или сборку &amp;quot;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;URLUtilsAssembly&lt;/span&gt;,&lt;/strong&gt; &lt;strong&gt;&lt;span&gt;Version&lt;/span&gt;=1.0.0.0,&lt;/strong&gt; &lt;strong&gt;&lt;span&gt;Culture&lt;/span&gt;=&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;neutral&lt;/span&gt;,&lt;/strong&gt; &lt;strong&gt;&lt;span&gt;PublicKeyToken&lt;/span&gt;=&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;null&lt;/span&gt;&amp;quot; или один из зависимых от них компонентов. Не удается найти указанный файл.&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Давайте проверим &lt;span&gt;Script&lt;/span&gt; &lt;span&gt;Component&lt;/span&gt;, может быть там что-то не так. Нажмите на нем правую кнопку, выберите &lt;span&gt;Edit&lt;/span&gt;&amp;hellip; и нажмите &lt;span&gt;Edit&lt;/span&gt; &lt;span&gt;Script&lt;/span&gt;&amp;hellip; Раскройте узел &lt;span&gt;References&lt;/span&gt;. Ничего странного? Куда делась ссылка на &lt;span&gt;URLUtilsAssembly&lt;/span&gt;?! Потерялась&amp;hellip; Странно, стандартные сборки же не теряются? А где располагаются стандартные сборки .&lt;span&gt;NET&lt;/span&gt;, мои маленькие любители программирования? Правильно, в &lt;span&gt;Global&lt;/span&gt; &lt;span&gt;Assembly&lt;/span&gt; &lt;span&gt;Cache&lt;/span&gt;. Давайте попробуем и нашу сборку там зарегистрировать, вдруг поможет?&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Чтобы зарегистрировать сборку в &lt;span&gt;GAC&lt;/span&gt;, надо сначала создать ей &amp;laquo;Сильное имя&amp;raquo; (&lt;span&gt;Strong&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;). Для этого откройте свойства проекта сборки, перейдите на вкладку &lt;span&gt;Signing&lt;/span&gt;, установите флажок &lt;span&gt;Sign&lt;/span&gt; &lt;span&gt;the&lt;/span&gt; &lt;span&gt;assembly&lt;/span&gt;, и создайте файл ключа, выбрав &lt;span&gt;New&lt;/span&gt;&amp;hellip; из выпадающего списка &lt;span&gt;Choose&lt;/span&gt; &lt;span&gt;a&lt;/span&gt; &lt;span&gt;strong&lt;/span&gt; &lt;span&gt;name&lt;/span&gt; &lt;span&gt;key&lt;/span&gt; &lt;span&gt;file&lt;/span&gt;. Откомпилируйте сборку.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Теперь о регистрации в &lt;span&gt;GAC&lt;/span&gt;. Сборку можно зарегистрировать с помощью утилиты &lt;span&gt;gacutil&lt;/span&gt;, но, к сожалению, с некоторого момента она не поставляется в комплекте с .&lt;span&gt;NET&lt;/span&gt; &lt;span&gt;Framework&lt;/span&gt;, а только с &lt;span&gt;SDK&lt;/span&gt;. Вместо этого &lt;span&gt;Microsoft&lt;/span&gt; предлагает создавать установочные пакеты (&lt;span&gt;msi&lt;/span&gt;). Если желания пакет создавать нет, то для регистрации в эксплуатационной среде придется воспользоваться следующим трюком (&lt;span&gt;Windows&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt; 2008):&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt 36pt; text-indent: -18pt" class="MsoListParagraphCxSpFirst"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 12pt; font-family: Calibri"&gt;1.&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style="font-size: 12pt; font-family: Calibri"&gt;Запустите утилиту командной строки &lt;span&gt;cmd&lt;/span&gt;.&lt;span&gt;exe&lt;/span&gt; с правами администратора (&lt;span&gt;Run&lt;/span&gt; &lt;span&gt;as&lt;/span&gt; &lt;span&gt;administrator&lt;/span&gt;).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt 36pt; text-indent: -18pt" class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 12pt; font-family: Calibri"&gt;2.&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style="font-size: 12pt; font-family: Calibri"&gt;Запустите &lt;span&gt;Windows&lt;/span&gt; &lt;span&gt;Explorer&lt;/span&gt; из открывшейся консоли следующим образом:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt 36pt" class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-family: Calibri"&gt;&lt;span style="color: #000000"&gt;explorer c:\windows\assembly&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt 36pt; text-indent: -18pt" class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 12pt; font-family: Calibri"&gt;3.&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style="font-size: 12pt; font-family: Calibri"&gt;Запустите еще одну копию &lt;span&gt;Windows&lt;/span&gt; &lt;span&gt;Explorer&lt;/span&gt; из консоли с путем к сборке:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 0pt 36pt" class="MsoListParagraphCxSpMiddle"&gt;&lt;span&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-family: Calibri"&gt;&lt;span style="color: #000000"&gt;explorer C:\CustomAssembliesNightmare\URLUtilsAssembly\bin\Debug&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt 36pt; text-indent: -18pt" class="MsoListParagraphCxSpLast"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 12pt; font-family: Calibri"&gt;4.&lt;/span&gt;&lt;span style="font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style="font-size: 12pt"&gt;&lt;span style="font-family: Calibri"&gt;Перетащите файл сборки &lt;span&gt;(URLUtilsAssembly.dll)&lt;/span&gt; из папки со сборкой в папку &lt;span&gt;&lt;span&gt;GAC (\windows\assembly)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Сборка зарегистрирована! Учтите, просто запуск &lt;span&gt;explorer&lt;/span&gt; с правами администратора не поможет.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0cm 0cm 10pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;К сожалению, этого мало. Чтобы &lt;span&gt;SSIS&lt;/span&gt; не терял ссылку на сборку при каждом открытии &lt;span&gt;Script&lt;/span&gt; &lt;span&gt;Component&lt;/span&gt;, ее надо дополнительно скопировать в папку C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;Вот теперь все, осталось снова отредактировать &lt;span&gt;Script&lt;/span&gt; &lt;span&gt;Component&lt;/span&gt;, и добавить ссылку на сборку, на этот раз со вкладки .&lt;span&gt;NET&lt;/span&gt;, а не &lt;span&gt;Browse&lt;/span&gt;.&lt;br&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-size: 12pt; font-family: Calibri"&gt;&lt;br&gt;Запустите пакет и просмотрите содержимое результирующей таблицы.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Calibri; color: #000000"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-size: 12pt; font-family: Calibri"&gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;</description><category>sql server ssis</category></item><item><guid isPermaLink="true">http://scherbinin.blog.ru/79399427.html</guid><pubDate>Thu, 10 Sep 2009 18:12:34 GMT</pubDate><title>Поиск плагиата на платформе MS SQL</title><link>http://scherbinin.blog.ru/79399427.html</link><description>&lt;div class="Section1"&gt;&lt;p class="MsoTitle"&gt;&lt;span&gt;&lt;span style="font-size: 18pt"&gt;&lt;span style="font-size: 18pt"&gt;Plagiarism detection using Microsoft SQL Server Platform&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="center"&gt;&lt;table border="0" cellspacing="0" cellpadding="0" class="MsoNormalTable" style="border-collapse: collapse"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="307" valign="top" style="padding: 0cm 3.5pt; width: 230.25pt"&gt;&lt;p class="Autor"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span&gt;Vladislav Shcherbinin&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="AutorFiliacion"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span&gt;American&lt;/span&gt; &lt;span&gt;University of Nigeria&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="AutorFiliacion"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span&gt;Lamido Zubairu way, Yola township by-pass, PMB 2250, Yola, Nigeria&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="AutorFiliacion"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span&gt;vladislav.scherbinin@gmail.com&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="307" valign="top" style="padding: 0cm 3.5pt; width: 230.3pt"&gt;&lt;p class="Autor"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span&gt;Sergey Butakov&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="AutorFiliacion"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span&gt;SolBridge International School of Business, 151-13 Samsung 1-Dong, Dong-gu, Daejeon, &lt;span&gt;&amp;nbsp;&lt;/span&gt;300-814, South Korea&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="AutorFiliacion"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span&gt;butakov@solbridge.ac.kr&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p class="Resumen"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="Resumen"&gt;&lt;strong&gt;&lt;span&gt;Abstract:&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;The paper presents an approach for fast plagiarism detection using Microsoft SQL Server platform in a large corpus of documents. The approach was used for participation in the first international plagiarism detection competition that was held as a part of PAN&amp;rsquo;09 workshop. The main advantages of the proposed approach are its high precision, good performance and readiness for deployment into a production environment with relatively low cost of the required third party software. The approach uses fingerprinting-based algorithms to compare documents and Levenstein&amp;rsquo;s metric to markup plagiarized fragments in the texts.&lt;/span&gt;&lt;/p&gt;&lt;p class="PalabrasClave"&gt;&lt;strong&gt;&lt;span&gt;Keywords:&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;external plagiarism detection, Winnowing, document fingerprinting&lt;/span&gt;&lt;/p&gt;&lt;p class="PalabrasClave"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="PalabrasClave"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="PalabrasClave"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="PalabrasClave"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="PalabrasClave"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="Section1"&gt;&lt;p class="PalabrasClave"&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;a name="_Ref340642111" title="_Ref340642111"&gt;&lt;/a&gt;&lt;a name="_Ref341093126" title="_Ref341093126"&gt;&lt;/a&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;1&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;Introduction&lt;/span&gt;&lt;/span&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;a name="_Toc382647169" title="_Toc382647169"&gt;&lt;/a&gt;&lt;a name="_Ref381075748" title="_Ref381075748"&gt;&lt;/a&gt;&lt;span&gt;&lt;span&gt;Digital plagiarism remains a burning issue both in academia (Hart and Friesner, 2004) and industry (&lt;/span&gt;&lt;span&gt;Nitterhouse, 2003&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;) over the last two decades. With modern advances in digital media and telecom industries plagiarists got access to a variety of sources including portable media, P2P networks, public Internet, subscription-based digital libraries, etc. Of course methods and tools of plagiarism uncovering have evolved a lot from the pioneering works on plagiarism uncovering in source codes in 1980s to web-enabled anti-plagiarism services of today.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Plagiarism detection methods at large can be split into two large groups: external document analysis methods and intrinsic plagiarism detection methods (Maurer, Kappe, &amp;amp; Zaka 2006). The method and software proposed in this paper aimed on the external plagiarism detection, e.g. revealing the text copied from other documents. For the competition purposes the organizers provided the following corpus: 7214 suspicious documents, 7215 source documents. The rest of the paper is organized as follows: the detailed description of the software platform and the detection process can be found in the second and third sections of the paper. Conclusion section summarizes the results and proposes the directions for future research.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h1 style="margin-left: 0cm; text-indent: 0cm"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;2&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;Software and hardware configuration&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;The document processing for the competition was done by three nodes with the main characteristics presented in Table 1. Node 1 served as DBMS platform and two other nodes were used on the detection phase.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0" class="MsoNormalTable" style="border: medium none ; border-collapse: collapse"&gt;&lt;tbody&gt;&lt;tr style="height: 17.7pt"&gt;&lt;td width="68" valign="top" style="border: 1pt solid black; padding: 0cm 5.4pt; width: 51.3pt; height: 17.7pt"&gt;&lt;p style="text-align: center; text-indent: 0cm" class="MsoNormal" align="center"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;Name&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="111" valign="top" style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 83.5pt; height: 17.7pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;Hardware&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="118" valign="top" style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 88.6pt; height: 17.7pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;Software&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 51.7pt"&gt;&lt;td width="68" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 51.3pt; height: 51.7pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Node 1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="111" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 83.5pt; height: 51.7pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2 GB Ram, Intel Xeon, 3.6 GHz&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="118" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 88.6pt; height: 51.7pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Windows Server 2003 (Service Pack 2, 64 bit), Microsoft SQL Server Developer Edition (Service Pack 3, 64 bit)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 22.45pt"&gt;&lt;td width="68" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 51.3pt; height: 22.45pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Node 2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="111" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 83.5pt; height: 22.45pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1 GB Ram, Intel Core Duo, 1.8 GHz&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="118" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 88.6pt; height: 22.45pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Windows Server 2003 (Service Pack 2, 32 bit)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 21.55pt"&gt;&lt;td width="68" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 51.3pt; height: 21.55pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Node 3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="111" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 83.5pt; height: 21.55pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1 GB Ram, Intel Core Duo, 1.8 GHz&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="118" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 88.6pt; height: 21.55pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Windows XP (Service Pack 3, 32 bit)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: center; text-indent: 0cm" class="MsoNormal" align="center"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Table 1: Hardware and software used&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h1 style="margin-left: 0cm; text-indent: 0cm"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;3&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;Detection process&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;The detection process consists of several steps: loading and preprocessing of documents, finding sources, detecting plagiarized passages and finally compiling results. The following subsections explain these steps in details.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style="margin-left: 0cm; text-indent: 0cm"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;3.1&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;Step 1 &amp;ndash; Loading and preprocessing of the documents&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Straightforward character by character comparison of thousands of documents is obviously time-prohibitive. To perform the comparison on such a large corpus of documents we decided to use a modification of the Winnowing, one of the well-known fingerprinting-based algorithms (Schleimer et al., 2003).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;The detection of plagiarized passages requires some preprocessing to be done: in particular, the documents should be loaded into the database together with their fingerprints. The structure of the database designed to store documents and fingerprints is shown in the Figure 1.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: center" class="MsoNormal" align="center"&gt;&lt;img src="http://stat8.blog.ru/lr/0925201ff1ab1cb605f0284572a436f3" border="0" title="pic1.JPG" alt=""&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Figure 1: The database structure&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Table Folder defines the type of the document: (a)&amp;nbsp;Suspicious document and (b)&amp;nbsp;Source document. Document table stores documents and folders they belong to. And Fingerprint table contains fingerprints for each document. The detailed description of the Fingerprint table (the most important one in the database) is presented in the Table 2.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="465" height="374" class="MsoNormalTable" style="border: medium none ; border-collapse: collapse"&gt;&lt;tbody&gt;&lt;tr style="height: 8.7pt"&gt;&lt;td width="91" valign="top" style="border: 1pt solid black; padding: 0cm 5.4pt; width: 68.4pt; height: 8.7pt"&gt;&lt;p style="text-align: center; text-indent: 0cm" class="MsoNormal" align="center"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;Field name&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="60" valign="top" style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 45pt; height: 8.7pt"&gt;&lt;p style="text-align: center; text-indent: 0cm" class="MsoNormal" align="center"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;Type&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="138" valign="top" style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 103.5pt; height: 8.7pt"&gt;&lt;p style="text-align: center; text-indent: 0cm" class="MsoNormal" align="center"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;Description&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.35pt"&gt;&lt;td width="91" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 68.4pt; height: 34.35pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;document_id&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="60" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 45pt; height: 34.35pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="138" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 103.5pt; height: 34.35pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Link to the respective document (foreign key)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.35pt"&gt;&lt;td width="91" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 68.4pt; height: 34.35pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;position&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="60" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 45pt; height: 34.35pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="138" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 103.5pt; height: 34.35pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Position of the fingerprint in the document&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.35pt"&gt;&lt;td width="91" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 68.4pt; height: 34.35pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;value&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="60" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 45pt; height: 34.35pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;guid&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="138" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 103.5pt; height: 34.35pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;16-byte hash (MD5) of the document&amp;rsquo;s excerpt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 69.15pt"&gt;&lt;td width="91" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 68.4pt; height: 69.15pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;seq_num&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="60" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 45pt; height: 69.15pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;integer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="138" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 103.5pt; height: 69.15pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Since the same fingerprint can appear several times in a document, this field contains sequential number of the fingerprint for optimization purposes&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Table 2: Structure of the Fingerprint table&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;After loading documents and compiling their fingerprints two indexes on the Fingerprint table were created. SQL scripts for these indexes are presented in the Figure 2. These indexes will be used in the upcoming steps.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="429" height="282" class="MsoNormalTable" style="border: medium none ; border-collapse: collapse"&gt;&lt;tbody&gt;&lt;tr style="height: 66.55pt"&gt;&lt;td width="150" valign="top" style="border: 1pt solid black; padding: 0cm 5.4pt; width: 112.25pt; height: 66.55pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt"&gt;Index 1:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;create&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;unique&lt;/span&gt; &lt;span style="color: blue"&gt;clustered&lt;/span&gt; &lt;span style="color: blue"&gt;index&lt;/span&gt; ix_fingerprint &lt;span style="color: blue"&gt;on&lt;/span&gt; dbo&lt;span style="color: gray"&gt;.&lt;/span&gt;fingerprint&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; document_id&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt; value&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt; seq_num&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="150" valign="top" style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 112.85pt; height: 66.55pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt"&gt;Index 2:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;create&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;nonclustered&lt;/span&gt; &lt;span style="color: blue"&gt;index&lt;/span&gt; ix_value_document &lt;span style="color: blue"&gt;on&lt;/span&gt; dbo&lt;span style="color: gray"&gt;.&lt;/span&gt;fingerprint&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; value&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt; document_id&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Figure 2: Indexing of the Fingerprint table&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;The fingerprints were compiled using the &lt;em&gt;n-&lt;/em&gt;gram size of 50 characters and sliding window of 30 characters.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;After the loading phase the Fingerprint table was populated with 137,981,386 records. At this point we have tried to reduce this number by removing hashes with unique values from the table (such values are useless for the plagiarism detection as they occur only once in a document). But such a removal led to the fragmentation of the indexes and thus increased the processing time. Index defragmentation would help but it would take time and it was decided to keep unique values in the table. Of course such removal would not be possible in the production anti-plagiarism system because once a new submission comes to the system a unique value may not be unique anymore.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;In total the loading and preprocessing step took 4 hours on the first node. As it can be seen from the description the most time consuming operation on this step was loading documents and compiling fingerprints. The system performance in this step can be improved by increasing the computational power allocated for fingerprint calculation on the server.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h2 style="margin-left: 0cm; text-indent: 0cm"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;3.2&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;Step 2 &amp;ndash; Locating sources&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;On this step we identify documents which contain plagiarized fragments. The main objective of this step was to reduce the number of documents to compare, because not all the suspicious documents contain plagiarized fragments. This step selects all pairs of documents that share at least one fingerprint and stores these pairs in a table for more detailed analysis. The table and the script to populate it are shown in Figure 3. &lt;span&gt;&amp;nbsp;&lt;/span&gt;This query uses Index 2 (see Figure 2).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="299" class="MsoNormalTable" style="border: medium none ; width: 224.45pt; border-collapse: collapse"&gt;&lt;tbody&gt;&lt;tr style="height: 74.85pt"&gt;&lt;td width="299" valign="top" style="border: 1pt solid black; padding: 0cm 5.4pt; width: 224.45pt; height: 74.85pt"&gt;&lt;p class="MsoNormal"&gt;&lt;img src="http://stat8.blog.ru/lr/09255f2f27e5795a57c52bef151bf4a9" border="0" title="pic2.JPG" alt=""&gt;&lt;/p&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 172.5pt"&gt;&lt;td width="299" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 224.45pt; height: 172.5pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;insert&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;into&lt;/span&gt; dbo&lt;span style="color: gray"&gt;.&lt;/span&gt;matches_report &lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; doc1_id&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; doc2_id&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;select&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;d&lt;span style="color: gray"&gt;.&lt;/span&gt;document_id &lt;span style="color: blue"&gt;as&lt;/span&gt; doc1_id&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt; td&lt;span style="color: gray"&gt;.&lt;/span&gt;document_id &lt;span style="color: blue"&gt;as&lt;/span&gt; doc2_id&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;from&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;dbo&lt;span style="color: gray"&gt;.&lt;/span&gt;document&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt; d&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;cross&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: gray"&gt;join&lt;/span&gt; dbo&lt;span style="color: gray"&gt;.&lt;/span&gt;document td&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;where&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: gray"&gt;exists&lt;/span&gt; &lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;select&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: gray"&gt;*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;from&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;dbo&lt;span style="color: gray"&gt;.&lt;/span&gt;fingerprint f1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;inner&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: gray"&gt;join&lt;/span&gt; dbo&lt;span style="color: gray"&gt;.&lt;/span&gt;fingerprint f2 &lt;span style="color: blue"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; f1&lt;span style="color: gray"&gt;.&lt;/span&gt;value &lt;span style="color: gray"&gt;=&lt;/span&gt; f2&lt;span style="color: gray"&gt;.&lt;/span&gt;value&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;where&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;f1&lt;span style="color: gray"&gt;.&lt;/span&gt;document_id &lt;span style="color: gray"&gt;=&lt;/span&gt; d&lt;span style="color: gray"&gt;.&lt;/span&gt;document_id&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;and&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;f2&lt;span style="color: gray"&gt;.&lt;/span&gt;document_id &lt;span style="color: gray"&gt;=&lt;/span&gt; td&lt;span style="color: gray"&gt;.&lt;/span&gt;document_id&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;and&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;d&lt;span style="color: gray"&gt;.&lt;/span&gt;folder_id &lt;span style="color: gray"&gt;=&lt;/span&gt; 3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;and&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;td&lt;span style="color: gray"&gt;.&lt;/span&gt;folder_id &lt;span style="color: gray"&gt;=&lt;/span&gt; 2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Figure 3: Table to keep the results of pair-wise document comparison and the query to populate it&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;After this step the Matches_report table was populated with only 44,532 records, and it is more than a thousand times less than the number of pairs the search would have had to process if it compares all suspicious documents versus all source documents: 7214 * 7215= 52,049,010.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;This step took about 1 hour 20 minutes on Node 1. As this step consists of only one query the better system performance could be achieved only by improving the hardware platform on the first node.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style="margin-left: 0cm; text-indent: 0cm"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;3.3&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;Step 3 &amp;ndash; Detecting plagiarized passages&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;At this point all the required information is ready for the main step: detection of the common fragments in documents. Figure 4 shows a stored procedure that compares two documents and returns common fingerprints. The result from this procedure is used to identify exact plagiarized excerpts and to establish anchors for the further analysis.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0" class="MsoTableGrid" style="border: medium none ; border-collapse: collapse"&gt;&lt;tbody&gt;&lt;tr style="height: 86.1pt"&gt;&lt;td width="298" valign="top" style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 223.4pt; height: 86.1pt"&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;create&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;proc&lt;/span&gt; dbo&lt;span style="color: gray"&gt;.&lt;/span&gt;document_compare&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; @doc1_id&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; @doc2_id&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;as&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;begin&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: green"&gt;--------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;set&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;nocount&lt;/span&gt; &lt;span style="color: blue"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;set&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;transaction&lt;/span&gt; &lt;span style="color: blue"&gt;isolation&lt;/span&gt; &lt;span style="color: blue"&gt;level&lt;/span&gt; &lt;span style="color: blue"&gt;read&lt;/span&gt; &lt;span style="color: blue"&gt;uncommitted&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: green"&gt;--------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;select&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; fp1&lt;span style="color: gray"&gt;.&lt;/span&gt;position &lt;span style="color: blue"&gt;as&lt;/span&gt; position1&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; fp2&lt;span style="color: gray"&gt;.&lt;/span&gt;position &lt;span style="color: blue"&gt;as&lt;/span&gt; position2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;from&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;dbo&lt;span style="color: gray"&gt;.&lt;/span&gt;fingerprint fp1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;inner&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: gray"&gt;join&lt;/span&gt; fingerprint fp2 &lt;span style="color: blue"&gt;on&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; fp1&lt;span style="color: gray"&gt;.&lt;/span&gt;value&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; fp2&lt;span style="color: gray"&gt;.&lt;/span&gt;value&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;and&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; fp1&lt;span style="color: gray"&gt;.&lt;/span&gt;seq_num&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; fp2&lt;span style="color: gray"&gt;.&lt;/span&gt;seq_num&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;where&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; fp1&lt;span style="color: gray"&gt;.&lt;/span&gt;document_id &lt;span style="color: gray"&gt;=&lt;/span&gt; @doc1_id&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="color: gray"&gt;and&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; fp2&lt;span style="color: gray"&gt;.&lt;/span&gt;document_id &lt;span style="color: gray"&gt;=&lt;/span&gt; @doc2_id&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;order&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: blue"&gt;by&lt;/span&gt; fp1&lt;span style="color: gray"&gt;.&lt;/span&gt;position&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;return&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: gray"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;0&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="NormalPrimParrafo"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="NormalPrimParrafo"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; color: blue"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="NormalPrimParrafo"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Figure 4: Stored procedure to compare documents and to return common fingerprints&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;The main point here is the proper indexing of the Fingerprint table; the procedure displayed in the Figure 4 uses Index 1 (see Figure 2). The execution plan for the procedure is shown in Figure 5. It is easy to spot how efficient the execution plan is because it uses only index seeks and a merge join. Actually the sorting step is not that expensive as it is shown on the execution plan, because it works with quite low number of items, which are left after the join. In fact, this is the best possible plan for the procedure shown on the Figure 4 and the procedure returns results almost instantaneously.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: left" class="MsoNormal" align="left"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_s1026" type="#_x0000_t75"  style='position:absolute;left:0;text-align:left;margin-left:1.2pt;  margin-top:1.6pt;width:210pt;height:57pt;z-index:-1' wrapcoords="-58 0 -58 21386 21600 21386 21600 0 -58 0"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\SHCHER~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image005.png"   o:title="compare_plan"/&gt;  &lt;w:wrap type="tight"/&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;img src="http://stat8.blog.ru/lr/09256f7dcd53f6bb9aed3c73f64bf276" border="0" title="pic3.JPG" alt=""&gt; &lt;!--[endif]--&gt;&lt;/p&gt;&lt;p style="text-align: left" class="MsoNormal" align="left"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Figure 5: Execution plan for the comparison procedure&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;After all common fingerprints have been identified and thus provided established anchors, the next task was to find common intervals for marking up the plagiarized passages. For better performance this process was distributed among two workstations (Node 2, Node 3), each running a console application (C#, .NET 2.0) that performs the following steps:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 18pt; text-align: left; text-indent: -18pt" class="MsoNormal" align="left"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;1.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;Retrieve an unprocessed document from the Document table.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 18pt; text-align: left; text-indent: -18pt" class="MsoNormal" align="left"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;2.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;Retrieve records for the suspicious document from the Matches_report table.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 18pt; text-align: left; text-indent: -18pt" class="MsoNormal" align="left"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;3.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;For each record execute Document_compare procedure (Figure 4).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 54pt; text-indent: -18pt" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;a.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;For each result skip forward character by character in both source and suspicious documents, while characters are equal. This will identify exact excerpt.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 54pt; text-indent: -18pt" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;b.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;Start skipping forward &lt;em&gt;n&lt;/em&gt; characters, and compare excerpts using Levenstein&amp;rsquo;s distance. This will identify near similar and obfuscated excerpts.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 18pt; text-indent: -18pt" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;4.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;Save identified intervals into the table Interval on the server (Node 1).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Both nodes used several separate threads for this processing (10 threads on Node 2, 5 threads on Node 3). Each thread processes a separate document, retrieved on the step 1 shown above.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;While performing the processing described in this step we had to solve another problem caused by often long time power outages in Nigeria. To address the recovery issue we had to make the restart possible from any point of the processing. The Status field was added into both Document and Matches_report tables. This field contains one of three flags that help to recover incomplete transactions and resume processing. The detection of passages took about 50 minutes and this time could be improved by increasing the computational power of the processing nodes (nodes 2 and 3) or by further increasing the number of nodes.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style="margin-left: 0cm; text-indent: 0cm"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;3.4&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;Step 4 &amp;ndash; Compiling results&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;At this step Microsoft SQL Server Integration Services was used to export information about detected plagiarism to XML files with the required format. The export package is shown in the Figure 6. &lt;span&gt;&amp;nbsp;&lt;/span&gt;The export time was about 30 minutes.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;img src="http://stat8.blog.ru/lr/0925ee51cdc17b876a24250fd50f58aa" border="0" title="pic4.JPG" alt=""&gt;&lt;/p&gt;&lt;p style="text-indent: 0cm" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Figure 6: SSIS package to make the results&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h1 style="margin-left: 0cm; text-indent: 0cm"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;4&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;!--[endif]--&gt;&lt;span&gt;Conclusion&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p class="NormalPrimParrafo"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;As the competition results indicate the proposed approach provides very competitive results on external plagiarism detection. During the competition the solution showed the best values in preciseness of the results. Moreover it comes in the ready-to-deploy form that can be easily implemented on Microsoft SQL Server. This will allow easy integration with virtually any university-wide course management system. The required improvements to reduce the granularity of results are planned for implementation in the next version of the program. At this stage of the development the solution is publicly available for downloading as a desktop version at www.siberiasoft.info.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Ttulo0"&gt;&lt;span&gt;References&lt;/span&gt;&lt;/p&gt;&lt;p class="Bibliografia"&gt;&lt;span&gt;Hart, M., &amp;amp; Friesner, T. (2004) Plagiarism and poor academic practice &amp;ndash; A threat to the extension of e-learning in higher education? The Electronic Journal of e-Learning (Vol. 2(2)), December 2004.&lt;/span&gt;&lt;/p&gt;&lt;p class="Bibliografia"&gt;&lt;span&gt;Maurer, H., Kappe F., Zaka B. (2006) Plagiarism &amp;ndash; A Survey. Journal of Universal Computer Sciences, vol. 12, no. 8, pp. 1050 &amp;ndash; 1084.&lt;/span&gt;&lt;/p&gt;&lt;p class="Bibliografia"&gt;&lt;span&gt;Nitterhouse, D. (2003). Plagiarism: Not just an academic problem. Teaching Business Ethics, 7, 215-227&lt;/span&gt;&lt;/p&gt;&lt;p class="Bibliografia"&gt;&lt;span&gt;Schleimer S., Wilkerson D., and Aiken A. (2003). Winnowing: Local Algorithms for Document Fingerprinting. Proceedings of the ACM SIGMOD International Conference on Management of Data, pages 76-85, June 2003.&lt;/span&gt;&lt;/p&gt;&lt;p class="Bibliografia"&gt;&lt;span style="font-size: 11pt; font-family: 'Times New Roman','serif'"&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;</description><category>sql server</category></item><item><guid isPermaLink="true">http://scherbinin.blog.ru/76438291.html</guid><pubDate>Mon, 15 Jun 2009 05:29:38 GMT</pubDate><title>Crot занял 6-е место в первом международном чемпионате по обнаружению плагиата</title><link>http://scherbinin.blog.ru/76438291.html</link><description>&lt;p&gt;Просто хорошая новость :)&lt;/p&gt;&lt;p&gt;&lt;br&gt;Результаты можно увидеть здесь:&lt;br&gt;&lt;a href="http://www.uni-weimar.de/medien/webis/research/events/pan-09/competition.html#results"&gt;http://www.uni-weimar.de/medien/webis/research/workshopseries/pan-09/competition.html#results&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;6-е место, конечно, далеко от 1-го, но мы постоянно улучшаем качество :)&lt;br&gt;&lt;br&gt;Скачать evaluation version Крота можно здесь:&lt;br&gt;http://siberiasoft.info&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><guid isPermaLink="true">http://scherbinin.blog.ru/74699107.html</guid><pubDate>Sun, 07 Jun 2009 05:18:35 GMT</pubDate><title>Старая песня: оптимизация запросов... - часть 1, пролог</title><link>http://scherbinin.blog.ru/74699107.html</link><description>&lt;p class="MsoNormal"&gt;&lt;span&gt;Уж сколько за последние годы написано об оптимизации sql-запросов, а вопросы на sql.ru те же самые -- все же работало, и как-то вдруг перестало?! Heelp!&lt;br&gt;&lt;br&gt;Начинаю серию статей об оптимизации запросов, где попробую простым язык объяснить, как же работает оптимизатор запросов, и как сделать так, чтобы все было быстро, не гадая при этом на кофейной гуще. Может быть удастся помочь хоть кому-то...&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;Начнем с простого запроса к одной таблице. Для примера возьмем таблицу заказов из некоторой гипотетической системы учета продаж бананов. Сценарий создания таблицы приведен ниже:&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;create&lt;/span&gt; &lt;span&gt;table&lt;/span&gt; &lt;span&gt;dbo&lt;/span&gt;.&lt;span&gt;order&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; (&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;order&lt;/span&gt;_&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; int&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;identity&lt;/span&gt; (1, 1)&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;,&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; customer_id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; int&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; ,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; order_date&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; datetime&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; ,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; shipping_date&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt; datetime&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; ,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; order_no&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; nvarchar(32)&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; ,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; order_amt&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; int&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; ,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; order_total&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; money&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;br&gt;Итак, таблица создана, клиентское приложение написано, пользователи вносят данные и периодически им требуется строить различные отчеты. Например, очень важный отчет &amp;ndash; список заказов, которые необходимо доставить определенному клиенту в некоторый день:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0" class="MsoTableGrid" style="border: medium none ; border-collapse: collapse"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border: 1pt solid windowtext; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;customer&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;shipping_date&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;no&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;order_amt&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;1&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080809&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;З-23&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;100.20&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;1&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080809&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;З-23/2&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;15&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;200.10&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;1&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080809&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;СЗ-24&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;32&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;90&lt;/span&gt;&lt;span&gt;.50&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;1&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080809&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;СЗ-25&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;11&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;310.10&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;Совсем несложно написать запрос,который вернет такой список:&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;select &lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; customer_id&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; ,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; shipping_date&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; ,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; order_no&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; ,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; order_amt&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; ,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; order_total&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;from dbo.order o&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;where &lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; customer_id&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; = 1&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; and&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; order_date&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; ='20080809'&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;br&gt;Первое время построение этого отчета занимает 1-2 секунды. Все счастливы, компания процветает, открываются новые офисы по всему миру, база данных растет, и постепенно на построение этого важного отчета уходит все больше и больше времени. С некоторого момента пользователи часами ждут построения отчета, выпивая огромное количества чая, кофе и антидепрессантов, потому что отгрузки срываются, клиенты нервничают, руководство в бешенстве и все винят &amp;laquo;бездельников из&lt;/span&gt; &lt;span&gt;IT&lt;/span&gt;&amp;raquo;.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;br&gt;Что же случилось? Почему правильный запрос, совсем недавно выполнявшийся за несколько мгновений, теперь выполняется часами и ставит под угрозу нашу карьеру? Может быть давно пора перейти на&lt;/span&gt; &lt;span&gt;Oracle&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;DB&lt;/span&gt;&lt;span&gt;2 или вообще на&lt;/span&gt; &lt;span&gt;MySQL&lt;/span&gt; &lt;span&gt;(поговаривают,&lt;/span&gt; &lt;span&gt;MySQL&lt;/span&gt; &lt;span&gt;действительно быстр)?&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;br&gt;Давайте пока попросим помолчать коллег-ораклоидов, заявляющих о медлительности и тупости&lt;/span&gt; MS SQL&lt;span&gt;, и выясним что жеслучилось, и вообще, что же на самом деле происходит, когда пользователь запускает построение отчета.&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span&gt;Назад к динозаврам&lt;/span&gt;&lt;/h2&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;Забудем ненадолго про мощные серверы, высокопроизводительные базы данных, и вообще про&lt;/span&gt; IT&lt;span&gt;, и подумаем, как был бы организован этот процесс в далекие времена, когда программируемый калькулятор МК был удивительным изобретением нечеловеческого разума.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;br&gt;Представьте, что у нас в организации есть специально обученный человек по имени Маша Ведро, который занимается ведением картотеки заказов клиентов. В ее распоряжении есть куча папок для бумаг&lt;/span&gt; &lt;span&gt;Erich&lt;/span&gt; &lt;span&gt;Krause&lt;/span&gt; &lt;span&gt;и ее любимый красный степлер.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;Круглые сутки она заполняет вот такие бланки и складывает их в папки:&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;img src="http://stat8.blog.ru/lr/091744602509c66e13f7c954ad3ffdfd" border="0" title="orders.JPG" alt=""&gt;&amp;nbsp;&lt;br&gt;Каждый день Маша должна предоставлять отделу доставки бланки заказов, которые необходимо отгрузить клиентам. Но, к сожалению, все эти бланки и папки находятся в совершенном беспорядке, потому что Маша много пьет и в результате постоянно роняет и перемешивает бланки:&lt;/span&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0" class="MsoTableGrid" style="border: medium none ; border-collapse: collapse"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border: 1pt solid windowtext; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;customer&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;shipping_date&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;no&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;order_amt&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;2&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080605&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;З-12&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;67&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;12.50&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;3&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080709&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;З-130&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;100.20&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;2&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080403&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;З-23/2&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;23&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;200.10&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;1&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080605&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;СЗ-21&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;45&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;90&lt;/span&gt;&lt;span&gt;.50&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;2&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;СЗ-20&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;16&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;310.10&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;Как же Маше найти все заказы, которые требуется отгрузить 5 июня? В данной сложной ситуации ей ничего не остается, как прийти пораньше на работу, достать все папки с заказами иначать перебирать их по одному, откладывая заказы на 5 июня.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;Когда компания только начала работать и заказов было немного, Маше хватало 8 часов рабочего времени,чтобы найти все заказы на завтра. Однако из-за грамотной работы отделамаркетинга и удивительных вкусовых качеств наших бананов, Маше стало не хватать и целого рабочего дня. Как раз это и произошло с нашим запросом&lt;/span&gt;&amp;nbsp;&lt;span&gt;&amp;ndash; у сервера нет другого варианта, кроме как последовательно перебирать все записи, отфильтровывая требуемые, и неудивительно, что с ростом объема данных этот процесс будет занимать все больше и больше времени.&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;br&gt;Один из вариантов решения проблемы &amp;ndash; нанять Маше помощницу, однако с увеличением объема заказов понадобится и вторая, и третья, затем они организуют профсоюз, потребуют повышения зарплаты... В современных терминах это вариант увеличения производительности за счет наращивания мощности аппаратной составляющей.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;Другой вариант &amp;ndash; увеличить производительность труда самой Маши. Для этого можно воспользоваться несколькими методиками.&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span&gt;Руководство по алгоритмам поиска для Маши Ведро&lt;/span&gt;&lt;/h2&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;В нашем случае можно отсортировать все бланки заказов по дате доставки, а Машу отправить на принудительное лечение, чтобы она их больше не путала:&lt;/span&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0" class="MsoTableGrid" style="border: medium none ; border-collapse: collapse"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border: 1pt solid windowtext; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;customer&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;shipping_date&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;no&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;order_amt&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;2&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080403&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;З-23/2&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;23&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;200.10&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;2&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080605&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;З-12&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;67&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;12.50&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;1&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080605&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;СЗ-21&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;45&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;90&lt;/span&gt;&lt;span&gt;.50&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;2&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;СЗ-20&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;16&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;310.10&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="94" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 70.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;3&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="105" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 78.5pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;20080709&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="73" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 54.6pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;З-130&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="80" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 60.15pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="86" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 64.75pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;100.20&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;В терминах баз данных мытолько что создали индекс. Теперь Маша может воспользоваться различными алгоритмами для быстрого поиска необходимых заказов.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;br&gt;Один из таких алгоритмов &amp;ndash; двоичный (бинарный) поиск. Работает он следующим образом &amp;ndash; допустим, намтребуется найти заказ за 20080403, тогда, множество записей, отсортированное по некоторому ключу (&lt;/span&gt;&lt;span&gt;shipping&lt;/span&gt;_&lt;span&gt;date&lt;/span&gt; &lt;span&gt;в нашем случае), разбивается на две половины. Средний элемент в нашейтаблице &amp;ndash; 200080605 (если количество элементов четное, можно выбрать правый илилевый элемент &amp;ndash; это не имеет существенного значения). Дата 20080403 предшестует среднему элементу (200080605) и так как множество записей отсортировано по&lt;/span&gt; shipping&lt;span&gt;_&lt;/span&gt;date&lt;span&gt;, это значит, что искомый элемент (если он существует), находится в первой половине. Снова повторяем этот процесс &amp;ndash; разбиваемся первую половину на две и сравниваемискомое значение со средним элементом. В нашем случае &amp;ndash; это 20080605. Повторяем процесс &amp;ndash; у нас остался один элемент &amp;ndash; 20080403, процесс окончен, заказ найден.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;br&gt;Давайте посчитаем,сколько времени мы сэкономили, используя этот алгоритм поиска. Допустим, что напросмотр одного бланка заказа у Маши уходит 1 минута, тогда на полный просмотр всех заказов у нее ушло бы 5 минут. В нашем случае ей понадобилось просмотреть только три заказа &amp;ndash; 3 минуты. Теперь допустим, что заказов не 5, а 10000. Сколько бланков придется просмотреть в худшем случае? Делим 10000 пополам &amp;ndash; 5000, 5000 пополам &amp;ndash; 2500 и так далее, в результате получается 9 бланков или 9 минут, вместо 10000 минут &amp;ndash; преимущество по сравнению с полным просмотром очевидно. Сколько же бланков придется просмотреть в общем случае? Для&lt;/span&gt; n бланков в худшем случае потребуется выполнить log n операций &amp;ndash; столько раз можно разделить n на два, прежде чем получится 1.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;br&gt;Двоичный поиск &amp;ndash; один их первых алгоритмов, разработанных для оптимизации поиска по большим массивам данных. Однако этот алгоритм имеет один недостаток &amp;ndash; количество операций (азначит и время доступа) для разных записей может отличаться. Например, длянахождения заказа от 20080605 понадобится выполнить всего одну операцию просмотра, а для заказа от 20080403 &amp;ndash; три. Это может не лучшим образом сказаться на производительности система. В&lt;/span&gt; &lt;span&gt;MS&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;для организации индексов и поиска по ним использует другой алгоритм, чтобы гарантировать одинаковое время доступа ко всем элементам индекса &amp;ndash;&lt;/span&gt; B&lt;span&gt;+деревья.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;</description><category>sql server оптимизация запросов</category></item><item><guid isPermaLink="true">http://scherbinin.blog.ru/74690211.html</guid><pubDate>Sat, 06 Jun 2009 21:31:15 GMT</pubDate><title>Microsoft SQL Server Coding and Development Standard</title><link>http://scherbinin.blog.ru/74690211.html</link><description>&lt;div class="Section1" align="left"&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;Писалось два года назад для одного американского клиента, может кому еще пригодится. Замечания/дополнения &amp;ndash; &lt;span&gt;very&lt;/span&gt; &lt;span&gt;welcome&lt;/span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&amp;nbsp;&lt;/span&gt;&lt;p style="margin: 0in 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Times New Roman"&gt;&lt;span&gt;PS&lt;/span&gt; &lt;span&gt;MS&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt; 2000, но многие вещи применимы и для 2005/2008&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br&gt;&lt;br&gt;vladislav.scherbinin@gmail.com&lt;br&gt;&lt;span&gt;&lt;br&gt;Revisions history:&lt;br&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;span&gt;&lt;br&gt;v.1.0&lt;/span&gt;&lt;/span&gt;&lt;span&gt;. Created by &lt;span class="SpellE"&gt;Vlad&lt;/span&gt; A. &lt;span class="SpellE"&gt;Scherbinin&lt;/span&gt; 01/07/07&lt;/span&gt;&lt;span class="GramE"&gt;&lt;span&gt;&lt;br&gt;v.1.1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;. Modified by &lt;span class="SpellE"&gt;Vlad&lt;/span&gt; A. &lt;span class="SpellE"&gt;Scherbinin&lt;/span&gt; 01/09/07&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span&gt;This document describes &lt;span class="msoIns"&gt;&lt;ins datetime="2007-01-07T19:40" cite="mailto:Vlad"&gt;the&lt;/ins&gt;&lt;/span&gt; common patterns and guidelines for convenient coding and development of the T-SQL code. It is strongly &lt;span class="msoIns"&gt;&lt;ins datetime="2007-01-07T19:45" cite="mailto:Vlad"&gt;advised&lt;/ins&gt;&lt;/span&gt; to follow these recommendations, because they incorporate industry best-practices and knowledge got by trial-and-error method.&lt;br&gt;&lt;/span&gt;&lt;span&gt;&lt;br&gt;&lt;span&gt;You can put all templates used in this document into the folder&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Courier New"&gt;C:\Program Files\Microsoft SQL Server\80\Tools\Templates\SQL Query Analyzer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;in order to use drag-and-drop feature of the Query Analyzer for code templates.&lt;/span&gt;&lt;/span&gt;&lt;h1&gt;&lt;a name="_Toc156127185" title="_Toc156127185"&gt;&lt;/a&gt;&lt;span style="font-size: 14pt; font-style: italic"&gt;&lt;span&gt;&lt;span&gt;General T-SQL Coding Guidelines&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;span&gt;This section describes &lt;span&gt;&lt;ins datetime="2007-01-07T19:43" cite="mailto:Vlad"&gt;the&lt;/ins&gt;&lt;/span&gt; common coding guidelines for Transact SQL code, used both in ad-hoc queries and other programmability objects.&lt;br&gt;&lt;/span&gt;&lt;h2&gt;&lt;a name="_Toc156127186" title="_Toc156127186"&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-style: normal"&gt;&lt;span&gt;&lt;span style="font-weight: bold"&gt;&lt;br&gt;Coding recommendations&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;span&gt;&lt;br&gt;Use the following standardized set of settings in order to avoid various problems such as possible problems with indexed &lt;span&gt;&lt;ins datetime="2007-01-09T17:33" cite="mailto:Vlad"&gt;computed&lt;/ins&gt;&lt;/span&gt; columns, indexed views, &lt;span&gt;distributed&lt;/span&gt; transactions and so on. Put this template in your code before creating any objects like views, tables, functions, procedures. When it makes sense change transaction isolation level from&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;READ UNCOMMITTED&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;to an appropriate one, but in most cases&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;READ UNCOMMITTED&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;should be used in order to minimize locking and performance improvement due to some internal optimizations done by SQL Server. &lt;span&gt;&lt;ins datetime="2007-01-09T16:57" cite="mailto:Vlad"&gt;&lt;br&gt;&lt;br&gt;In some cases&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T16:57" cite="mailto:Vlad"&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;ANSI_WARNINGS&lt;/span&gt;&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T16:57" cite="mailto:Vlad"&gt;setting can be set to&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T16:57" cite="mailto:Vlad"&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;OFF&lt;/span&gt;&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T16:57" cite="mailto:Vlad"&gt;, because some client applications could be confused with warnings&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T16:59" cite="mailto:Vlad"&gt;&lt;/ins&gt;&lt;/span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T16:57" cite="mailto:Vlad"&gt;returned&lt;/ins&gt;&lt;/span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T16:59" cite="mailto:Vlad"&gt;,&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T16:57" cite="mailto:Vlad"&gt;for example&lt;/ins&gt;&lt;/span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T16:59" cite="mailto:Vlad"&gt;, when&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2009-06-07T13:30" cite="mailto:Administrator"&gt;a&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T16:59" cite="mailto:Vlad"&gt;column used in aggregation contains&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T16:59" cite="mailto:Vlad"&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;NULL&lt;/span&gt;&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T16:59" cite="mailto:Vlad"&gt;values.&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:00" cite="mailto:Vlad"&gt;But it is strongly recommended to avoid&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:00" cite="mailto:Vlad"&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;NULLs&lt;/span&gt;&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:00" cite="mailto:Vlad"&gt;in&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:01" cite="mailto:Vlad"&gt;aggregations&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:03" cite="mailto:Vlad"&gt;and turning off this setting, because it is essential for distributed queries&lt;/ins&gt;&lt;/span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:33" cite="mailto:Vlad"&gt;, indexed views and indexes on computed columns&lt;/ins&gt;&lt;/span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:04" cite="mailto:Vlad"&gt;. To avoid warning messages,&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:01" cite="mailto:Vlad"&gt;for example, the following construction can be used&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:02" cite="mailto:Vlad"&gt;&amp;ndash;&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:01" cite="mailto:Vlad"&gt;&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:02" cite="mailto:Vlad"&gt;sum(&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:01" cite="mailto:Vlad"&gt;isnull&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:01" cite="mailto:Vlad"&gt;(&lt;/ins&gt;&lt;/span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:02" cite="mailto:Vlad"&gt;amount, 0))&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:02" cite="mailto:Vlad"&gt;.&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T16:59" cite="mailto:Vlad"&gt;&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&lt;br&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;nocount&lt;/span&gt; on&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;quoted_identifier&lt;/span&gt;, &lt;span&gt;ansi_nulls&lt;/span&gt;, &lt;span&gt;ansi_warnings&lt;/span&gt;, &lt;span&gt;arithabort&lt;/span&gt;, &lt;span&gt;concat_null_yields_null&lt;/span&gt;, &lt;span&gt;ansi_padding&lt;/span&gt; on&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;numeric_roundabort&lt;/span&gt; off&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;transaction isolation level read uncommitted&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;xact_abort&lt;/span&gt; on&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;go&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;br&gt;Avoid using &lt;span&gt;&lt;ins datetime="2009-06-07T13:30" cite="mailto:Administrator"&gt;asterisk&lt;/ins&gt;&lt;/span&gt; (*) with&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;select&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;statement, always supply only &lt;span&gt;&lt;ins datetime="2009-06-07T13:30" cite="mailto:Administrator"&gt;necessary&lt;/ins&gt;&lt;/span&gt; columns (Query Analyzer has useful drag-and-drop feature for column names, so you don&amp;rsquo;t need to type them). Using asteri&lt;span&gt;&lt;ins datetime="2009-06-07T13:30" cite="mailto:Administrator"&gt;sk&lt;/ins&gt;&lt;/span&gt; can lead to performance degrad&lt;span&gt;&lt;ins datetime="2009-06-07T13:30" cite="mailto:Administrator"&gt;ation&lt;/ins&gt;&lt;/span&gt; and errors when changing objects structure.&lt;/span&gt;&lt;span&gt;&lt;br&gt;Always supply column names in the&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;INSERT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;statement.&lt;/span&gt;&lt;p class="Code"&gt;&lt;span&gt;-- Wrong&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;insert&lt;/span&gt;&lt;/span&gt; &lt;span&gt;into &lt;span&gt;dbo.employee&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;select&lt;/span&gt;&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;dbo.sales_agent&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;br&gt;-- Correct&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;insert&lt;/span&gt;&lt;/span&gt; &lt;span&gt;into &lt;span&gt;dbo.employee&lt;/span&gt; (&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 35.4pt" class="Code"&gt;&lt;span&gt;&lt;span&gt;employee_id&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; , name&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;select&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span&gt;employee_id&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 35.4pt" class="Code"&gt;&lt;span&gt;, name&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;dbo.sales_agent&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;br&gt;Always give tables and columns aliases in order to avoid confusing. &lt;span&gt;When using column alias add &lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;AS&lt;/span&gt;&lt;/span&gt; keyword before column alias.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br&gt;Always include schema (owner) when referencing an object, this will eliminate additional compilation locking overhead for resolving owner, and will leave no place for referencing wrong objects:&lt;/span&gt;&lt;p class="Code"&gt;&lt;span&gt;-- Correct&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;select&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;e.employee_id&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;dbo.employee&lt;/span&gt; e&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;-- Wrong&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;select&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;employee_id&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;/span&gt; &lt;span&gt;employee&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;br&gt;Avoid using non-&lt;span&gt;SARGable&lt;/span&gt; predicates like wrapping columns into the functions. For example let assume code that gets all sales for single date, and dates of sales transactions also include time. Also assume &lt;span&gt;&lt;ins datetime="2007-01-07T19:53" cite="mailto:Vlad"&gt;that&lt;/ins&gt;&lt;/span&gt; we have &lt;span&gt;nonclustered&lt;/span&gt; index on&lt;/span&gt; &lt;span style="font-family: Microsoft Sans Serif"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;sale_date&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, amount&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;. Such code &lt;span&gt;&lt;ins datetime="2007-03-04T23:36" cite="mailto:Vlad"&gt;could&lt;/ins&gt;&lt;/span&gt; look like:&lt;/span&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;br&gt;-- Avoid&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;select&lt;/span&gt;&lt;/span&gt; &lt;span&gt;amount&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;dbo.sale_transaction&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;where&lt;/span&gt;&lt;/span&gt; &lt;span&gt;CONVERT(&lt;span&gt;varchar&lt;/span&gt;(8), &lt;span&gt;sale_date&lt;/span&gt;, 112) = &amp;lsquo;20061203&amp;rsquo;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;br&gt;This approach doesn&amp;rsquo;t leave a chance for &lt;span&gt;&lt;ins datetime="2007-03-04T23:35" cite="mailto:Vlad"&gt;the&lt;/ins&gt;&lt;/span&gt; optimizer to use Index Seek, only Index Scan can be used. But in this case we can use &lt;span&gt;SARGable&lt;/span&gt; predicate, and allow optimizer to use more efficient Index Seek:&lt;/span&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;br&gt;-- Much better one&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;select&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;st.amount&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;dbo.sale_transaction&lt;/span&gt; &lt;span&gt;st&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;where&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;st.sale_date&lt;/span&gt;  &gt;= &amp;lsquo;20061203&amp;rsquo; and &lt;span&gt;st.sale_date&lt;/span&gt; &lt;  &amp;lsquo;20061204&amp;rsquo;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;span&gt;When it is possible use inline&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;CASE&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;operator in order to minimize iterations.&lt;/span&gt;&lt;/span&gt; &lt;span&gt;For example, suppose &lt;span&gt;&lt;ins datetime="2007-01-07T19:54" cite="mailto:Vlad"&gt;that&lt;/ins&gt;&lt;/span&gt; we need to get employees count by age intervals &lt;  20, 20 &amp;ndash; 40,  &gt; 40. We can use the following code in order to obtain these figures:&lt;br&gt;&lt;/span&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&lt;br&gt;select&lt;/span&gt;&lt;/span&gt; &lt;span&gt;sum(case when &lt;span&gt;e.age&lt;/span&gt; &lt;  20 then 1 else 0 end) as under_20&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; , &lt;span&gt;sum(&lt;/span&gt;case when &lt;span&gt;e.age&lt;/span&gt;  &gt;= 20 and age &lt;  = 40 then 1 else 0 end) as between_20_40&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; , &lt;span&gt;sum(&lt;/span&gt;case when &lt;span&gt;e.age&lt;/span&gt;  &gt; 40 then 1 else 0 end) as over_40&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;dbo.employee&lt;/span&gt; e&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;br&gt;Always keep performance in mind, so consider useful indexes earlier in the development stage. It is a good habit to examine execution plans of your code often. &lt;span&gt;&lt;ins datetime="2007-01-09T17:12" cite="mailto:Vlad"&gt;Non-effective queries&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2009-06-07T13:32" cite="mailto:Administrator"&gt;may&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:12" cite="mailto:Vlad"&gt;not only slow down&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:13" cite="mailto:Vlad"&gt;overall&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:12" cite="mailto:Vlad"&gt;performance&lt;/ins&gt;&lt;/span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:13" cite="mailto:Vlad"&gt;, but can&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:14" cite="mailto:Vlad"&gt;also&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:13" cite="mailto:Vlad"&gt;cause&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:13" cite="mailto:Vlad"&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;tempdb&lt;/span&gt;&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:13" cite="mailto:Vlad"&gt;database overflow in the case of Grace hash-joins&lt;/ins&gt;&lt;/span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:14" cite="mailto:Vlad"&gt;, possibly leading to server stop responding.&lt;br&gt;&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br&gt;Use language-independent formats for date values &amp;ndash; it is ISO format &amp;ndash; &lt;span&gt;yyyymmdd&lt;/span&gt; or ODBC &amp;ndash; &lt;span&gt;yyyy-mm-dd&lt;/span&gt; &lt;span&gt;hh&lt;span&gt;:mi:ss&lt;/span&gt;&lt;/span&gt; (see BOL: CONVERT).&lt;/span&gt;&lt;span&gt;&lt;br&gt;ANSI-style joins are preferred than joins in the&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;clause, because they are more readable, and Microsoft announced that non-ANSI-style joins maybe deprecated in the next versions of the SQL Server. For left joins omit&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;OUTER&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;keyword.&lt;/span&gt;&lt;span&gt;&lt;br&gt;So, summarizing, following is the preferred form of the&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;statement:&lt;/span&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;select&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span&gt;o.date&lt;/span&gt;&lt;span&gt;&lt;ins datetime="2009-06-07T13:32" cite="mailto:Administrator"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; as &lt;span&gt;order_date&lt;/span&gt;&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; , &lt;span&gt;o.number&lt;/span&gt; as &lt;span&gt;order_number&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 35.4pt" class="Code"&gt;&lt;span&gt;, &lt;span&gt;od.good_id&lt;/span&gt; as &lt;span&gt;good_id&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 35.4pt" class="Code"&gt;&lt;span&gt;, &lt;span&gt;od.amount&lt;/span&gt; as &lt;span&gt;good_amount&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;dbo.order&lt;/span&gt; o&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;inner&lt;/span&gt;&lt;/span&gt; &lt;span&gt;join &lt;span&gt;dbo.order_detail&lt;/span&gt; &lt;span&gt;od&lt;/span&gt; on &lt;span&gt;od.order_id&lt;/span&gt; = &lt;span&gt;o.order_id&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;where&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;o.date&lt;/span&gt;  &gt;= &amp;lsquo;20060912&amp;rsquo; and &lt;span&gt;o.date&lt;/span&gt; &lt;  &amp;lsquo;20060913&amp;rsquo;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;br&gt;For indentation use tab&lt;span&gt;&lt;ins datetime="2007-01-07T20:20" cite="mailto:Vlad"&gt;s&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-07T20:20" cite="mailto:Vlad"&gt;set&lt;/ins&gt;&lt;/span&gt; to four spaces, and separate logically independent units of code with the single empty line.&lt;br&gt;&lt;/span&gt;&lt;span&gt;&lt;br&gt;Avoid using undocumented features, because such code can break in future releases or greatly change its behavior.&lt;/span&gt;&lt;span&gt;&lt;br&gt;Avoid using dynamic SQL in your code, because &lt;span&gt;&lt;ins datetime="2009-06-07T13:33" cite="mailto:Administrator"&gt;it&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2009-06-07T13:33" cite="mailto:Administrator"&gt;could&lt;/ins&gt;&lt;/span&gt; lead to security breaches and SQL-injection.&lt;/span&gt;&lt;span&gt;&lt;br&gt;Always include&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;ORDER BY&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;clause if you want result set to be returned in particular order, because only in this case SQL Server guarantees order.&lt;/span&gt;&lt;h2&gt;&lt;a name="_Toc156127187" title="_Toc156127187"&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-style: normal"&gt;&lt;span&gt;&lt;span style="font-weight: bold"&gt;Transactions&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;span&gt;If some work should execute as a single unit, wrap this code with transaction. Because standard settings showed earlier in this section turns on&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;XACT_ABORT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;setting, you don&amp;rsquo;t need additional error-handling code for transactions. So the typical code wrapped into the transaction will looks like:&lt;br&gt;&lt;/span&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&lt;br&gt;begin&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;tran&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;insert&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&amp;hellip;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&amp;hellip;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;commit&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;tran&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;br&gt;If &lt;span&gt;&lt;ins datetime="2007-03-04T23:29" cite="mailto:Vlad"&gt;an&lt;/ins&gt;&lt;/span&gt; error occurs, the batch will be terminated and transaction will be rolled back.&lt;/span&gt;&lt;span&gt;But keep in mind that some of SQL Server errors terminate batch and leaves transaction opened (e.g. referencing non-existing object). Such errors can only be handled at the client side. Turn off&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;XACT_ABORT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;setting and implement your own error-handling code only if there is serious case.&lt;/span&gt;&lt;h1&gt;&lt;a name="_Toc156127188" title="_Toc156127188"&gt;&lt;/a&gt;&lt;span style="font-size: 14pt; font-style: italic"&gt;&lt;span&gt;&lt;span&gt;Stored procedures&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;span&gt;&lt;br&gt;In order to improve performance, manageability and code reuse, all business logic should be implemented using stored procedures, avoid using ad-hoc queries. This section describes best-practices when using stored procedures.&lt;/span&gt;&lt;h2&gt;&lt;a name="_Toc156127189" title="_Toc156127189"&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-style: normal"&gt;&lt;span&gt;&lt;span style="font-weight: bold"&gt;&lt;br&gt;Template&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;span&gt;All stored procedures must use the following template:&lt;/span&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&lt;br&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;nocount&lt;/span&gt; on&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;quoted_identifier&lt;/span&gt;, &lt;span&gt;ansi_nulls&lt;/span&gt;, &lt;span&gt;ansi_warnings&lt;/span&gt;, &lt;span&gt;arithabort&lt;/span&gt;, &lt;span&gt;concat_null_yields_null&lt;/span&gt;, &lt;span&gt;ansi_padding&lt;/span&gt; on&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;numeric_roundabort&lt;/span&gt; off&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;transaction isolation level read uncommitted&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;xact_abort&lt;/span&gt; on&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;go&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&lt;br&gt;if&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;object_id&lt;/span&gt;('&lt;  &lt;span&gt;procedure_name&lt;/span&gt;, &lt;span&gt;sysname&lt;/span&gt;, &lt;span&gt;dbo&lt;/span&gt;.  &gt;') is null&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span&gt;exec(&lt;/span&gt;'create proc &lt;  &lt;span&gt;procedure_name&lt;/span&gt;, &lt;span&gt;sysname&lt;/span&gt;, &lt;span&gt;dbo&lt;/span&gt;.  &gt; as select 1')&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;go&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&lt;br&gt;alter&lt;/span&gt;&lt;/span&gt; &lt;span&gt;proc &lt;  &lt;span&gt;procedure_name&lt;/span&gt;, &lt;span&gt;sysname&lt;/span&gt;, &lt;span&gt;dbo&lt;/span&gt;. &gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;-- v1.0&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;-- TODO: supply description of the procedure&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;-- TODO: supply &lt;span&gt;params&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;as&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;begin&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;--------------------------------------------&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;-- &lt;span&gt;v1.0&lt;/span&gt; Created by &lt;  author, &lt;span&gt;varchar&lt;/span&gt;(128), &lt;span&gt;Vlad&lt;/span&gt; A. &lt;span&gt;Scherbinin&lt;/span&gt;  &gt; &lt;  &lt;span&gt;creation_date&lt;/span&gt;, char(8), 10/10/06 &gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;--------------------------------------------&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;nocount&lt;/span&gt; on&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;quoted_identifier&lt;/span&gt;, &lt;span&gt;ansi_nulls&lt;/span&gt;, &lt;span&gt;ansi_warnings&lt;/span&gt;, &lt;span&gt;arithabort&lt;/span&gt;, &lt;span&gt;concat_null_yields_null&lt;/span&gt;, &lt;span&gt;ansi_padding&lt;/span&gt; on&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;numeric_roundabort&lt;/span&gt; off&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;transaction isolation level read uncommitted&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;xact_abort&lt;/span&gt; on&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;--------------------------------------------&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;go&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;br&gt;This template preserves existing permissions when recreating procedures and ensures that all procedures use single convenient style. When making changes that don&amp;rsquo;t mean rewriting procedure, increment minor component of the version, put new version at the beginning of the procedure and add new line in the changes section that begins with&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Courier New"&gt;Changed by&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, and describes author, change date, and what kind of changes has been made. When totally rewriting procedure, increment major component of the version, do they same as above, but put&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Courier New"&gt;Rewritten by&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;instead of&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Courier New"&gt;Changed by&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;in the changes section.&lt;/span&gt;&lt;span&gt;&lt;br&gt;If a stored procedure accepts data from external temporary table, put this table&lt;span&gt;&lt;ins datetime="2009-06-07T13:33" cite="mailto:Administrator"&gt;&amp;rsquo;s&lt;/ins&gt;&lt;/span&gt; definition after the changes section:&lt;/span&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;br&gt;/*&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;create&lt;/span&gt;&lt;/span&gt; &lt;span&gt;table #employee (&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span&gt;&lt;span&gt;employee_id&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;,&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span&gt;varchar&lt;/span&gt;(128)&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;br&gt;Avoid using triggers, because they &lt;span&gt;&lt;ins datetime="2007-03-04T23:38" cite="mailto:Vlad"&gt;introduce&lt;/ins&gt;&lt;/span&gt; &amp;ldquo;another level of indirection&amp;rdquo; to your databases. Also avoid cascading updates and deletes because this is also brings indirect logic, &lt;span&gt;&lt;ins datetime="2007-01-09T16:56" cite="mailto:Vlad"&gt;so&lt;/ins&gt;&lt;/span&gt; use stored procedures instead.&lt;/span&gt;&lt;h1&gt;&lt;a name="_Toc156127190" title="_Toc156127190"&gt;&lt;/a&gt;&lt;span style="font-size: 14pt; font-style: italic"&gt;&lt;span&gt;&lt;span&gt;Cursor&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 14pt; font-style: italic"&gt;&lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-07T20:18" cite="mailto:Vlad"&gt;&lt;span&gt;s&lt;/span&gt;&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;span&gt;As you probably &lt;span&gt;&lt;ins datetime="2009-06-07T13:33" cite="mailto:Administrator"&gt;aware&lt;/ins&gt;&lt;/span&gt;, SQL Server is optimized for set-based operations, so use cursor only &lt;span&gt;&lt;ins datetime="2007-01-09T16:54" cite="mailto:Vlad"&gt;if&lt;/ins&gt;&lt;/span&gt; there is no set-based solution. If you have to use cursors declare them using keywords&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;LOCAL, FAST_FORWARD&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&amp;ndash; in this case SQL Server uses some internal optimizations.&lt;/span&gt;&lt;h1&gt;&lt;a name="_Toc156127191" title="_Toc156127191"&gt;&lt;/a&gt;&lt;span style="font-size: 14pt; font-style: italic"&gt;&lt;span&gt;&lt;span&gt;&lt;br&gt;Code reuse&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="font-size: 14pt; font-style: italic"&gt;&lt;span&gt;&lt;span&gt;with views and user-defined functions&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;span&gt;&lt;br&gt;Code reuse in the RDBMS world is pretty subtle thing, because improper use of programmability objects intended to this can greatly hurt the performance.&lt;/span&gt;&lt;h2&gt;&lt;a name="_Toc156127192" title="_Toc156127192"&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-style: normal"&gt;&lt;span&gt;&lt;span style="font-weight: bold"&gt;&lt;br&gt;Views&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;span&gt;&lt;br&gt;Common scenarios of using views:&lt;br&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1.&lt;span style="font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;Wrapping tables from external databases in order to avoid using four or three-part naming, and minimize code changes when a view changes its location.&lt;br&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2.&lt;span style="font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;Indexed views with aggregations in order to improve performance, when nothing else helps. Remember that in order to use indexed view in the editions other than Enterprise edition, besides general requirements (see BOL, indexed views) you must add&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;NOEXPAND&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;hint to query.&lt;br&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;3.&lt;span style="font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;Code reuse. Don&amp;rsquo;t create all-in-one view which then &lt;span&gt;&lt;ins datetime="2007-03-04T23:37" cite="mailto:Vlad"&gt;will&lt;/ins&gt;&lt;/span&gt; be used in all queries, because if you use INNER &lt;span&gt;JOINs&lt;/span&gt; and aggregations in a view, but not using respective columns, &lt;span&gt;&lt;ins datetime="2007-03-04T23:38" cite="mailto:Vlad"&gt;the&lt;/ins&gt;&lt;/span&gt; SQL Server optimizer can&amp;rsquo;t get rid of unused joins and aggregations, and consequently will not be able to produce efficient execution plan.&lt;br&gt;&lt;/span&gt;&lt;span&gt;&lt;br&gt;For views use the following template:&lt;/span&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&lt;br&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;nocount&lt;/span&gt; on&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;quoted_identifier&lt;/span&gt;, &lt;span&gt;ansi_nulls&lt;/span&gt;, &lt;span&gt;ansi_warnings&lt;/span&gt;, &lt;span&gt;arithabort&lt;/span&gt;, &lt;span&gt;concat_null_yields_null&lt;/span&gt;, &lt;span&gt;ansi_padding&lt;/span&gt; on&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;numeric_roundabort&lt;/span&gt; off&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;transaction isolation level read uncommitted&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;xact_abort&lt;/span&gt; on&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;go&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;object_id&lt;/span&gt;('&lt;  &lt;span&gt;view_name&lt;/span&gt;, &lt;span&gt;sysname&lt;/span&gt;, &lt;span&gt;dbo&lt;/span&gt;.  &gt;') is null&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span&gt;exec(&lt;/span&gt;'create view &lt;  &lt;span&gt;view_name&lt;/span&gt;, &lt;span&gt;sysname&lt;/span&gt;, &lt;span&gt;dbo&lt;/span&gt;.  &gt; as select 1 as a')&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;go&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;alter&lt;/span&gt;&lt;/span&gt; &lt;span&gt;view &lt;  &lt;span&gt;view_name&lt;/span&gt;, &lt;span&gt;sysname&lt;/span&gt;, &lt;span&gt;dbo&lt;/span&gt;. &gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;-- v1.0&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;as&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;--------------------------------------------&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;-- &lt;span&gt;v1.0&lt;/span&gt; Created by &lt;  author, &lt;span&gt;varchar&lt;/span&gt;(128), &lt;span&gt;Vlad&lt;/span&gt; A. &lt;span&gt;Scherbinin&lt;/span&gt;  &gt; &lt;  &lt;span&gt;creation_date&lt;/span&gt;, char(8), 10/10/06 &gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;--------------------------------------------&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;select&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;  &lt;span&gt;table_name&lt;/span&gt;, &lt;span&gt;sysname&lt;/span&gt;, &lt;span&gt;dbo&lt;/span&gt;. &gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="Code"&gt;&lt;span&gt;&lt;span&gt;go&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;br&gt;Don&amp;rsquo;t forget to change version information when changing &lt;span&gt;&lt;ins datetime="2007-03-04T23:37" cite="mailto:Vlad"&gt;a&lt;/ins&gt;&lt;/span&gt; view.&lt;/span&gt;&lt;h2&gt;&lt;a name="_Toc156127193" title="_Toc156127193"&gt;&lt;/a&gt;&lt;span style="font-size: 13pt; font-style: normal"&gt;&lt;span&gt;&lt;span style="font-weight: bold"&gt;&lt;br&gt;User-defined functions&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;span&gt;&lt;br&gt;Try to avoid user-defined functions at all because of slowing down performance (especially table-valued functions), but if you have to, try to create them as deterministic, because in the case of deterministic functions optimizer can produce more efficient execution plan. For the requirements list refer to BOL, deterministic functions.&lt;/span&gt;&lt;h1&gt;&lt;a name="_Toc156127194" title="_Toc156127194"&gt;&lt;/a&gt;&lt;span style="font-size: 14pt; font-style: italic"&gt;&lt;span&gt;&lt;span&gt;&lt;br&gt;Objects Naming&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;span&gt;Use C-style naming (with underscores) instead of Camel-&lt;span&gt;&lt;ins datetime="2009-06-07T13:34" cite="mailto:Administrator"&gt;casing&lt;/ins&gt;&lt;/span&gt; for all objects, including tables and table columns &amp;ndash; &lt;span&gt;transaction_amount&lt;/span&gt; instead of &lt;span&gt;TransactionAmount&lt;/span&gt;. Use lowercase for all your typing, because switching between upper and lower case only slows down coding.&lt;/span&gt;&lt;span&gt;&lt;br&gt;For tables use descriptive names in singular form &amp;ndash; employee instead of employees, because this improves development when using E-R modeling tools (automatically named primary keys and so on).&lt;/span&gt;&lt;span&gt;For stored procedures use names in the form of &lt;span&gt;entity_action&lt;/span&gt;, because this will group all the entity-related procedures close to each other.&lt;br&gt;&lt;/span&gt;&lt;span&gt;&lt;br&gt;For CRUD procedures use the following suffixes &amp;ndash; _ins, _&lt;span&gt;upd&lt;/span&gt;, _del, _get, _&lt;span&gt;sel&lt;/span&gt;. For triggers use prefix &lt;span&gt;trg&lt;/span&gt;_ and action suffix _ins, _&lt;span&gt;upd&lt;/span&gt;, _del.&lt;span&gt;&lt;ins datetime="2007-01-09T17:06" cite="mailto:Vlad"&gt;&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:08" cite="mailto:Vlad"&gt;&lt;br&gt;Never&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:06" cite="mailto:Vlad"&gt;&lt;/ins&gt;&lt;/span&gt;&lt;span&gt;&lt;ins datetime="2007-03-04T23:37" cite="mailto:Vlad"&gt;make&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:06" cite="mailto:Vlad"&gt;use&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-03-04T23:37" cite="mailto:Vlad"&gt;of the&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:06" cite="mailto:Vlad"&gt;prefix&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:07" cite="mailto:Vlad"&gt;sp_&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:06" cite="mailto:Vlad"&gt;for your&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:07" cite="mailto:Vlad"&gt;stored procedures&lt;/ins&gt;&lt;/span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:06" cite="mailto:Vlad"&gt;, because&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:07" cite="mailto:Vlad"&gt;this prefix is&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:06" cite="mailto:Vlad"&gt;reserved for system&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:07" cite="mailto:Vlad"&gt;stored procedures, and such naming will lead to additional lookups&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:08" cite="mailto:Vlad"&gt;&amp;ndash;&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:07" cite="mailto:Vlad"&gt;SQL&lt;/ins&gt;&lt;/span&gt; &lt;span&gt;&lt;ins datetime="2007-01-09T17:08" cite="mailto:Vlad"&gt;Server will first search&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:08" cite="mailto:Vlad"&gt;&lt;span style="font-family: Microsoft Sans Serif"&gt;master&lt;/span&gt;&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span&gt;&lt;ins datetime="2007-01-09T17:08" cite="mailto:Vlad"&gt;database for the procedure.&lt;/ins&gt;&lt;/span&gt;&lt;/span&gt;&lt;h1&gt;&lt;a name="_Toc156127195" title="_Toc156127195"&gt;&lt;/a&gt;&lt;span&gt;&lt;br&gt;The Last Terrible Suggestion&lt;/span&gt;&lt;/h1&gt;&lt;span&gt;&lt;br&gt;Use these recommendations, and always code &lt;span&gt;&lt;ins datetime="2009-06-07T13:36" cite="mailto:Administrator"&gt;the way&lt;/ins&gt;&lt;/span&gt; as if your code will be supported by &lt;span&gt;&lt;ins datetime="2009-06-07T13:36" cite="mailto:Administrator"&gt;a&lt;/ins&gt;&lt;/span&gt; maniac, who knows where you live &lt;span&gt;&lt;ins datetime="2009-06-07T13:35" cite="mailto:Administrator"&gt;(&amp;copy; tip of the day in one old version of Visual Studio)&lt;/ins&gt;&lt;/span&gt;.&lt;/span&gt;&lt;h1&gt;&lt;a name="_Toc156127196" title="_Toc156127196"&gt;&lt;/a&gt;&lt;span&gt;&lt;br&gt;Used sources&lt;/span&gt;&lt;/h1&gt;&lt;span&gt;&lt;span&gt;1.&lt;span style="font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;Common sense&lt;br&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2.&lt;span style="font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;Trial-and-error method&lt;br&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;3.&lt;span style="font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;Guru&amp;rsquo;s Guide To Transact SQL by Ken Henderson&lt;br&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;4.&lt;span style="font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;Guru&amp;rsquo;s Guide To Stored Procedures, XML &amp;amp; HTML by Ken Henderson&lt;br&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;5.&lt;span style="font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;The Russian SQL Server Community &amp;ndash; &lt;span&gt;sql.ru&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;6.&lt;span style="font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span&gt;sql-server-performance.com&lt;/span&gt;&lt;/div&gt;</description><category>sql server</category></item><item><guid isPermaLink="true">http://scherbinin.blog.ru/58761875.html</guid><pubDate>Tue, 31 Mar 2009 10:47:53 GMT</pubDate><title>Использование CLR-функций в Microsoft SQL Server на примере сжатия данных</title><link>http://scherbinin.blog.ru/58761875.html</link><description>&lt;div class="Section1"&gt;&lt;p class="MsoNormal"&gt;Начиная с версии 2005, &lt;span&gt;Microsoft&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt; позволяет разрабатывать хранимые процедуры и функции не только на &lt;span&gt;T&lt;/span&gt;-&lt;span&gt;SQL&lt;/span&gt;, но и на разных языках платформы .&lt;span&gt;NET&lt;/span&gt;. В этой статье мы рассмотрим создание функций для сжатия данных в &lt;span&gt;MS&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt;.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Данный подход я использовал в своей системе поиска плагиата &amp;ldquo;&lt;span&gt;The&lt;/span&gt; &lt;span&gt;Crot&lt;/span&gt;&amp;rdquo; (&lt;span&gt;&lt;a href="http://siberiasoft.info/"&gt;&lt;span style="color: #800080"&gt;http&lt;span&gt;://&lt;/span&gt;siberiasoft&lt;span&gt;.&lt;/span&gt;info&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;), чтобы немного обойти ограничение &lt;span&gt;Express&lt;/span&gt; &lt;span&gt;Edition&lt;/span&gt; на размер базы данных (4 &lt;span&gt;GB&lt;/span&gt;).&lt;/p&gt;&lt;p style="text-indent: 35.4pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #3366ff"&gt;&lt;br&gt;&lt;strong&gt;Примечание&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 70.8pt" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style="font-size: 10pt"&gt;В&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 10pt"&gt;MS&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 10pt"&gt;SQL&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 10pt"&gt;2008 появились возможности сжатия данных и резервных копий, возможно вам подойдет и этот вариант. Подробности как всегда в&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 10pt"&gt;BOL&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 10pt"&gt;&amp;ndash;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size: 10pt"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc280449.aspx"&gt;&lt;span style="color: #800080"&gt;http&lt;span&gt;://&lt;/span&gt;msdn&lt;span&gt;.&lt;/span&gt;microsoft&lt;span&gt;.&lt;/span&gt;com&lt;span&gt;/&lt;/span&gt;en&lt;span&gt;-&lt;/span&gt;us&lt;span&gt;/&lt;/span&gt;library&lt;span&gt;/&lt;/span&gt;cc&lt;span&gt;280449.&lt;/span&gt;aspx&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 10pt"&gt;.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Для сжатия данных в этом примере мы будем использовать бесплатную &lt;span&gt;open&lt;/span&gt; &lt;span&gt;source&lt;/span&gt; библиотеку SharpZipLib, которую можно загрузить по адресу &amp;ndash; &lt;a href="http://www.icsharpcode.net/OpenSource/SharpZipLib/"&gt;&lt;span style="color: #800080"&gt;http://www.icsharpcode.net/OpenSource/SharpZipLib/&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Итак, начнем. Запустите &lt;span&gt;Visual&lt;/span&gt; &lt;span&gt;Studio&lt;/span&gt; и создайте новый проект &lt;span&gt;Class&lt;/span&gt; &lt;span&gt;Library&lt;/span&gt;:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;img src="http://stat8.blog.ru/lr/090e8d8c20f2289c9e0ec3ec2cdaf5d9" border="0" title="capture_31032009_190903.jpg" alt=""&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Далее, переименуйте созданный по умолчанию класс &lt;span&gt;Class&lt;/span&gt;1 в &lt;span&gt;CompressionFunctions&lt;/span&gt;, и пометьте его модификатором &lt;span&gt;static&lt;/span&gt;.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;using&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;System;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;using&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;System.Collections.Generic;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;using&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;System.Text;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;namespace&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;CLRFunctions&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CompressionFunctions&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Распакуйте библиотеку &lt;span&gt;SharpZipLib,&lt;/span&gt; добавьте ее в решение &lt;span&gt;(File-  &gt;Add-  &gt;Existing Project&amp;hellip;),&lt;/span&gt; и добавьте ссылку на этот проект в проект &lt;span&gt;CLRFunctions (Project-  &gt;Add reference&amp;hellip;,&lt;/span&gt; вкладка &lt;span&gt;Projects).&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;img src="http://stat8.blog.ru/lr/090ef11d1f2f5d32033a8d5057ba31bb" border="0" title="capture_31032009_194904.jpg" alt=""&gt;&amp;nbsp;&amp;nbsp;&lt;br&gt;Теперь создадим в классе &lt;span&gt;Compression&lt;/span&gt; методы для упаковки и распаковки данных. Эти методы будут соответствовать скалярным функциям &lt;span&gt;MS&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt;. Для того чтобы превратить обычный метод в &lt;span&gt;CLR&lt;/span&gt;-функцию, надо всего лишь пометить его атрибутом &lt;span&gt;SqlFunctionAttribute&lt;/span&gt;. Этот атрибут находится в пространстве имен &lt;span&gt;Microsoft&lt;/span&gt;.&lt;span&gt;SqlServer&lt;/span&gt;.&lt;span&gt;Server&lt;/span&gt;, так что для удобства добавьте его в список &lt;span&gt;using&lt;/span&gt;.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Рассмотрим метод для упаковки данных. Этот метод будет принимать на вход произвольные двоичные данные, упаковывать их, и возвращать опять же двоичные данные. На сервере эти данные будут храниться в столбце типа &lt;span&gt;varbinary&lt;/span&gt;(&lt;span&gt;max&lt;/span&gt;), который в .&lt;span&gt;NET&lt;/span&gt; представлен типом &lt;span&gt;SqlBytes&lt;/span&gt; (который находится в пространстве имен &lt;span&gt;System&lt;/span&gt;.&lt;span&gt;Data&lt;/span&gt;.&lt;span&gt;SqlTypes&lt;/span&gt;, так что добавьте и его в список &lt;span&gt;using&lt;/span&gt;). Полную таблицу соответствия типов &lt;span&gt;MS&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt; типам .&lt;span&gt;NET&lt;/span&gt; &lt;span&gt;CLR&lt;/span&gt; можно найти в &lt;span&gt;MSDN&lt;/span&gt; в статье SQL Server Data Types and Their .NET Framework Equivalents.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Итак, метод будет выглядеть следующим образом:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;[&lt;span style="color: #2b91af"&gt;SqlFunctionAttribute&lt;/span&gt;()]&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;public&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SqlBinary&lt;/span&gt; ZipData(&lt;span style="color: #2b91af"&gt;SqlBinary&lt;/span&gt; data)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Теперь само сжатие. &lt;span&gt;SharpZipLib&lt;/span&gt; содержит класс &lt;span&gt;DeflaterOutputStream&lt;/span&gt;, который умеет упаковывать потоки:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;[&lt;span style="color: #2b91af"&gt;SqlFunctionAttribute&lt;/span&gt;()]&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;public&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SqlBinary&lt;/span&gt; ZipData(&lt;span style="color: #2b91af"&gt;SqlBinary&lt;/span&gt; data)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//Создаем поток в памяти,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//куда положим данные из параметра data&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt; compress = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//Собственно объект, который инкапсулирует алгоритм сжатия,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//конструктор принимает два параметра - уровень сжатия,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//и добавлять или нет заголовок zip-архива,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//true - не добавлять, нам он не нужен&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #2b91af; font-family: 'Courier New'"&gt;Deflater&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;deflater = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Deflater&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Deflater&lt;/span&gt;.BEST_COMPRESSION, &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;Создаем&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;сжимающий&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;поток&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;DeflaterOutputStream&lt;/span&gt; zos = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DeflaterOutputStream&lt;/span&gt;(compress, deflater);&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;//Записываем в сжимающий поток данные из параметра data&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;zos.Write(data.Value, 0, data.Value.Length);&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;zos.Close();&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//Преобразуем сжатый поток в массив байт и возвращаем как&lt;/span&gt;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;SqlBinary&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;return&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SqlBinary&lt;/span&gt;(compress.ToArray());&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Распаковка также достаточно проста &amp;ndash; для этого нам потребуется класс &lt;span&gt;InflaterInputStream&lt;/span&gt;:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;[&lt;span style="color: #2b91af"&gt;SqlFunction&lt;/span&gt;()]&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;public&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SqlBinary&lt;/span&gt; UnZipData(&lt;span style="color: #2b91af"&gt;SqlBinary&lt;/span&gt; data)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//Создаем поток в памяти, содержащий упакованные данные&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;//&lt;/span&gt;&lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;на&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;основании&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;параметра&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;data&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt; uncompressed = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt;(data.Value);&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;//Объект, инкапсулирующий алгоритм распаковки,&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//заголовка у нас нет, так передаем true в конструктор&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #2b91af; font-family: 'Courier New'"&gt;Inflater&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;inflater = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Inflater&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;Создаем&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;распаковывающий&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;поток&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;InflaterInputStream&lt;/span&gt; zis = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;InflaterInputStream&lt;/span&gt;(uncompressed, inflater);&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;//Промежуточный буфер для копирования данных из распаковывающего потока&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//в результирующий поток, содержаший распакованные данные&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;byte&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;[] buff = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[4096];&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt; result = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;//Копируем данные в результирующий поток&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;StreamUtils&lt;/span&gt;.Copy(zis, result, buff);&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//Преобразуем распакованный поток в массив байт и возвращаем как SqlBinary&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;return&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SqlBinary&lt;/span&gt;(result.ToArray());&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;На этом этапе откомпилируйте проект, и давайте посмотрим, как зарегистрировать и использовать эти функции в &lt;span&gt;MS&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt;. Откройте &lt;span&gt;Microsoft&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt; &lt;span&gt;Management&lt;/span&gt; &lt;span&gt;Studio&lt;/span&gt; и создайте новую БД для экспериментов.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Чтобы можно было использовать приведенные выше функции в базе данных, сначала необходимо зарегистрировать сборку, полученную в результате компиляции проекта. Это можно сделать &lt;span&gt;CREATE&lt;/span&gt; &lt;span&gt;ASSEMBLY&lt;/span&gt;, в моем случае это выглядит так:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;use&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;CLRFunctions&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;alter&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;database&lt;/span&gt; CLRFunctions &lt;span style="color: #0000ff"&gt;set&lt;/span&gt; &lt;span style="color: #0000ff"&gt;trustworthy&lt;/span&gt; &lt;span style="color: #0000ff"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;create&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;assembly&lt;/span&gt; CLRFunctions&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;from&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #ff0000"&gt;'C:\Work\Tutorials\CLRFunctions\bin\Debug\CLRFunctions.dll'&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;with&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;permission_set&lt;/span&gt; &lt;span style="color: #808080"&gt;=&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsafe&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;В этом сценарии мы сначала изменяем настройки &lt;span&gt;trustworthy&lt;/span&gt; базы данных на &lt;span&gt;on,&lt;/span&gt; чтобы можно было зарегистрировать &lt;span&gt;&amp;laquo;&lt;/span&gt;небезопасную&lt;span&gt;&amp;raquo;&lt;/span&gt; сборку &lt;span&gt;ICSharpCode.SharpZipLib.dll,&lt;/span&gt; на которую ссылается наша сборка &lt;span&gt;CLRFunctions.&lt;/span&gt; Без этого &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt; не позволит зарегистрировать сборку.&lt;/p&gt;&lt;p class="MsoNormal"&gt;После этого необходимо создать в БД функции-обертки для наших &lt;span&gt;CLR&lt;/span&gt;-функций, используя следующий сценарий:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;create&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;unzip_data&lt;span style="color: #808080"&gt;(&lt;/span&gt;@data &lt;span style="color: #0000ff"&gt;varbinary&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;returns&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;varbinary&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;as&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;external&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;name&lt;/span&gt; CLRFunctions&lt;span style="color: #808080"&gt;.&lt;/span&gt;[CLRFunctions.CompressionFunctions]&lt;span style="color: #808080"&gt;.&lt;/span&gt;UnZipData&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;create&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;zip_data&lt;span style="color: #808080"&gt;(&lt;/span&gt;@data &lt;span style="color: #0000ff"&gt;varbinary&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;returns&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;varbinary&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;as&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;external&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;name&lt;/span&gt; CLRFunctions&lt;span style="color: #808080"&gt;.&lt;/span&gt;[CLRFunctions.CompressionFunctions]&lt;span style="color: #808080"&gt;.&lt;/span&gt;ZipData&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Внешнее имя функции должно указываться в виде &lt;  Имя сборки  &gt;.[&lt;  Пространство имен  &gt;.&lt;  Имя класса  &gt;].&lt;  Имя метода  &gt;.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Давайте протестируем работу функций сначала простым сценарием:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;select&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #ff00ff"&gt;cast&lt;/span&gt;&amp;nbsp; &lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;unzip_data&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;zip_data&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff00ff"&gt;cast&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;'Some really stupid test data'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varbinary&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #808080; font-family: 'Courier New'"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #808080"&gt;)&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Если вы все сделали правильно, в результате должна получиться оригинальная строка.&lt;/p&gt;&lt;p class="MsoNormal"&gt;И более замороченным сценарием на случайных данных:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;declare&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;@test_compression &lt;span style="color: #0000ff"&gt;table&lt;/span&gt; &lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;varbinary&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #808080; font-family: 'Courier New'"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;insert&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;into&lt;/span&gt; @test_compression&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #808080; font-family: 'Courier New'"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;select&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;top&lt;/span&gt; 1000&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff00ff"&gt;cast&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff00ff"&gt;replicate&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff00ff"&gt;cast&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;newid&lt;/span&gt;&lt;span style="color: #808080"&gt;()&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varchar&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;36&lt;span style="color: #808080"&gt;)),&lt;/span&gt; &lt;span style="color: #ff00ff"&gt;abs&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;checksum&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;newid&lt;/span&gt;&lt;span style="color: #808080"&gt;()))&lt;/span&gt; &lt;span style="color: #808080"&gt;%&lt;/span&gt; 5000 &lt;span style="color: #808080"&gt;+&lt;/span&gt; 5000&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #808080"&gt;)&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;varbinary&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #808080"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;from&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;master&lt;span style="color: #808080"&gt;.&lt;/span&gt;&lt;span style="color: #008000"&gt;sys.objects&lt;/span&gt; s1&lt;span style="color: #808080"&gt;,&lt;/span&gt; master&lt;span style="color: #808080"&gt;.&lt;/span&gt;&lt;span style="color: #008000"&gt;sys.objects&lt;/span&gt; s2&lt;span style="color: #808080"&gt;,&lt;/span&gt; master&lt;span style="color: #808080"&gt;.&lt;/span&gt;&lt;span style="color: #008000"&gt;sys.objects&lt;/span&gt; s3&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;select&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff00ff"&gt;sum&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;datalength&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;data&lt;span style="color: #808080"&gt;))&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; uncompressed&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #808080"&gt;,&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff00ff"&gt;sum&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;datalength&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;zip_data&lt;span style="color: #808080"&gt;(&lt;/span&gt;data&lt;span style="color: #808080"&gt;)))&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; compressed&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #808080"&gt;,&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff00ff"&gt;cast&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;sum&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;datalength&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;zip_data&lt;span style="color: #808080"&gt;(&lt;/span&gt;data&lt;span style="color: #808080"&gt;)))&lt;/span&gt; &lt;span style="color: #808080"&gt;*&lt;/span&gt; 1.0 &lt;span style="color: #808080"&gt;/&lt;/span&gt; &lt;span style="color: #ff00ff"&gt;sum&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;datalength&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;data&lt;span style="color: #808080"&gt;)))&lt;/span&gt; &lt;span style="color: #808080"&gt;*&lt;/span&gt; 100&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;numeric&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;5&lt;span style="color: #808080"&gt;,&lt;/span&gt; 2&lt;span style="color: #808080"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #808080"&gt;)&lt;/span&gt; &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; ratio&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;from&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;@test_compression&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;strong&gt;&lt;span style="font-size: 10pt; color: #3366ff"&gt;&lt;br&gt;&lt;/span&gt;&lt;/strong&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366ff"&gt;Важное примечание&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;span style="font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Не забывайте перерегистрировать сборку и функции после изменения&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; сборки. Можете&amp;nbsp;добавить в начало сценария регистрации что-то вроде:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin-left: 70.8pt" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;drop&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;unzip_data&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 70.8pt" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;drop&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;zip_data&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 70.8pt" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;drop&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;split_text&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 70.8pt" class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;drop&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;assembly&lt;/span&gt; CLRFunctions&lt;/span&gt;&lt;/p&gt;&lt;p style="text-indent: 35.4pt" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style="font-size: 10pt; color: #3366ff"&gt;Примечание 2&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin-left: 70.8pt" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style="font-size: 10pt"&gt;Наверное, это понятно, но на всякий случай напомню, что на сжатие и упаковку уходит некоторое время и ресурсы.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 35.4pt" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style="font-size: 10pt; color: #3366ff"&gt;И последнее примечание&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin-left: 70.8pt" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style="font-size: 10pt"&gt;Тестируйте, прежде чем использовать в эксплуатационной среде.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="text-indent: 35.4pt" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Бонус &amp;ndash; создание табличной &lt;span&gt;CLR-&lt;/span&gt;функции&lt;/h2&gt;&lt;p class="MsoNormal"&gt;Функции, созданные выше, представляли собой простые скалярные функции &amp;ndash; получаем на вход данные, возвращаем один результат. Помимо скалярных функций можно создавать и табличные &lt;span&gt;CLR&lt;/span&gt;-функции. Давайте рассмотрим это на простом примере &amp;ndash; создадим функцию, которая принимает на вход текст, разбивает его на слова в соответствии с переданными разделителями, и возвращает слова в виде таблицы.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Вернитесь в &lt;span&gt;Visual&lt;/span&gt; &lt;span&gt;Studio&lt;/span&gt; и откройте проект, содержащий функции сжатия и распаковки. Добавьте в проект новый класс, назовите его &lt;span&gt;TextFunctions&lt;/span&gt; и пометьте модификаторами &lt;span&gt;public&lt;/span&gt; и &lt;span&gt;static&lt;/span&gt;:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;namespace&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;CLRFunctions&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TextFunctions&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Основное отличие табличных &lt;span&gt;CLR&lt;/span&gt;-функций в том, что они возвращают интерфейс &lt;span&gt;IEnumerable&lt;/span&gt; и для них необходимо указывать имя метода, который будет заполнять и материализовывать отдельные записи:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;[&lt;span style="color: #2b91af"&gt;SqlFunction&lt;/span&gt;(FillRowMethodName = &lt;span style="color: #a31515"&gt;&amp;quot;SplitTextFillRow&amp;quot;&lt;/span&gt;)]&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;public&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt; SplitText(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; text, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; separators)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//Разбиваем текст на элементы в соответствии с переданными разделителями&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;string&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;[] items = text.Split(separators.ToCharArray(), &lt;span style="color: #2b91af"&gt;StringSplitOptions&lt;/span&gt;.RemoveEmptyEntries);&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;//Этот массив нужен для преобразования типа string к типу CLR SqlChars&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; color: #2b91af; font-family: 'Courier New'"&gt;SqlChars&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;[] ichars = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SqlChars&lt;/span&gt;[items.Length];&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;Преобразовываем&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;элементы&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;к&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;типу&lt;/span&gt; &lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;SqlChars&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i = 0; i &lt;  items.Length; i++)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ichars[i] = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SqlChars&lt;/span&gt;(items[i]);&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ichars;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #008000; font-family: 'Courier New'"&gt;//Этот метод заполняет и материализует одну строку набора данных&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;public&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SplitTextFillRow(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; o, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SqlChars&lt;/span&gt; item)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; item = (&lt;span style="color: #2b91af"&gt;SqlChars&lt;/span&gt;) o;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Скомпилируйте и зарегистрируйте сборку, зарегиструйте функцию, и протестируйте ее работу:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;select&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #808080"&gt;*&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;from&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;split_text&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff0000"&gt;'Some really stupid test data. Yeah, really stupid!'&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #808080"&gt;,&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff0000"&gt;' . ,'&lt;/span&gt;&lt;span style="color: #808080"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span&gt;That&amp;rsquo;s all, folks! Sai gobe!&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;Приложение &amp;ndash; сценарий регистрации/перерегистрации сборки и функций&lt;/h2&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;use&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;CLRFunctions&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;drop&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;unzip_data&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;drop&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;zip_data&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;drop&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;split_text&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;drop&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;assembly&lt;/span&gt; CLRFunctions&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;alter&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;database&lt;/span&gt; CLRFunctions &lt;span style="color: #0000ff"&gt;set&lt;/span&gt; &lt;span style="color: #0000ff"&gt;trustworthy&lt;/span&gt; &lt;span style="color: #0000ff"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;create&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;assembly&lt;/span&gt; CLRFunctions&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;from&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #ff0000"&gt;'C:\Work\Tutorials\CLRFunctions\bin\Debug\CLRFunctions.dll'&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;with&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;permission_set&lt;/span&gt; &lt;span style="color: #808080"&gt;=&lt;/span&gt; &lt;span style="color: #0000ff"&gt;unsafe&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;create&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;unzip_data&lt;span style="color: #808080"&gt;(&lt;/span&gt;@data &lt;span style="color: #0000ff"&gt;varbinary&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;returns&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;varbinary&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;as&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;external&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;name&lt;/span&gt; CLRFunctions&lt;span style="color: #808080"&gt;.&lt;/span&gt;[CLRFunctions.CompressionFunctions]&lt;span style="color: #808080"&gt;.&lt;/span&gt;UnZipData&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;create&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;zip_data&lt;span style="color: #808080"&gt;(&lt;/span&gt;@data &lt;span style="color: #0000ff"&gt;varbinary&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;returns&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;varbinary&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;as&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;external&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;name&lt;/span&gt; CLRFunctions&lt;span style="color: #808080"&gt;.&lt;/span&gt;[CLRFunctions.CompressionFunctions]&lt;span style="color: #808080"&gt;.&lt;/span&gt;ZipData&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;create&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; dbo&lt;span style="color: #808080"&gt;.&lt;/span&gt;split_text&lt;span style="color: #808080"&gt;(&lt;/span&gt;@text &lt;span style="color: #0000ff"&gt;nvarchar&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;),&lt;/span&gt; @separators &lt;span style="color: #0000ff"&gt;nvarchar&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;128&lt;span style="color: #808080"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;returns&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;table&lt;/span&gt; &lt;span style="color: #808080"&gt;(&lt;/span&gt;item &lt;span style="color: #0000ff"&gt;nvarchar&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;max&lt;/span&gt;&lt;span style="color: #808080"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;as&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; color: #0000ff; font-family: 'Courier New'"&gt;external&lt;/span&gt; &lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;name&lt;/span&gt; CLRFunctions&lt;span style="color: #808080"&gt;.&lt;/span&gt;[CLRFunctions.TextFunctions]&lt;span style="color: #808080"&gt;.&lt;/span&gt;SplitText&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'"&gt;go&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><category>sql server .net clr c#</category></item><item><guid isPermaLink="true">http://scherbinin.blog.ru/58472451.html</guid><pubDate>Sun, 29 Mar 2009 14:44:25 GMT</pubDate><title>Software Ann: Боремся с плагиатом: The Crot Beta</title><link>http://scherbinin.blog.ru/58472451.html</link><description>&lt;p&gt;Я работаю в &lt;a href="http://www.aaun.edu.ng/"&gt;Американском Университете в Нигерии&lt;/a&gt;, преподаю разные дисциплины в Computer Science и Software Engineering. С первых дней столкнулся с серьезной проблемой&amp;nbsp;&amp;mdash; жуткий уровень жульничества среди студентов. Cheating здесь, к сожалению, норма жизни&amp;nbsp;&amp;mdash; начиная со школы, заканчивая правительством.&lt;br&gt;&lt;br&gt;Дабы облегчить жизнь себе и коллегам (и несколько усложнить студентам), написал софт, который можно скачать вот здесь:&lt;br&gt;&lt;a href="http://siberiasoft.info/"&gt;http://siberiasoft.info/&lt;/a&gt;&lt;br&gt;Там же есть и документация. Предназначено для преподавателей/ученых и т.д. Искать может либо по локальной БД документов, либо по Интернету.&lt;br&gt;&lt;br&gt;Поставляется в двух вариантах&amp;nbsp;&amp;mdash; облегченная версия (без SQL Server Express), и полная (с SQL Server Express соответственно). Если у вас уже есть SQL Server, и вы знаете как там чего, качайте облегченную версию.&lt;br&gt;&lt;br&gt;PS Всем приславшим критичный баг&amp;nbsp;&amp;mdash; лицензия в подарок! :)&lt;br&gt;&lt;br&gt;PPS На всякий случай&amp;nbsp;&amp;mdash; достаточно ресурсоемкая система, в качестве&amp;nbsp;хранилища используется MS SQL Express 2005, может отжирать довольно много памяти, но потом вернет, обещал по-крайней мере.&lt;/p&gt;</description></item><item><guid isPermaLink="true">http://scherbinin.blog.ru/58439859.html</guid><pubDate>Sun, 29 Mar 2009 13:28:05 GMT</pubDate><title>Использование веб-служб в Microsoft SQL Server Integration Services</title><link>http://scherbinin.blog.ru/58439859.html</link><description>&lt;h1 style="margin: 12pt 0in 3pt"&gt;&lt;span style="font-size: 18pt; color: #000000; font-family: Arial"&gt;&lt;span style="font-size: 14pt"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-size: 14pt"&gt;Использование веб-служб в &lt;span&gt;Microsoft&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt; &lt;span&gt;Integration&lt;/span&gt; &lt;span&gt;Services&lt;/span&gt; на примере получения курсов валют с сайта ЦБ РФ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;Сайт ЦБ РФ предоставляет в виде веб-служб различную полезную информацию, которая может пригодиться в ваших информационных системах. Список веб-служб можно найти по адресу&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;a href="http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx"&gt;&lt;span style="font-size: 12pt; color: #800080; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;В этой статье мы рассмотрим использование служб интеграции &lt;span&gt;Microsoft&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt; для периодического получения курсов валют.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Для начала, откройте &lt;span&gt;Microsoft&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt; &lt;span&gt;Management&lt;/span&gt; &lt;span&gt;Studio&lt;/span&gt; и создайте базу данных и таблицу, в которую будут помещаться курсы валют:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;[code lang=sql]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;create&lt;/span&gt; &lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;database&lt;/span&gt; &lt;span style="color: #000000"&gt;Currencies&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;go&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;use&lt;/span&gt; &lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;Currencies&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;go&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;create&lt;/span&gt; &lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;table&lt;/span&gt; &lt;span style="color: #000000"&gt;dbo&lt;/span&gt;&lt;span style="color: #808080"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;currency_rate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; rate_date&lt;/span&gt; &lt;span style="color: #0000ff"&gt;datetime&lt;/span&gt; &lt;span style="color: #808080"&gt;not&lt;/span&gt; &lt;span style="color: #808080"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #808080"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; rate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;money&lt;/span&gt; &lt;span style="color: #808080"&gt;not&lt;/span&gt; &lt;span style="color: #808080"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #808080"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; currency_code&lt;/span&gt; &lt;span style="color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;3&lt;/span&gt;&lt;span style="color: #808080"&gt;)&lt;/span&gt; &lt;span style="color: #808080"&gt;not&lt;/span&gt; &lt;span style="color: #808080"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #808080"&gt;,&lt;/span&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;constraint&lt;/span&gt; &lt;span style="color: #000000"&gt;pk_currency_rate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;primary&lt;/span&gt; &lt;span style="color: #0000ff"&gt;key&lt;/span&gt; &lt;span style="color: #0000ff"&gt;clustered&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="font-size: 10pt; color: #808080; font-family: 'Courier New'"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; rate_date&lt;/span&gt; &lt;span style="color: #0000ff"&gt;asc&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #808080"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; currency_code&lt;/span&gt; &lt;span style="color: #0000ff"&gt;asc&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style="font-size: 10pt; color: #808080; font-family: 'Courier New'"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #808080; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;go&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;[/code]&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Times New Roman"&gt;&lt;br&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Далее&lt;span&gt;,&lt;/span&gt; откройте &lt;span&gt;&lt;span&gt;Microsoft Business Intelligence Development Studio&lt;/span&gt;&lt;/span&gt; и создайте новый проект &lt;span&gt;&lt;span&gt;Integration Services:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090dda8129ef048ce1f16860c2204985" border="0" title="capture_29032009_161717.jpg" alt=""&gt;&amp;nbsp;&lt;br&gt;Далее необходимо создать и настроить задачу веб-службы. Но сначала давайте создадим переменную, которая будет содержать дату, на которую необходимо получить курсы валют. Для этого откройте окно &lt;span&gt;Variables&lt;/span&gt; (&lt;span&gt;View&lt;/span&gt;-  &gt;&lt;span&gt;Other&lt;/span&gt; &lt;span&gt;Windows&lt;/span&gt;-  &gt;&lt;span&gt;Variable&lt;/span&gt;) и создайте переменную с названием &lt;span&gt;ImportStartDate&lt;/span&gt;. Измените ее тип на &lt;span&gt;DateTime&lt;/span&gt; и введите дату, на которую требуется получить курс в формате месяц/день/год (для получения курсов на первое января 2009 года введите 01/30/2009).&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090d1ef27062de6eba03dfb253f89cac" border="0" title="capture_29032009_195834.jpg" alt=""&gt;&lt;br&gt;Теперь давайте создадим задачу веб-службы. Вернитесь на вкладку &lt;span&gt;Control&lt;/span&gt; &lt;span&gt;Flow&lt;/span&gt; и перетащите с панели инструментов задачу под названием &lt;span&gt;Web&lt;/span&gt; &lt;span&gt;Service&lt;/span&gt; &lt;span&gt;Task&lt;/span&gt;. Далее нажмите на задаче правую кнопку и выберите &lt;span&gt;Edit&lt;/span&gt;&amp;hellip; из появившегося меню:&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;img src="http://stat8.blog.ru/lr/090d86d6ea6b0c0bd859ad8ffe9c19ff" border="0" title="capture_29032009_165754.jpg" alt=""&gt;&amp;nbsp;&lt;br&gt;На этом этапе необходимо настроить несколько свойств задачи &amp;ndash; соединение (&lt;span&gt;HttpConnection&lt;/span&gt;) и файл описания веб-службы (&lt;span&gt;WSDLFile&lt;/span&gt;). Выберите свойство &lt;span&gt;HttpConnection&lt;/span&gt; и создайте новое &lt;span&gt;Http&lt;/span&gt;-соединение (&lt;  &lt;span&gt;New&lt;/span&gt; &lt;span&gt;connection&lt;/span&gt;&amp;hellip;  &gt;). В появившемся окне введите адрес службы &amp;ndash;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;a href="http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL"&gt;&lt;span style="font-size: 12pt; color: #800080; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;. Если в вашей сети для доступа в Интернет используется &lt;span&gt;proxy&lt;/span&gt;-сервер, заполните информацию о нем на вкладке &lt;span&gt;Proxy&lt;/span&gt;.&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090d5623feacd6fb0f62639769154a24" border="0" title="capture_29032009_170318.jpg" alt=""&gt;&amp;nbsp;&lt;br&gt;Теперь необходимо настроить файл описания веб-службы (&lt;span&gt;WSDL&lt;/span&gt; &lt;span&gt;File&lt;/span&gt;). В поле &lt;span&gt;WSDLFile&lt;/span&gt; введите путь, куда будет сохранен файл, и нажмите конпку &lt;span&gt;Download&lt;/span&gt; &lt;span&gt;WSDL&lt;/span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090d0a83163b381f7efe0402b9fb8fc7" border="0" title="capture_29032009_171026.jpg" alt=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Дождитесь окончания загрузки и перейдите на вкладку &lt;span&gt;Input&lt;/span&gt;. На этой вкладке в свойстве &lt;span&gt;Service&lt;/span&gt; выберите &lt;span&gt;DailyInfo&lt;/span&gt;, в свойстве &lt;span&gt;Method&lt;/span&gt; &amp;ndash; &lt;span&gt;GetCursOnDateXML&lt;/span&gt;. Для параметра &lt;span&gt;On&lt;/span&gt;_&lt;span&gt;date&lt;/span&gt; метода веб-службы установите флажок &lt;span&gt;Variable&lt;/span&gt; и в поле &lt;span&gt;Value&lt;/span&gt; выберите переменную &lt;span&gt;ImportStartDate.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090d478e4e5381da38be3fa601d31b9a" border="0" title="capture_29032009_200112.jpg" alt=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Далее перейдите на вкладку &lt;span&gt;Output&lt;/span&gt; и настройте вывод информации, получаемой от веб-службы. Результаты работы веб-службы можно направить в файл или в переменную. Мы будем использовать файл, так что оставьте свойство &lt;span&gt;OutputType&lt;/span&gt; равным &lt;span&gt;File&lt;/span&gt; &lt;span&gt;Connection&lt;/span&gt;, щелкните на поле &lt;span&gt;File&lt;/span&gt; и создайте новое соединение. В появившемся диалоговом окне измените значение &lt;span&gt;Usage&lt;/span&gt; &lt;span&gt;type&lt;/span&gt; на &lt;span&gt;Create&lt;/span&gt; &lt;span&gt;file&lt;/span&gt; (таким образом файл будет пересоздаваться при каждой загрузке), и в поле &lt;span&gt;File&lt;/span&gt; укажите путь к файлу с результатами работы службы.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090dbc524afd2661d955aafffd5ce19a" border="0" title="capture_29032009_190635.jpg" alt=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Итак, служба настроена, давайте проверим ее работоспособность и сгенерируем &lt;span&gt;XML&lt;/span&gt;-файл с курсами валют. Для этого нажмите правую кнопку на значке службы и выберите &lt;span&gt;Execute&lt;/span&gt; &lt;span&gt;Task&lt;/span&gt; из появившегося меню. Если все было сделано правильно, по указанному вами пути будет создан файл с курсами валют. Прежде чем продолжить, убедитесь, что он создался.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Теперь необходимо загрузить результаты ее работы (&lt;span&gt;XML&lt;/span&gt;-файл) в базу данных. Для этого перетащите с панели инструментов в область задач задачу &lt;span&gt;Data&lt;/span&gt; &lt;span&gt;Flow&lt;/span&gt; &lt;span&gt;Task&lt;/span&gt; и соедините задачу &lt;span&gt;Web&lt;/span&gt; &lt;span&gt;Service&lt;/span&gt; с этой задачей (для этого щелкните на значке задачи и перетащите зеленую стрелку).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090d4e2c3608dbd502e548b947b40f44" border="0" title="capture_29032009_191433.jpg" alt=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;После этого перейдите на вкладку &lt;span&gt;Data&lt;/span&gt; &lt;span&gt;Flow&lt;/span&gt;. Так как результаты работы веб-службы представлены в виде &lt;span&gt;XML&lt;/span&gt;-файла, источником данных будет &lt;span&gt;XML&lt;/span&gt; &lt;span&gt;Source&lt;/span&gt;. Перетащите этот элемент с панели инструментом в область задачи, нажмите правую кнопку на значке задачи и выберите &lt;span&gt;Edit&lt;/span&gt;&amp;hellip; из появившегося меню. В поле &lt;span&gt;XML&lt;/span&gt; &lt;span&gt;Location&lt;/span&gt; введите путь к файлу, созданному задачей веб-службы. Так как схемы документа у нас нет, нажмите кнопку &lt;span&gt;Generate&lt;/span&gt; &lt;span&gt;XSD&lt;/span&gt;&amp;hellip;, чтобы сгенерировать ее:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090d5c7cccebfff8f0f545d9dbdbcf70" border="0" title="capture_29032009_193406.jpg" alt=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Перейдите на вкладку &lt;span&gt;Columns&lt;/span&gt;, чтобы убедиться, что данные были правильно распознаны. Из этого источника данных нам требуется всего два столбца &amp;ndash; &lt;span&gt;Vcurs&lt;/span&gt; (курс валюты) и &lt;span&gt;VchCode&lt;/span&gt; (код валюты). Отметьте только два эти столбца.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Следующая задача &amp;ndash; преобразовать типы данных столбцов из &lt;span&gt;XML&lt;/span&gt;-файл к типам данных столбцов в базе данных. Для этого используется задача &lt;span&gt;Data&lt;/span&gt; &lt;span&gt;Conversion&lt;/span&gt;. Перетащите ее на поверхность &lt;span&gt;Data&lt;/span&gt; &lt;span&gt;Flow&lt;/span&gt; и соедините зеленой стрелкой с источником &lt;span&gt;XML&lt;/span&gt; &lt;span&gt;Source&lt;/span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090d70a0bfc4b0aa358ed4c10c1e31ec" border="0" title="capture_29032009_193918.jpg" alt=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Нажмите правую кнопку на задаче &lt;span&gt;Data&lt;/span&gt; &lt;span&gt;Conversion&lt;/span&gt; и выберите &lt;span&gt;Edit&lt;/span&gt;&amp;hellip; В появившемся окне отметьте оба столбца и измените их определения как показано на следующем рисунке (не забудьте изменить кодовую страницу для столбца &lt;span&gt;VchCode&lt;/span&gt; на 1251):&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&amp;nbsp;&lt;img src="http://stat8.blog.ru/lr/090d7a5bab968dc08a0bb1157f86d58b" border="0" title="capture_29032009_202117.jpg" alt=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Теперь к получившемуся набору данных требуется добавить еще один столбец &amp;ndash; дата курса. Для этого используется задача &lt;span&gt;Derived&lt;/span&gt; &lt;span&gt;Column&lt;/span&gt;, перетащите ее на поверхность &lt;span&gt;Data&lt;/span&gt; &lt;span&gt;Flow&lt;/span&gt; и соедините с задачей &lt;span&gt;Data&lt;/span&gt; &lt;span&gt;Conversion&lt;/span&gt;. Нажмите правую кнопку на задаче &lt;span&gt;Data&lt;/span&gt; &lt;span&gt;Conversion&lt;/span&gt; и выберите &lt;span&gt;Edit&lt;/span&gt;&amp;hellip; Настройте столбцы, как показано на следующем рисунке&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090d86bb511f7beddbf41a1e8c094b53" border="0" title="capture_29032009_202250.jpg" alt=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Здесь мы добавили новый столбец &lt;span&gt;rate&lt;/span&gt;_&lt;span&gt;date&lt;/span&gt;, значение которого получается из переменной &lt;span&gt;ImportStartDate&lt;/span&gt;, остальные столбцы просто переписываются без изменений.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Теперь можно направить результаты в базу данных &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt;. Для этого поместите приемник &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt; &lt;span&gt;Destination&lt;/span&gt; и соедините его с задачей &lt;span&gt;Derived&lt;/span&gt; &lt;span&gt;Column&lt;/span&gt;. Нажмите правую кнопку на &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt; &lt;span&gt;Destination&lt;/span&gt; и выберите &lt;span&gt;Edit&lt;/span&gt;&amp;hellip; В появившемся окне необходимо настроить соединение с &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt;, для этого нажмите кнопку &lt;span&gt;New&lt;/span&gt;&amp;hellip; рядом с полем &lt;span&gt;OLE&lt;/span&gt; &lt;span&gt;DB&lt;/span&gt; &lt;span&gt;connection&lt;/span&gt; &lt;span&gt;manager&lt;/span&gt;. Создайте новое соединение (снова нажмите кнопку &lt;span&gt;New&lt;/span&gt;&amp;hellip;). После создания соединения в поле &lt;span&gt;Use&lt;/span&gt; &lt;span&gt;a&lt;/span&gt; &lt;span&gt;table&lt;/span&gt; &lt;span&gt;or&lt;/span&gt; &lt;span&gt;view&lt;/span&gt; выберите таблицу &lt;span&gt;dbo&lt;/span&gt;.&lt;span&gt;currency&lt;/span&gt;_&lt;span&gt;rate&lt;/span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090d71abe2fef7a9d7a4972c4bd855cd" border="0" title="capture_29032009_201445.jpg" alt=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Перейдите на вкладку &lt;span&gt;Mappings&lt;/span&gt; для создания сопоставления столбцов задачи и столбцов таблицы на сервере. Нажмите &lt;span&gt;OK&lt;/span&gt;. Получившийся поток данных должен выглядеть как показано на следующем рисунке:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090d08c705954441f1b679d30d3715bd" border="0" title="capture_29032009_202403.jpg" alt=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Теперь можно запустить пакет на выполнение (&lt;span&gt;Debug&lt;/span&gt;-  &gt;&lt;span&gt;Start&lt;/span&gt; &lt;span&gt;Debugging&lt;/span&gt; или нажав &lt;span&gt;F&lt;/span&gt;5), и после завершения выполнения в таблице &lt;span&gt;dbo&lt;/span&gt;.&lt;span&gt;currency&lt;/span&gt;_&lt;span&gt;rate&lt;/span&gt; должны появиться курсы валют на указанную вами дату. Откройте &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt; &lt;span&gt;Management&lt;/span&gt; &lt;span&gt;Studio&lt;/span&gt;, найдите таблицу &lt;span&gt;dbo&lt;/span&gt;.&lt;span&gt;currency&lt;/span&gt;_&lt;span&gt;rate&lt;/span&gt;, и убедитесь, что данные были получены.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Но это еще не все &amp;ndash; теперь у нас есть пакет, получающий курсы на определенную дату. Но мы ведь не хотим вручную каждый день исправлять значение даты? Давайте посмотрим, как получить данные за произвольный период и как настроить пакет на ежедневное получение курсов.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Для этого, во-первых, нам потребуется еще одна таблица в базе данных &lt;span&gt;Currencies&lt;/span&gt;, которая будет содержать дату последнего импорта. Создайте таблицу, используя следующий сценарий:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;[code lang=sql]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;USE&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;Currencies&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;go&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;create&lt;/span&gt; &lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;table&lt;/span&gt; &lt;span style="color: #000000"&gt;dbo&lt;/span&gt;&lt;span style="color: #808080"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;config&lt;/span&gt;&lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;param_name&lt;/span&gt; &lt;span style="color: #0000ff"&gt;nvarchar&lt;/span&gt; &lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;64&lt;/span&gt;&lt;span style="color: #808080"&gt;)&lt;/span&gt; &lt;span style="color: #808080"&gt;not&lt;/span&gt; &lt;span style="color: #808080"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #808080"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; param_value&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sql_variant&lt;/span&gt; &lt;span style="color: #808080"&gt;not&lt;/span&gt; &lt;span style="color: #808080"&gt;null,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;constraint&lt;/span&gt; &lt;span style="color: #000000"&gt;pk_config&lt;/span&gt; &lt;span style="color: #0000ff"&gt;primary&lt;/span&gt; &lt;span style="color: #0000ff"&gt;key&lt;/span&gt; &lt;span style="color: #0000ff"&gt;clustered&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="font-size: 10pt; color: #808080; font-family: 'Courier New'"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; param_name&lt;/span&gt; &lt;span style="color: #0000ff"&gt;asc&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #808080"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #808080; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;go&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;insert&lt;/span&gt; &lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="color: #0000ff"&gt;into&lt;/span&gt; &lt;span style="color: #000000"&gt;dbo&lt;/span&gt;&lt;span style="color: #808080"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;config&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #808080"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; param_name&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #808080"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; param_value&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #808080; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;values&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="font-size: 10pt; color: #808080; font-family: 'Courier New'"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;'last_import_date'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'"&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #808080"&gt;,&lt;/span&gt;&lt;span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;'200&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: #ff0000; font-family: 'Courier New'"&gt;6123&lt;/span&gt;&lt;span style="font-size: 10pt; color: #ff0000; font-family: 'Courier New'"&gt;1'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #808080; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;go&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;[/code]&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Times New Roman"&gt;&lt;br&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;В данном случае мы импортируем данные с 1 января 2007 года по сегодняшнюю дату&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Вернитесь в &lt;span&gt;&lt;span&gt;Business Intelligence Development Studio&lt;/span&gt;&lt;/span&gt; и переключитесь на вкладку &lt;span&gt;&lt;span&gt;Control Flow.&lt;/span&gt;&lt;/span&gt; Следующая наша задача &amp;ndash; получить из базы данных значение даты последнего импорта. Для этого используется задача &lt;span&gt;Execute&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Task&lt;/span&gt;. Перетащите ее на поверхность пакета, нажмите правую кнопку и выберите &lt;span&gt;Edit&lt;/span&gt;&amp;hellip; Измените свойство &lt;span&gt;Name&lt;/span&gt; на &lt;span&gt;Get&lt;/span&gt; &lt;span&gt;last&lt;/span&gt; &lt;span&gt;import&lt;/span&gt; &lt;span&gt;date&lt;/span&gt;, &lt;span&gt;ResultSet&lt;/span&gt; на &lt;span&gt;Single&lt;/span&gt; &lt;span&gt;row&lt;/span&gt;, в свойстве &lt;span&gt;Connection&lt;/span&gt; выберите соединение с БД &lt;span&gt;Currencies&lt;/span&gt;, и в &lt;span&gt;SQLStatement&lt;/span&gt; введите следующий код:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;[code lang=sql]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;select cast(param_value as datetime) as param_value&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;from dbo.config&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;where param_name = 'last_import_date'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;[/code]&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;br&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Перейдите на вкладку &lt;span&gt;Result&lt;/span&gt; &lt;span&gt;Set&lt;/span&gt;, нажмите кнопку &lt;span&gt;Add&lt;/span&gt;, и измените название столбца результата на &lt;span&gt;param&lt;/span&gt;_&lt;span&gt;value&lt;/span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090dda99ea744fd6ddfbd0412e15ed4e" border="0" title="capture_29032009_204900.jpg" alt=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Следующая задача &amp;ndash; организовать цикл с последней даты импорта до текущей даты. Для этого в &lt;span&gt;SSIS&lt;/span&gt; используется контейнер &lt;span&gt;For&lt;/span&gt; &lt;span&gt;Loop&lt;/span&gt;. Перетащите его в область задач. Одновременно выделите задачи &lt;span&gt;Web&lt;/span&gt; &lt;span&gt;Service&lt;/span&gt; &lt;span&gt;Task&lt;/span&gt; и &lt;span&gt;Data&lt;/span&gt; &lt;span&gt;Flow&lt;/span&gt; &lt;span&gt;Task&lt;/span&gt;, и переместите их в контейнер &lt;span&gt;For&lt;/span&gt; &lt;span&gt;Loop&lt;/span&gt;. Соедините задачу &lt;span&gt;Get last import date&lt;/span&gt; и цикл.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Теперь необходимо настроить параметры цикла. Нажмите правую кнопку на контейнере и выберите &lt;span&gt;Edit&lt;/span&gt;&amp;hellip;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;В этом окне вы можете видеть несколько параметров, вероятно, знакомых вам по циклу &lt;span&gt;for&lt;/span&gt; в различных языкам программирования &amp;ndash; &lt;span&gt;C&lt;/span&gt;/&lt;span&gt;C&lt;/span&gt;++, &lt;span&gt;C&lt;/span&gt;#, &lt;span&gt;Java&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Свойство &lt;span&gt;InitExpression&lt;/span&gt; содержит выражение для инициализации, это выражение будет вычислено при старте цикла. Введите в это поле следующий код:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;@ImportStartDate = DateAdd(&amp;quot;day&amp;quot;, 1, @ImportStartDate)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Здесь мы просто добавляем один день к дате последнего импорта.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Выражение &lt;span&gt;EvalExpression&lt;/span&gt; управляет выполнением цикла, пока это выражение имеет значение &lt;span&gt;true&lt;/span&gt;, цикл будет выполняться. В это поле введите следующий код:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;@ImportStartDate &lt;  = DateAdd(&amp;quot;day&amp;quot;, datediff(&amp;quot;day&amp;quot;, (DT_DATE)&amp;quot;1900-01-01&amp;quot;, GETDATE()), (DT_DATE)&amp;quot;1900-01-01&amp;quot;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Это длинное выражение необходимо для сравнения текущей даты без временной составляющей и даты импорта.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Выражение &lt;span&gt;AssignExpression&lt;/span&gt; изменяет управляющую переменную цикла, в это поле введите следующий код:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;@ImportStartDate = DateAdd(&amp;quot;day&amp;quot;, 1, @ImportStartDate)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090d580a558074b4ce0270b220e05b5c" border="0" title="capture_29032009_214013.jpg" alt=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Итак, при первом запуске этот цикл получит данные, начиная с &lt;span&gt;LastImportDate&lt;/span&gt; до текущей даты.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Теперь нам осталось изменить значение даты последнего импорта в базе данных. Для этого мы снова используем &lt;span&gt;Execute&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Task&lt;/span&gt;. Добавьте эту задачу в цикл и соедините ее с &lt;span&gt;Data&lt;/span&gt; &lt;span&gt;Flow&lt;/span&gt; &lt;span&gt;Task&lt;/span&gt;. Нажмите правую кнопку на задаче и выберите &lt;span&gt;Edit&lt;/span&gt;&amp;hellip; Переименуйте задачу в &lt;span&gt;Change&lt;/span&gt; &lt;span&gt;last&lt;/span&gt; &lt;span&gt;import&lt;/span&gt; &lt;span&gt;date&lt;/span&gt;. В поле &lt;span&gt;Connection&lt;/span&gt; выберите подключение к базе данных &lt;span&gt;Currencies&lt;/span&gt;. В поле &lt;span&gt;&lt;span&gt;SQLStatement&lt;/span&gt;&lt;/span&gt; введите следующий код&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;[code lang=sql]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;UPDATE&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; config&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;SET&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; param_value = ?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: #0000ff; font-family: 'Courier New'"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;WHERE&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; (param_name = 'last_import_date')&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;[/code]&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Times New Roman"&gt;&lt;br&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Перейдите на закладку &lt;span&gt;&lt;span&gt;Parameter Mapping&lt;/span&gt;&lt;/span&gt; и добавьте соответствие значения параметра и переменной &lt;span&gt;&lt;span&gt;LastImportDate &amp;ndash;&lt;/span&gt;&lt;/span&gt; в поле &lt;span&gt;&lt;span&gt;Variable Name&lt;/span&gt;&lt;/span&gt; выберите &lt;span&gt;User::ImportStartDate,&lt;/span&gt; измените тип данных на &lt;span&gt;&lt;span&gt;DATE,&lt;/span&gt;&lt;/span&gt; в поле &lt;span&gt;&lt;span&gt;Parameter Name&lt;/span&gt;&lt;/span&gt; введите &lt;span&gt;0 &amp;ndash;&lt;/span&gt; это номер параметра в операторе &lt;span&gt;&lt;span&gt;UPDATE.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Запустите пакет на выполнение. Если все было сделано правильно, в таблице &lt;span&gt;dbo&lt;/span&gt;.&lt;span&gt;currency&lt;/span&gt;_&lt;span&gt;rate&lt;/span&gt; должны начать появляться данные.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;И последняя задача &amp;ndash; автоматизировать запуск пакета. Для этого можно использовать задания &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt; &lt;span&gt;Agent&lt;/span&gt;. Запустите &lt;span&gt;Microsoft&lt;/span&gt; &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt; &lt;span&gt;Management&lt;/span&gt; &lt;span&gt;Studio&lt;/span&gt;, раскройте узел сервера, найдите узел &lt;span&gt;SQL&lt;/span&gt; &lt;span&gt;Server&lt;/span&gt; &lt;span&gt;Agent&lt;/span&gt;. Далее нажмите правую кнопку на узле &lt;span&gt;Jobs&lt;/span&gt; и выберите &lt;span&gt;New&lt;/span&gt; &lt;span&gt;job&lt;/span&gt;&amp;hellip; На первой странице введите название задачи &amp;ndash; &lt;span&gt;Import&lt;/span&gt; &lt;span&gt;currencies&lt;/span&gt; и перейдите на страницу &lt;span&gt;Steps&lt;/span&gt;. Нажмите кнопку &lt;span&gt;New&lt;/span&gt;&amp;hellip; внизу страницы, чтобы создать новый шаг. Введите название шага &lt;span&gt;&amp;ndash; Import и в&lt;/span&gt; списке &lt;span&gt;Type&lt;/span&gt; выберите &lt;span&gt;&lt;span&gt;SQL Server Integration Services Package.&lt;/span&gt;&lt;/span&gt; Выберите расположение пакета &amp;ndash; в поле &lt;span&gt;Package&lt;/span&gt; &lt;span&gt;source&lt;/span&gt; укажите &lt;span&gt;File&lt;/span&gt; &lt;span&gt;system&lt;/span&gt; и в поле &lt;span&gt;Package&lt;/span&gt; внизу страницы введите путь к пакету:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;img src="http://stat8.blog.ru/lr/090d82eeb81bab7f9990c066fb9a9410" border="0" title="capture_29032009_215352.jpg" alt=""&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Нажмите &lt;span&gt;OK&lt;/span&gt; и перейдите на страницу &lt;span&gt;Schedules&lt;/span&gt;. Здесь вы можете настроить расписание запуска пакета. Вот теперь &amp;ndash; все, можете расслабиться и наслаждаться плодами своего труда.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;&lt;span&gt;PS&lt;/span&gt; Ах да, не забудьте настроить обработку ошибок.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt; color: #000000; font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;Влад А. Щербинин,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 6pt 0in 0pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="color: #000000"&gt;&lt;span style="font-family: Times New Roman"&gt;&lt;span style="font-family: tahoma,arial,helvetica,sans-serif"&gt;&lt;span style="font-family: times new roman,times"&gt;29 марта 2009 г., Йола, Нигерия&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description><category>sql server ssis</category></item><item><guid isPermaLink="true">http://scherbinin.blog.ru/7404819.html</guid><pubDate>Sun, 04 May 2008 08:27:59 GMT</pubDate><title>Quick test data generation</title><link>http://scherbinin.blog.ru/7404819.html</link><description>When you need to quickly generate a large set of test data, it is very handy to use a trick with newid() function and master.sys.objects (master..sysobjects) table.&lt;br&gt;&lt;br&gt;For example:&lt;br&gt;[code lang=sql]&lt;br&gt;insert into dbo.test (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;amount&lt;br&gt;&amp;nbsp;&amp;nbsp;,&amp;nbsp;order_date)&lt;br&gt;select&amp;nbsp;&amp;nbsp;top 100000&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;abs(checksum(newid())) % 20 /* random number 0..19*/&lt;br&gt;&amp;nbsp;&amp;nbsp;,&amp;nbsp;dateadd(dd, abs(checksum(newid())) % 365, '20000101') /* random date within year 2000*/&lt;br&gt;from master.sys.objects s1, master.sys.objects s2, master.sys.objects s3&amp;nbsp;&lt;br&gt;[/code]</description><category>sql server</category></item><item><guid isPermaLink="true">http://scherbinin.blog.ru/7399219.html</guid><pubDate>Sun, 04 May 2008 04:21:02 GMT</pubDate><title>Yet another myth about clustered indexes in MS SQL</title><link>http://scherbinin.blog.ru/7399219.html</link><description>There are many myths about clustered index. One of them is that when clustered index exists on the table, the database engine doesn't use IAM pages anymore to retrieve data, it uses doubly-linked list of pages. Also one of my favorite authors&amp;nbsp;&amp;mdash; Khen Henderson mentioned that. This is just partially true. I found that in the read uncommitted isolation level, SQL Server still uses IAM to retrieve data.&lt;br&gt;&lt;br&gt;Here is the repro:&lt;br&gt;(MS SQL 2k)&lt;br&gt;[code lang=sql]&lt;br&gt;create database test&lt;br&gt;go&lt;br&gt;use test&lt;br&gt;go&lt;br&gt;drop table dbo.test&lt;br&gt;go&lt;br&gt;create table dbo.test (&lt;br&gt;i int primary key clustered identity(1, 1),&lt;br&gt;d int&lt;br&gt;)&lt;br&gt;go&lt;br&gt;insert into dbo.test (d)&lt;br&gt;select top 100000 checksum(newid()) from master..sysobjects s1, master..sysobjects s2, master..sysobjects s3&lt;br&gt;go&lt;br&gt;&lt;br&gt;select * from dbo.test with(readuncommitted)[/code]&lt;br&gt;The execution plan shows clustered index scan, the result is:&lt;br&gt;3328&amp;nbsp;&amp;mdash;1892742514&lt;br&gt;3329&amp;nbsp;&amp;mdash;1303737718&lt;br&gt;3330&amp;nbsp;&amp;mdash;1030174007&lt;br&gt;3331&amp;nbsp;&amp;mdash;157548677&lt;br&gt;3332 1160183127&lt;br&gt;98533&amp;nbsp;&amp;mdash;1095189775&lt;br&gt;98534&amp;nbsp;&amp;mdash;1661674379&lt;br&gt;98535&amp;nbsp;&amp;mdash;1640363165&lt;br&gt;98536 &amp;mdash;1313858725&lt;br&gt;98537&amp;nbsp;&amp;mdash;271346219&lt;br&gt;&lt;br&gt;select * from dbo.test&lt;br&gt;Clustered index scan, the result is :&lt;br&gt;3328&amp;nbsp;&amp;mdash;1892742514&lt;br&gt;3329&amp;nbsp;&amp;mdash;1303737718&lt;br&gt;3330&amp;nbsp;&amp;mdash;1030174007&lt;br&gt;3331&amp;nbsp;&amp;mdash;157548677&lt;br&gt;3332 1160183127&lt;br&gt;3333&amp;nbsp;&amp;mdash;1669536656&lt;br&gt;3334&amp;nbsp;&amp;mdash;327094669&lt;br&gt;3335&amp;nbsp;&amp;mdash;1424229963&lt;br&gt;3336&amp;nbsp;&amp;mdash;923814371&lt;br&gt;3337 655524158&lt;br&gt;&lt;br&gt;Why so? Why we've got unsorted result in the first case (I know about ordering guaranties and so on, I'm speaking about a different thing)? Let's go more deeply.&lt;br&gt;&lt;br&gt;[code lang=sql]dbcc traceon(3604)&lt;br&gt;go&lt;br&gt;declare @db_id int, @tbl_id int&lt;br&gt;select @db_id = db_id('test'), @tbl_id = object_id('test')&lt;br&gt;dbcc tab (@db_id, @tbl_id)[/code]&lt;br&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-size: 78%"&gt;&lt;span style="font-family: courier new"&gt;PageFID PagePID IAMFID IAMPID ObjectID IndexID PageType IndexLevel NextPageFID NextPagePID PrevPageFID PrevPagePID&lt;br&gt;---- ------ --- ------ ------ ---- ---- ----- ------ ------ ------ ------&lt;br&gt;1 25 NULL NULL 2073058421 1 10 0 0 0 0 0&lt;br&gt;1 15 1 25 2073058421 1 2 0 0 0 0 0&lt;br&gt;1 28 1 25 2073058421 0 1 0 1 29 0 0&lt;br&gt;1 29 1 25 2073058421 0 1 0 1 30 1 28&lt;br&gt;1 30 1 25 2073058421 0 1 0 1 31 1 29&lt;br&gt;1 31 1 25 2073058421 0 1 0 1 33 1 30&lt;br&gt;1 33 1 25 2073058421 0 1 0 1 34 1 31&lt;br&gt;1 34 1 25 2073058421 0 1 0 1 35 1 33&lt;br&gt;1 35 1 25 2073058421 0 1 0 1 1704 1 34&lt;br&gt;1 1616 1 25 2073058421 0 1 0 1 1617 1 1631&lt;br&gt;1 1617 1 25 2073058421 0 1 0 1 1618 1 1616&lt;br&gt;1 1618 1 25 2073058421 0 1 0 1 1619 1 1617&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;Let's examine the page 1616:&lt;br&gt;[code lang=sql]dbcc page('test', 1, 1616, 3)[/code]&lt;br&gt;Slot 0 Offset 0x60&lt;br&gt;-----&lt;br&gt;Record Type = PRIMARY_RECORD&lt;br&gt;Record Attributes = NULL_BITMAP&lt;br&gt;6B906060: 000c0010 000180e5 beb8baf1 000002 &amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&lt;br&gt;i = 98533&lt;br&gt;d = -1095189775&lt;br&gt;&lt;br&gt;It is here! So, as you see, the database engine still uses IAM to retrieve data like in the case of a heap. One more reason to always use ORDER BY clause.</description><category>sql server</category></item><item><guid isPermaLink="true">http://scherbinin.blog.ru/7399123.html</guid><pubDate>Sun, 04 May 2008 04:14:30 GMT</pubDate><title>Bug in MS SQL 2k in the backup/restore subsystem</title><link>http://scherbinin.blog.ru/7399123.html</link><description>&lt;div class="post-body"&gt;&lt;p&gt;During testing of SP4 for MS SQL 2k I've found the bug in such critical place as backup/restore subsystem&amp;nbsp;&amp;mdash; if you put a database into readonly mode and then backup up the log, you'll be unable to restore this log at some point of time or savepoint&amp;nbsp;&amp;mdash; database will come into 'suspected' state. This bug also exists in the previous versions of MS SQL 2k. It is not fixed yet. Guys from MS let me to share this info.&lt;br&gt;&lt;br&gt;So, here is the repro (&lt;span style="color: #ff0000"&gt;don't run it if you already have a database named 'x'!!!&lt;/span&gt;):&lt;br&gt;set nocount on&lt;br&gt;go&lt;br&gt;drop database x&lt;br&gt;create database x&lt;br&gt;go&lt;br&gt;backup database x to disk='c:\x.bak' with format&lt;br&gt;use x&lt;br&gt;create table t1 (id int,c1 char(4100))&lt;br&gt;go&lt;br&gt;declare @id int&lt;br&gt;select @id = 1&lt;br&gt;while @id &lt;  = 100&lt;br&gt;begin&lt;br&gt;insert into t1 values (@id,'junk')&lt;br&gt;select @id = @id + 1&lt;br&gt;end&lt;br&gt;go&lt;br&gt;backup log x to disk='c:\x.log.bak' with format&lt;br&gt;go&lt;br&gt;declare @id int&lt;br&gt;select @id = 1&lt;br&gt;while @id &lt;  = 100&lt;br&gt;begin&lt;br&gt;insert into t1 values (@id,'junk')&lt;br&gt;select @id = @id + 1&lt;br&gt;end&lt;br&gt;go&lt;br&gt;begin tran deltran with mark&lt;br&gt;delete from t1&lt;br&gt;commit&lt;br&gt;go&lt;br&gt;alter database x set read_only&lt;br&gt;go&lt;br&gt;backup log x to disk='c:\x.log.bak' with no_truncate&lt;br&gt;go&lt;br&gt;use master&lt;br&gt;go&lt;br&gt;drop database x&lt;br&gt;go&lt;br&gt;restore database x from disk='c:\x.bak' with norecovery&lt;br&gt;restore log x from disk='c:\x.log.bak' with norecovery&lt;br&gt;go&lt;br&gt;restore log x from disk='c:\x.log.bak' with file=2,recovery,stopbeforemark='deltran'&lt;br&gt;go&lt;br&gt;dbcc checkdb ('x') with no_infomsgs&lt;br&gt;go&lt;br&gt;select count(*) from x..t1&lt;br&gt;go&lt;br&gt;select * from x..t1&lt;br&gt;go&lt;/p&gt;&lt;/div&gt;</description><category>sql server</category></item><item><guid isPermaLink="true">http://scherbinin.blog.ru/7398659.html</guid><pubDate>Sun, 04 May 2008 03:59:59 GMT</pubDate><title>TOP 10 Things I Hate About SQL Server</title><link>http://scherbinin.blog.ru/7398659.html</link><description>Перевод статьи: &lt;a href="http://weblogs.sqlteam.com/jeffs/archive/2005/05/24/5248.aspx"&gt;&lt;span style="color: #99bbdd"&gt;http://weblogs.sqlteam.com/jeffs/archive/2005/05/24/5248.aspx&lt;/span&gt;&lt;/a&gt;&lt;br&gt;Букам без чувства юмора не читать!&lt;br&gt;&lt;a name="22" title="22"&gt;&lt;/a&gt;&lt;br&gt;10 наиболее веских причин, почему я ненавижу SQL Server!&lt;br&gt;&lt;br&gt;1. SQL слишком сложный!&lt;br&gt;Если у меня есть множество значений в моих столбцах, например &amp;laquo;ЯНВАРЬ, ФЕВРАЛЬ, МАРТ&amp;raquo; или &amp;laquo;15,84,22&amp;raquo; , это не волнует SQL Server. Практически невозможно писать операторы SQL для таких таблиц! Если я захочу получить хотя бы какие-нибудь данные, придется написать оператор SELECT из 500 строк!! За каким? И к тому же понадобится божественное вмешательство, чтобы удалить какое-нибудь значение из этих списков. Зачем MS настолько все усложняет?&lt;br&gt;&lt;br&gt;2. Преобразования типов данных!&lt;br&gt;Что за фигня с преобразованием данных? Я просто использую VARCHAR для всего, так как это единственный способ избежать тупых сообщений об ошибках при добавлении данных в мои таблицы. Работает отлично, пока мне не требуется получить месяц из даты или сложить два числа&amp;nbsp;&amp;mdash; тупой SQL Server заставляет меня сначала использовать функцию convert() для преобразования значений. Что за тупизм? SQL не знает как сложить &amp;laquo;12&amp;raquo; и &amp;laquo;5&amp;raquo; - он считает, что получится &amp;laquo;125&amp;raquo; !!!! И чтобы все еще ухудшить, в половине случаев SQL Server выдает мне ошибки, которые говорят, что он НЕ МОЖЕТ ВЫПОЛНИТЬ ПРЕОБРАЗОВАНИЕ! Блин, если бы я был компьютером, я бы смог до этого допереть.&lt;br&gt;&lt;br&gt;3. Ёпрст, что с форматированием?&lt;br&gt;Все мы с этим сталкивались: хочу выровнять по правому краю столбец в своем SELECT'е&amp;nbsp;&amp;mdash; этого нельзя сделать, не вспотев! Ни говоря уже о том, чтобы отцентрировать, сделать отступы, вставить номера страниц, или что типа того. К тому же, сплошное мученье&amp;nbsp;&amp;mdash; отформатировать даты или округлить числа как я хочу. Я с трудом могу создать нормально выглядящий отчет в Query Analyzer, он выглядит как древние файлы MS-DOS! Может пора уже перейти в 21-й век, и включить какую-нибудь поддержку графики, цвета и шрифтов, эй вы, там, в Microsoft?&lt;br&gt;&lt;br&gt;4. А что с сортировкой?&lt;br&gt;В половине случаев мои записи возвращаются БЕСПОРЯДОЧНО! Да, да, они вообще не отсортированы! Это бред. SQL Server должен понимать, что все должно быть отсортировано по имени/фамилии или по дате, без всякого напоминания! Компьютеры вроде бы умные, так ведь? Мои пользователи ненавидят это, потому что им сложно ориентироваться в своих отчетах. Если они жалуются, я просто говорю им, &amp;laquo;Блин, если бы вы не были такими скупыми, и у нас был бы Oracle, нам не пришлось бы возиться с этой &amp;laquo;особенностью&amp;raquo; Microsoft!&amp;laquo;И чтобы все еще ухудшить, когда я пытаюсь отсортировать, SQL Server считает, что &amp;laquo;Декабрь&amp;raquo; идет перед &amp;laquo;Январем&amp;raquo;, или, что &amp;laquo;10&amp;raquo; меньше &amp;laquo;2&amp;raquo;! Блин, господин Гейтс, уже не удивляет, что вы никогда не выпускаете свои продукты в срок, так еще и ваши парни не в курсе, как работает календарь!&lt;br&gt;&lt;br&gt;5. Оператор IN() вообще никогда не работает!&lt;br&gt;Это меня бесит. Конструкция IN (@Var) никогда не работает правильно! Я никогда не получаю то, что я хочу, даже если @Var точно содержит нормальный список идентификаторов. И вы даже не получите сообщение об ошибке!&lt;br&gt;&lt;br&gt;6. Ограничения внешних ключей!&lt;br&gt;По каким-то причинам, в SQL вы можете обновлять или добавлять записи только в одну таблицу за раз! Я могу написать свои обычные FULL OUTER JOIN'ы и сдуреть от SELECT'а, который выполняется весь день, но что на счет того чтобы эта штука работала в UPDATE'ах и INSERT'ах!? Как по-другому сделать ссылочную целостность? Если запись в таблице A должна соответствовать записи в таблице B, то как, черт возьми, мне их запихнуть туда одновременно? По-моему это очень глупо.&lt;br&gt;&lt;br&gt;7. Первичные ключи не работают!&lt;br&gt;Я дурею от этого. У меня есть первичный ключ identity под названием &amp;laquo;ID&amp;raquo; у каждой таблицы, но я все равно получаю дублирующиеся данные! Я должен иметь 20 разных записей для Бобруйска в моей таблице &amp;laquo;tblStatesTable&amp;raquo;! Тогда в чем смысл первичных ключей? Я надеюсь в следующем сервис-паке это будет исправлено.&lt;br&gt;&lt;br&gt;8. S-Q-L&amp;nbsp;&amp;mdash; Т-О-Р-М-О-З!!!&lt;br&gt;Почему SQL такой медленный? Например, чтобы найти все данные в моей таблице для Января, я использую&lt;br&gt;WHERE LTRIM(tblTable.tblTable_colMonthList) LIKE '%Янв%'&lt;br&gt;Довольно стандартная конструкция. Но она выполняется ВЕЧНО! А столбец индексирован!! Эй, вы, там, в Micro-тормозе, вообще-то индексы нужны для ускорения!&lt;br&gt;&lt;br&gt;9. Загадочные сообщения об ошибках!&lt;br&gt;Значит, я пытаюсь добавить данные в таблицу, и вот что получаю:&lt;br&gt;INSERT statement conflicted with COLUMN FOREIGN KEY constraint 'FK_Order_Details_Orders'. The conflict occurred in database 'Northwind', table 'Orders', column 'OrderID'. The statement has been terminated.&lt;br&gt;Или я пытаюсь написать простой GROUP BY, и получаю вот что:&lt;br&gt;Column 'orders.OrderID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.&lt;br&gt;Или иногда я делаю обалденные динамические запросы, но они, похоже, не работают, и я получаю:&lt;br&gt;You are not allowed to truncate the system table 'master..sysobjects'.&lt;br&gt;Ээээй? Может расскажете, что не так, вместо того, чтобы писать длинные непонятные сообщения на языке мумбо-юмбо. Господин, Билл Гейтс, может, стоит потратить немного баксов на то, чтобы в SQL Server не было багов, вместо того, чтобы писать все эти дурацкие сообщения об ошибках! У кого есть время на то, чтобы вникать в эту чушь?&lt;br&gt;&lt;br&gt;10. Ссылки на таблицы и столбцы!&lt;br&gt;Это вообще бред. Значит, у нас есть умные компьютеры, так? И у нас есть что-то под названием &amp;laquo;переменные&amp;raquo;, так? В этих переменных мы можем хранить все что угодно, даже названия столбцов и таблиц. Но вот это вообще не работает:&lt;br&gt;Select @TableName.@ColumnName from @TableName&lt;br&gt;И мне понятно, и вам понятно, я не пойму, почему это не понятно SQL Server'у! Как получить данные из таблицы 'tblCustomerNumber0121' вместо таблицы 'tblCustomerNumber0122', или получить данные из столбца 'Янв2005', если я не могу использовать переменные в такой конструкции!? Это надо делать хард-кодом!? Как, черт возьми, я должен писать отчеты с пользовательскими параметрами, если я ограничен заранее определенными названиями таблиц и столбцов!? Ну же, Micro-тупость, что на счет ДЕЙСТВИТЕЛЬНО НУЖНЫХ вещей для программирования в T-SQL, например ПОЛНОЙ поддержки переменных! К тому же на, самом деле, очень тяжело добавлять новые данные в таблицы. INSERT? Он никогда не работал! INSERT не может даже добавить новый столбец в таблицу! Как предполагается добавлять данные для нового месяца, если у меня вообще еще нет этого столбца? Может это, наконец, сделают в SQL Server 2005.</description><category>sql server</category><category>юмор</category></item></channel></rss>

