<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dotnet.lv/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Ivara blogs : SQL</title><link>http://dotnet.lv/blogs/ia/archive/tags/SQL/default.aspx</link><description>Tagi: SQL</description><dc:language /><generator>CommunityServer 2008 SP1 (Build: 30619.63)</generator><item><title>Kā sajūgt Excel 2007 ar SQL serveri</title><link>http://dotnet.lv/blogs/ia/archive/2009/03/27/k-saj-gt-excel-2007-ar-sql-serveri.aspx</link><pubDate>Fri, 27 Mar 2009 09:35:40 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:2870</guid><dc:creator>ivars.arins</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/ia/rsscomments.aspx?PostID=2870</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/ia/commentapi.aspx?PostID=2870</wfw:comment><comments>http://dotnet.lv/blogs/ia/archive/2009/03/27/k-saj-gt-excel-2007-ar-sql-serveri.aspx#comments</comments><description>&lt;p&gt;Nezinu, kā jums, bet man reizēm gadās, kad dati no Excel tabulām ir jāiedabū SQL datubāzē. Reizēm vienkārši jāievieto, reizēm nākas izveikt arī dažādas transformācijas. Bieži šiem mērķiem izmantoju Excel funkciju CONCATENATE, ar kuras palīdzību saģenerēju INSERTus, kurus pēc tam izpildu SQL Server Management Studio. &lt;/p&gt;  &lt;p&gt;Nesen radās vajadzība izmantot datus no tabulas ar apmēram 30 stabiņiem, no kuriem daudzi bija jāpielāgo atbilstoši vērtībām kādās datubāzes tabulās. Šajā gadījumā rakstīt milzīgo INSERTu, kuri ievietos datus pagaidu tabulā,&amp;#160; konkatenāciju likās neprātīgi, tāpēc nolēmu izmēģināt alternatīvu – piesaistīt Excel failu kā saistīto serveri (&lt;a href="http://msdn.microsoft.com/en-us/library/ms188279.aspx"&gt;linked server&lt;/a&gt;) SQL serverim un izmantot SQL teikumus, lai darbotos ar šīs tabulas datiem.&lt;/p&gt;  &lt;p&gt;Lai varētu SQL serverim piesaistīt Excel 2007 failu kā saistīto serveri, uz datora, kur darbojas SQLs, nepieciešams uzstādīt &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&amp;amp;displaylang=en"&gt;Office 2007 Data Connectivity Components&lt;/a&gt; un izveidot savienojumu. Savienojumu var izveidot izmantojot grafiskos rīkus, bet es dodu priekšroku skriptam, kas izsauc sistēmas procedūru, jo šādu skriptu ir iespējams saglabāt un izmantot atkārtoti.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;EXEC &lt;/span&gt;&lt;span style="background:#10100d;color:#009b00;"&gt;sp_addLinkedServer
    &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;@server&lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;= &lt;/span&gt;&lt;span style="background:#10100d;color:#44b1e3;"&gt;&amp;#39;services&amp;#39;&lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;,
    &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;@srvproduct &lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;= &lt;/span&gt;&lt;span style="background:#10100d;color:#44b1e3;"&gt;&amp;#39;ACE 12.0&amp;#39;&lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;,
    &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;@provider &lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;= &lt;/span&gt;&lt;span style="background:#10100d;color:#44b1e3;"&gt;&amp;#39;Microsoft.ACE.OLEDB.12.0&amp;#39;&lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;,
    &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;@datasrc &lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;= &lt;/span&gt;&lt;span style="background:#10100d;color:#44b1e3;"&gt;&amp;#39;C:\temp\services.xlsx&amp;#39;&lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;,
    &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;@provstr &lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;= &lt;/span&gt;&lt;span style="background:#10100d;color:#44b1e3;"&gt;&amp;#39;Excel 12.0; HDR=No&amp;#39;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Tālāk jau var vienkārši izpildīt parastus SQL vaicājumus, kā piemēram:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;SELECT &lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;* &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;FROM &lt;/span&gt;&lt;span style="background:#10100d;color:green;"&gt;services&lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;...&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;sheet1$&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;vai&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;SELECT &lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;* &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;FROM &lt;/span&gt;&lt;span style="background:#10100d;color:green;"&gt;services&lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;...&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;sheet1$ &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;WHERE &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;F2 &lt;/span&gt;&lt;span style="background:#10100d;color:#80ff00;"&gt;= &lt;/span&gt;&lt;span style="background:#10100d;color:#44b1e3;"&gt;&amp;#39;ddd&amp;#39;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Ja apskatam pievienošanas procedūras parametrus, tad tie īpašus komentārus neprasa. Vienīgais, kas varētu interesēt ir &lt;code&gt;@provstr&lt;/code&gt; parametrs, kurā ir iespējams norādīt vai tabula satur stabiņu nosaukumus (&lt;code&gt;HDR=Yes&lt;/code&gt;), vai arī tie nav norādīti (&lt;code&gt;HDR=No&lt;/code&gt;). Otrajā gadījumā stabiņi būs numurēti, t.i. nosaukti nosaukumos F1, F2, u.t.t.&lt;/p&gt;

&lt;p&gt;Ceru, ka kādam noderēs!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=2870" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/ia/archive/tags/SQL/default.aspx">SQL</category><category domain="http://dotnet.lv/blogs/ia/archive/tags/Excel/default.aspx">Excel</category></item><item><title>T-SQL špikeris</title><link>http://dotnet.lv/blogs/ia/archive/2008/04/16/t-sql-pikeris.aspx</link><pubDate>Wed, 16 Apr 2008 11:08:17 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:683</guid><dc:creator>ivars.arins</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/ia/rsscomments.aspx?PostID=683</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/ia/commentapi.aspx?PostID=683</wfw:comment><comments>http://dotnet.lv/blogs/ia/archive/2008/04/16/t-sql-pikeris.aspx#comments</comments><description>&lt;p&gt;Kā visi zinām, ir jautājumi, kuri tiek uzdoti atkal un atkal. Tā kā &lt;a title="MSDN forums  SQL server" href="http://forums.microsoft.com/Forums/default.aspx?ForumGroupID=19&amp;amp;SiteID=1"&gt;MSDN SQL servera foruma&lt;/a&gt; dalībniekiem ir apnicis atbildēt uz mūz&amp;#353;eniem jautājumiem, tad viņi ir sagatavoju&amp;#353;i &amp;#353;pikeri priek&amp;#353; tiem, kam slinkums meklēt. &lt;/p&gt;  &lt;p&gt;Nāko&amp;#353;reiz, pirms jautāt, kā izdzēst dublējo&amp;#353;ās rindas, ieskaties &lt;a title="Solutions for Common T-SQL Problems" href="http://code.msdn.microsoft.com/SQLExamples"&gt;Solutions for Common T-SQL Problems&lt;/a&gt;, vai tur jau nav atbilde uz Tavu jautājumu.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=683" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/ia/archive/tags/SQL/default.aspx">SQL</category><category domain="http://dotnet.lv/blogs/ia/archive/tags/Gr_0101_matz_2B01_mes/default.aspx">Grāmatzīmes</category></item><item><title>Kuros stabiņos ir atļautas NULL vērtības?</title><link>http://dotnet.lv/blogs/ia/archive/2008/01/08/kuros-stabi-os-ir-at-autas-null-v-rt-bas.aspx</link><pubDate>Tue, 08 Jan 2008 14:21:15 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:273</guid><dc:creator>ivars.arins</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/ia/rsscomments.aspx?PostID=273</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/ia/commentapi.aspx?PostID=273</wfw:comment><comments>http://dotnet.lv/blogs/ia/archive/2008/01/08/kuros-stabi-os-ir-at-autas-null-v-rt-bas.aspx#comments</comments><description>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Pēdējā laikā sanāk padarboties ar dažādām DB lietām, kas ļauj izpausties biju&amp;#353;ā pielietojuma administratora garam un rakstīt dažādus SQL skriptus.&lt;/p&gt;  &lt;p&gt;Ja kādam ievajagās atrast kuros datubāzes tabulu stabiņos ir atļautas NULL vērtības, var noderēt &amp;#353;āds skripts:&lt;/p&gt;  &lt;pre class="code" style="background:#10100d;"&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;SELECT 
    &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;s&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;name &lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;+ &lt;/span&gt;&lt;span style="background:#10100d;color:#44b1e3;"&gt;&amp;#39;.&amp;#39; &lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;+ &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;t&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;name &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;AS &lt;/span&gt;&lt;span style="background:#10100d;color:#44b1e3;"&gt;&amp;#39;Table&amp;#39;&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;, 
    &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;c&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;name &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;AS &lt;/span&gt;&lt;span style="background:#10100d;color:#44b1e3;"&gt;&amp;#39;Column&amp;#39;&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;, 
    &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;types&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;name &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;AS &lt;/span&gt;&lt;span style="background:#10100d;color:#44b1e3;"&gt;&amp;#39;Type&amp;#39;
&lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;FROM 
    &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;sys&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;schemas s 
&lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;INNER JOIN &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;sys&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;tables t 
    &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;ON &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;s&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;schema_id &lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;= &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;t&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;schema_id
&lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;INNER JOIN &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;sys&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;columns c 
    &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;ON &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;t&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;object_id &lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;= &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;c&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;object_id
&lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;INNER JOIN &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;sys&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;types &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;types 
    ON &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;c&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;system_type_id &lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;= &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;types&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;system_type_id 
    &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;AND &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;c&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;user_type_id &lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;= &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;types&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;user_type_id
&lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;WHERE
    &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;c&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;is_nullable &lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;= &lt;/span&gt;&lt;span style="background:#10100d;color:cyan;"&gt;1
    &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;AND &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;s&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;name &lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;+ &lt;/span&gt;&lt;span style="background:#10100d;color:#44b1e3;"&gt;&amp;#39;.&amp;#39; &lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;+ &lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;t&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;.&lt;/span&gt;&lt;span style="background:#10100d;color:#e8e8e8;"&gt;name &lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;IN &lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;(&lt;/span&gt;&lt;span style="background:#10100d;color:#44b1e3;"&gt;&amp;#39;MySchema.MyTable&amp;#39;&lt;/span&gt;&lt;span style="background:#10100d;color:#a79a86;"&gt;)
&lt;/span&gt;&lt;span style="background:#10100d;color:#d6d694;"&gt;ORDER BY &lt;/span&gt;&lt;span style="background:#10100d;color:cyan;"&gt;1&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;hr /&gt;

&lt;p&gt;Tā kā man &amp;#353;obrīd rit maģistrantūras sesija, kuru cen&amp;#353;os savienot ar darbu, tad rakstī&amp;#353;anai neiznāk veltīt tik daudz laika cik gribētos. Bet nesatraucieties, nekur neesmu pazudis un netaisos pazust. Pacietību un gan jau drīzumā atkal dalī&amp;#353;os ar Jums savā pieredzē. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=273" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/ia/archive/tags/SQL/default.aspx">SQL</category><category domain="http://dotnet.lv/blogs/ia/archive/tags/code/default.aspx">code</category></item><item><title>SQL lietotāju masveida dzēšana</title><link>http://dotnet.lv/blogs/ia/archive/2007/12/21/masveida-sql-lietot-ju-dz-ana.aspx</link><pubDate>Fri, 21 Dec 2007 10:02:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:248</guid><dc:creator>ivars.arins</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/ia/rsscomments.aspx?PostID=248</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/ia/commentapi.aspx?PostID=248</wfw:comment><comments>http://dotnet.lv/blogs/ia/archive/2007/12/21/masveida-sql-lietot-ju-dz-ana.aspx#comments</comments><description>&lt;p&gt;Nezinu, cik bieži (vai reti) gadās sastapt nepieciešamību izdzēst vairākus datubāzes lietotājus. Tā kā man šorīt darbā šāda vajadzība radās un ātrumā nevarēju iedomāties pareizos atslēgas vārdus, lai atrastu skriptu, kas veic šo darbību, tad nācās patērēt nedaudz laika, lai tādu uzrakstītu.&lt;/p&gt;  &lt;p&gt;Tātad, ideja ir vienkārša. Ņemam lietotājus no sistēmas skata &lt;span style="color:green;"&gt;sys.sysusers&lt;/span&gt;, atfiltrējam pēc kādiem kritērijiem dzēsīsim. Sasaistam rezultātu ar &lt;span style="color:green;"&gt;sys.schemas&lt;/span&gt; skatu, lai pārbaudītu, vai lietotājs nav saimnieks kādai shēmai. Šāda pārbaude ir nepieciešama tādēļ, ka MS SQL serveris neļauj dzēst lietotājus, kuriem ir kādas shēmas saimnieki. Tālāk jau paliek &amp;quot;&lt;i&gt;ģelo tehņiki&lt;/i&gt;&amp;quot;.&lt;/p&gt;  &lt;p&gt;Rezultāta skripts: &lt;/p&gt;  &lt;pre class="code" style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&lt;span&gt;/********************************************************************&lt;br /&gt; * SP for droping users from database                               *&lt;br /&gt; * (c) 2008 Ivars &amp;quot;PiRX&amp;quot; Āriņš                                      *&lt;br /&gt; * e-mail: ivars_a@inbox.lv                                         *&lt;br /&gt; * !!!NB:Use it on your own risk!!!                                 *&lt;br /&gt; *==================================================================*&lt;br /&gt; * Usage:                                                           *&lt;br /&gt; *    EXEC dbo.CleanUsers                                           *&lt;br /&gt; *        @WhereClause = &amp;#39;&amp;#39;                                         *&lt;br /&gt; *        @ExecDrop = &amp;#39;&amp;#39; ;                                          *&lt;br /&gt; * Prameters:                                                       *&lt;br /&gt; * @WhereClause - WHERE clause for user filtering from sys.sysusers *&lt;br /&gt; * @ExecDrop - Indicates whether DROP actualy must be executed      *&lt;br /&gt; *             (Y - exec DROP, any other value - just simulate)     *&lt;br /&gt; ********************************************************************/&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;CREATE PROCEDURE &lt;/span&gt;&lt;span&gt;dbo&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CleanUsers&lt;br /&gt;    WhereClause &lt;/span&gt;&lt;span&gt;nvarchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;300&lt;/span&gt;&lt;span&gt;),&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;@ExecDrop &lt;/span&gt;&lt;span&gt;nchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;    SET NOCOUNT ON&lt;br /&gt;&lt;br /&gt;    IF NOT &lt;/span&gt;&lt;span&gt;@ExecDrop &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;&amp;#39;Y&amp;#39;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;PRINT &lt;/span&gt;&lt;span&gt;&amp;#39;Running in simulation mode&amp;#39;&lt;/span&gt;&lt;span&gt;; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;CREATE TABLE &lt;/span&gt;&lt;span&gt;#FilteredUsers (&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;DECLARE &lt;/span&gt;&lt;span&gt;@UsersSql &lt;/span&gt;&lt;span&gt;nvarchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;400&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;SET &lt;/span&gt;&lt;span&gt;@UsersSql &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;&amp;#39;INSERT INTO #FilteredUsers SELECT uid FROM sys.sysusers &amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;IF LEN&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;@WhereClause&lt;/span&gt;&lt;span&gt;) &amp;gt; &lt;/span&gt;&lt;span&gt;0&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;SET &lt;/span&gt;&lt;span&gt;@WhereClause &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;&amp;#39;WHERE &amp;#39; &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;@WhereClause &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;&amp;#39;;&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;    &lt;br /&gt;    &lt;/span&gt;&lt;span&gt;SET &lt;/span&gt;&lt;span&gt;@UsersSql &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;@UsersSql &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;@WhereClause&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;PRINT &lt;/span&gt;&lt;span&gt;&amp;#39;Filtering users using query:&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;PRINT &lt;/span&gt;&lt;span&gt;&amp;#39;    SELECT uid FROM sys.sysusers &amp;#39; &lt;/span&gt;&lt;span&gt;+  &lt;/span&gt;&lt;span&gt;@WhereClause&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;EXEC&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;@UsersSql&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;DECLARE &lt;/span&gt;&lt;span&gt;curs_users &lt;/span&gt;&lt;span&gt;CURSOR LOCAL &lt;/span&gt;&lt;span&gt;FORWARD_ONLY&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;FOR SELECT DISTINCT&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;u_id &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;uid&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;--id&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;u_name &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;s_id &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;schema_id&lt;/span&gt;&lt;span&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;s_name &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;s_objects &lt;/span&gt;&lt;span&gt;= (&lt;/span&gt;&lt;span&gt;SELECT COUNT&lt;/span&gt;&lt;span&gt;(*) &lt;/span&gt;&lt;span&gt;FROM &lt;/span&gt;&lt;span&gt;sys&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;all_objects o &lt;/span&gt;&lt;span&gt;WHERE &lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;schema_id &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;schema_id&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;FROM &lt;/span&gt;&lt;span&gt;#FilteredUsers &lt;/span&gt;&lt;span&gt;f&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;INNER JOIN &lt;/span&gt;&lt;span&gt;sys&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sysusers u &lt;/span&gt;&lt;span&gt;ON &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;uid&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;LEFT JOIN &lt;/span&gt;&lt;span&gt;sys&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;schemas s &lt;/span&gt;&lt;span&gt;ON &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;principal_id &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;uid&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;OPEN &lt;/span&gt;&lt;span&gt;curs_users&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;DECLARE &lt;/span&gt;&lt;span&gt;@u_id &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;@u_name &lt;/span&gt;&lt;span&gt;nvarchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&lt;/span&gt;&lt;span&gt;),&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;@s_id &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;@s_name &lt;/span&gt;&lt;span&gt;nvarchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;255&lt;/span&gt;&lt;span&gt;),&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;@s_objects &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;FETCH NEXT FROM &lt;/span&gt;&lt;span&gt;curs_users &lt;/span&gt;&lt;span&gt;INTO &lt;/span&gt;&lt;span&gt;@u_id&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;@u_name&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;@s_id&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;@s_name&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;@s_objects&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;WHILE &lt;/span&gt;&lt;span&gt;@@FETCH_STATUS &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;0&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;BEGIN&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;--DROP schema if exists and containts no objects&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;IF &lt;/span&gt;&lt;span&gt;@s_name &lt;/span&gt;&lt;span&gt;IS NOT NULL&lt;br /&gt;            IF &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;@s_objects &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;BEGIN&lt;br /&gt;                PRINT &lt;/span&gt;&lt;span&gt;&amp;#39;Droping schema &amp;#39; &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;@s_name&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;                &lt;/span&gt;&lt;span&gt;IF &lt;/span&gt;&lt;span&gt;@ExecDrop &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;&amp;#39;Y&amp;#39; &lt;br /&gt;                    &lt;/span&gt;&lt;span&gt;EXEC &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;#39;DROP SCHEMA [&amp;#39; &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;@s_name &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;&amp;#39;];&amp;#39;&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;                &lt;/span&gt;&lt;span&gt;SET &lt;/span&gt;&lt;span&gt;@s_objects &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;END&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;--DROP user if doesn&amp;#39;t own any objects&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;IF &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;@s_objects &lt;/span&gt;&lt;span&gt;&amp;gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;PRINT &lt;/span&gt;&lt;span&gt;&amp;#39;Not droping user &amp;#39; &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;@u_name &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;&amp;#39; because owned schema &amp;#39; &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;@s_name &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;&amp;#39; contains &amp;#39; &lt;/span&gt;&lt;span&gt;&lt;br /&gt;                  + &lt;/span&gt;&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;@s_objects &lt;/span&gt;&lt;span&gt;AS nvarchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;)) + &lt;/span&gt;&lt;span&gt;&amp;#39; object(s)&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;ELSE&lt;br /&gt;        BEGIN&lt;br /&gt;            PRINT &lt;/span&gt;&lt;span&gt;&amp;#39;Droping user &amp;#39; &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;@u_name&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;IF &lt;/span&gt;&lt;span&gt;@ExecDrop &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;&amp;#39;Y&amp;#39; &lt;br /&gt;                &lt;/span&gt;&lt;span&gt;EXEC &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;#39;DROP USER [&amp;#39; &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;@u_name &lt;/span&gt;&lt;span&gt;+ &lt;/span&gt;&lt;span&gt;&amp;#39;];&amp;#39;&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;END&lt;br /&gt;&lt;br /&gt;        FETCH NEXT FROM &lt;/span&gt;&lt;span&gt;curs_users &lt;/span&gt;&lt;span&gt;INTO &lt;/span&gt;&lt;span&gt;@u_id&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;@u_name&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;@s_id&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;@s_name&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;@s_objects&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;END&lt;br /&gt;&lt;br /&gt;    CLOSE &lt;/span&gt;&lt;span&gt;curs_users&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;DEALLOCATE &lt;/span&gt;&lt;span&gt;curs_users&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;DROP TABLE &lt;/span&gt;&lt;span&gt;#FilteredUsers&lt;br /&gt;&lt;/span&gt;&lt;span&gt;END&lt;br /&gt;&lt;/span&gt;&lt;span&gt;GO&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Procedūru izsaucot, tai nodod divus parametrus, &lt;i&gt;@WhereClause&lt;/i&gt;, kurā norāda derīgu SQL WHERE nosacījumu (bez atslēgvārda WHERE) un &lt;i&gt;@ExecDrop&lt;/i&gt;, ar kuru norāda, vai tiešām izpildīt lietotāju un shēmu dzēšanu, vai tika simulēt skripta darbību, neizpildot DROP operāciju.&lt;/p&gt;

&lt;p&gt;Piemēram, lai izdzēstu visus lietotājus ar Windows autentifikāciju, kuru lietotājvārdi nestaur Ivars, skripts ir jāpalaiž šādi:&lt;/p&gt;

&lt;pre class="code" style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&lt;span&gt;--Simulācija&lt;br /&gt;&lt;/span&gt;&lt;span&gt;EXEC &lt;/span&gt;&lt;span&gt;dbo&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CleanUsers &lt;br /&gt;     @WhereClause &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;span&gt;&amp;#39;isntuser = 1 AND name NOT LIKE &amp;#39;&amp;#39;%Ivars%&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span&gt;, &lt;br /&gt;     &lt;/span&gt;&lt;span&gt;@ExecDrop &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;&amp;#39;N&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;GO&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;--Izpilde&lt;br /&gt;&lt;/span&gt;&lt;span&gt;EXEC &lt;/span&gt;&lt;span&gt;dbo&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CleanUsers &lt;br /&gt;     @WhereClause &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;span&gt;&amp;#39;isntuser = 1 AND name NOT LIKE &amp;#39;&amp;#39;%Ivars%&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span&gt;, &lt;br /&gt;     &lt;/span&gt;&lt;span&gt;@ExecDrop &lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;&amp;#39;Y&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;P.S. Nepretendēju uz T-SQL guru statusu, tāpēc pieļauju, ka šo visu varētu uzrakstīt labāk. Manām vajadzībām derēja arī šādi. &lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Laikam jau zemrindas piezīmes man sāk kļūt par ieradumu. Nekas, būs konsistents veids, kā informēt par dažādām bloga saimnieciskajām lietām. Joprojām gaidu jebkādus komentārus un atsauksmes par rakstīto.&lt;/p&gt;

&lt;p&gt;Šodienas ziņa ir tāda, ka esmu pieslēdzis &lt;a href="http://feedburner.com" title="FeedBurner"&gt;FeedBurner&lt;/a&gt; statistiku un tāpēc ar pirmdienu atslēgšu tiešo RSS plūsmu. Tāpēc, lūdzu, pārslēdziet savus lasītājus uz &lt;a href="http://feeds.feedburner.com/IvaraBlogs" title="http://feeds.feedburner.com/IvaraBlogs"&gt;http://feeds.feedburner.com/IvaraBlogs&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=248" width="1" height="1"&gt;</description><enclosure url="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.02.48/user_5F00_cleanup.sql.txt" length="3385" type="text/plain" /><category domain="http://dotnet.lv/blogs/ia/archive/tags/SQL/default.aspx">SQL</category><category domain="http://dotnet.lv/blogs/ia/archive/tags/code/default.aspx">code</category></item><item><title>How to shoot yourself in the foot with nullable types and SQL types *</title><link>http://dotnet.lv/blogs/ia/archive/2007/12/13/how-to-shoot-yourself-in-the-foot-with-nullable-types-and-sql-types.aspx</link><pubDate>Thu, 13 Dec 2007 20:03:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:231</guid><dc:creator>ivars.arins</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/ia/rsscomments.aspx?PostID=231</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/ia/commentapi.aspx?PostID=231</wfw:comment><comments>http://dotnet.lv/blogs/ia/archive/2007/12/13/how-to-shoot-yourself-in-the-foot-with-nullable-types-and-sql-types.aspx#comments</comments><description>&lt;p&gt;Labvakar!&lt;/p&gt;
  
&lt;p&gt;Šovakar vēlos jums pastāstīt par kādu lietu, kuru, iespējams, daži jau uzskata par novecojušu. Tomēr ne visi jau ir pārgājuši uz .NET platformas jaunākajām versijām, kā arī jebkurā laikā katram no mums var sanākt uzturēt &lt;i&gt;legacy&lt;/i&gt; kodu. Tāpēc pastāstīšu par kādu &lt;a href="http://msdn2.microsoft.com/en-us/library/ms131092.aspx" title="SQL Server Data Types and Their .NET Framework Equivalents" target="_blank"&gt;.NET SQL datu tipu&lt;/a&gt; īpatnību, ar kuru ne pārāk sen saskāros. &lt;/p&gt;
  
&lt;p&gt;Lai iepazīstinātu ar problēmu, varētu sarīkot nelielu konkursu, pajautājot, kāds rezultāts būs šādam kodam, gadījumā, ja no datubāzes atgriezīs NULL vērtību (atbilde jāsniedz, nepārbaudot ar programmu):&lt;/p&gt;
 &lt;code&gt;   &lt;/code&gt;
&lt;p&gt;String output = SomeMethodThatReturnsDbResultWhichIsNull() ?? &amp;quot;Datubāzē nav datu&amp;quot;;      &lt;br /&gt;Console.WriteLine(output);&lt;/p&gt;
   
&lt;p&gt;Pirmajā brīdī liekas, ka ar kodu viss ir kārtībā, atgrieztais rezultāts tiek pārbaudīts un rezultāts būs &amp;quot;Datubāzē nav ieraksta&amp;quot;, tomēr praksē izrādās savādāk un izpildot šādu kodu iegūst &lt;i&gt;SqlNullValueException&lt;/i&gt;. Izrādās, ka gadījumos, kad no datubāzes var tikt atgriezta NULL vērtība, ir jāpārbauda īpašība &lt;i&gt;IsNull&lt;/i&gt;, kura tad arī norāda, vai mainīgais satur kādu vērtību. No vienas puses vienkārši, no otras - ir redzēti gadījumi, kad izstrādātāji uz šo ir &amp;quot;iekrituši&amp;quot;.&lt;/p&gt;
  
&lt;p&gt;Tiem, kam mans apraksts liekas nesaprotams - lai runā kods:&lt;/p&gt;
 &lt;code&gt;   &lt;/code&gt;
&lt;p&gt;using System;      &lt;br /&gt;using System.Data.SqlTypes; &lt;/p&gt;
    
&lt;p&gt;namespace NullableDemo      &lt;br /&gt;{       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Example       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private SqlGuid _guid = new SqlGuid(); &lt;/p&gt;
    
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Gets the property wrong.       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;value&amp;gt;Exception :)&amp;lt;/value&amp;gt;       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Guid? PropertyWrong       &lt;br /&gt;&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; get { return _guid.Value; }       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
    
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Gets the property right.       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;value&amp;gt;null&amp;lt;/value&amp;gt;       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Guid? PropertyRight       &lt;br /&gt;&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; get       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {       &lt;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; if (_guid.IsNull)       &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; return null; &lt;/p&gt;
    
&lt;p&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; return _guid.Value;      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
    
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Program      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main(string[] args)       &lt;br /&gt;&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; Example example = new Example();       &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; try       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {       &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; Console.WriteLine(&amp;quot;Right way:&amp;quot;);       &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; Guid guid = example.PropertyRight ?? Guid.Empty;       &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; Console.WriteLine(guid); &lt;/p&gt;
    
&lt;p&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; Console.WriteLine(&amp;quot;Wrong way:&amp;quot;);      &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; guid = example.PropertyWrong ?? Guid.Empty;       &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; Console.WriteLine(guid);       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (SqlNullValueException e)       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {       &lt;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; Console.WriteLine(&amp;quot;Exception:&amp;quot;);       &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; Console.WriteLine(e.Message);       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }       &lt;br /&gt;}&lt;/p&gt;
   
&lt;p&gt;Un ekrānšāviņš:&lt;/p&gt;
  
&lt;p&gt;&lt;a href="http://dotnet.lv/blogs/ia/WindowsLiveWriter/Howtoshootyourselfinthefootwithnullablet_13001/Nullable_demo_output_2.png"&gt;&lt;img src="http://dotnet.lv/blogs/ia/WindowsLiveWriter/Howtoshootyourselfinthefootwithnullablet_13001/Nullable_demo_output_thumb.png" style="border-width:0px;" alt="Nullable_demo_output" border="0" height="165" width="324" /&gt;&lt;/a&gt; &lt;/p&gt;
  
&lt;hr /&gt;  
&lt;p&gt;&lt;sup&gt;*&lt;/sup&gt;How to shoot yourself in the foot links: &lt;/p&gt;
  
&lt;ul&gt;   
&lt;li&gt;&lt;a href="http://www-users.cs.york.ac.uk/%7Esusan/joke/foot.htm" target="_blank"&gt;http://www-users.cs.york.ac.uk/~susan/joke/foot.htm&lt;/a&gt; &lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://homepages.nyu.edu/%7Eohg200/jokes/shoot_prog.txt" target="_blank"&gt;http://homepages.nyu.edu/~ohg200/jokes/shoot_prog.txt&lt;/a&gt; &lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://www.blogcastrepository.com/blogs/hamzakhalid/archive/2006/11/20/2656.aspx" title="http://www.blogcastrepository.com/blogs/hamzakhalid/archive/2006/11/20/2656.aspx"&gt;http://www.blogcastrepository.com/blogs/hamzakhalid/archive/2006/11/20/2656.aspx&lt;/a&gt; &lt;/li&gt;
 &lt;/ul&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=231" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/ia/archive/tags/.NET/default.aspx">.NET</category><category domain="http://dotnet.lv/blogs/ia/archive/tags/SQL/default.aspx">SQL</category><category domain="http://dotnet.lv/blogs/ia/archive/tags/code/default.aspx">code</category></item></channel></rss>