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

<channel>
	<title>Ma journée :</title>
	<atom:link href="http://blog.bolivier.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.bolivier.com</link>
	<description>Dynamics GP, SQL... et un peu d'inconnu!</description>
	<pubDate>Wed, 17 Sep 2008 23:59:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Bonnes pratiques SQL</title>
		<link>http://blog.bolivier.com/2008/09/16/bonnes-pratiques-sql/</link>
		<comments>http://blog.bolivier.com/2008/09/16/bonnes-pratiques-sql/#comments</comments>
		<pubDate>Wed, 17 Sep 2008 02:13:55 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
		
		<category><![CDATA[SQL Server]]></category>

		<category><![CDATA[tsql]]></category>

		<category><![CDATA[Best practices]]></category>

		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://blog.bolivier.com/?p=68</guid>
		<description><![CDATA[Voici une liste de quelques best practices pour la création de tables, d&#8217;instructions et de procédures stockées rédigée à partir de quelques articles glanés au fil du temps.  Il s&#8217;agit davantage d&#8217;un aide mémoire que d&#8217;une liste d&#8217;éléments rigides à respecter ; il faut mettre en perspective plusieurs facteurs (fréquence d&#8217;utilisation de la requête, [...]]]></description>
			<content:encoded><![CDATA[<p>Voici une liste de quelques <em>best practices</em> pour la création de tables, d&#8217;instructions et de procédures stockées rédigée à partir de quelques articles glanés au fil du temps.  Il s&#8217;agit davantage d&#8217;un aide mémoire que d&#8217;une liste d&#8217;éléments rigides à respecter ; il faut mettre en perspective plusieurs facteurs (fréquence d&#8217;utilisation de la requête, quantité de lignes de données à la source, jeu d&#8217;enregistrement retourné) lorsque l&#8217;on rédige des instructions SQL afin d&#8217;évaluer l&#8217;importance de respecter ces pratiques.<span id="more-68"></span></p>
<p>Conception de tables / tables temporaires :</p>
<ol>
<li><strong>Utiliser le plus petit type de données possible.</strong><br />
Si possible, préférer un type <em>tinyint</em> à un <em>int</em> et ainsi, préférer un <em>int</em> à un <em>bigint</em>. Il en va de même pour les colonnes de type texte, il est plus efficace de définir la longueur d’un champ <em>char</em> ou <em>varchar</em> selon le nombre de caractères du terme le plus long qu’elle contiendra.</li>
<li><strong>Utiliser des clés primaires de type entier (int) ou de peu de caractères (ex. char(3)).</strong><br />
<strong></strong>Éviter les types « float », « real » et « datetime » pour vos clés primaires.</li>
<li><strong>Éviter le type « TEXT ».<br />
</strong>Par souci de performance, si le champ doit contenir moins de 8000 caractères, utiliser le type VARCHAR.</li>
<li><strong>Éviter les types « NCHAR » et « NVARCHAR » si non requis.<br />
</strong>Ces types sont les équivalents Unicode des types CHAR et VARCHAR mais utilisent le double de l’espace utilisé par ces derniers (CHAR(1) = 1 byte ; NCHAR(1) = 2 bytes).</li>
<li><strong>Choisir entre « CHAR » et « VARCHAR ».<br />
</strong>Si la longueur des valeurs contenues dans le champ est assez constante, choisir le type CHAR ; si la longueur des valeurs varie beaucoup, choisir le type VARCHAR.  L’espace utilisé par les valeurs contenues dans une colonne CHAR est constant et est le maximum autorisé par la colonne. Comme le type CHAR est de longueur fixe, le traitement de ce type de champ est plus rapide que les colonnes de type VARCHAR.</li>
<li><strong>Définir un « CLUSTERED INDEX » sur chaque table.</strong></li>
<li><strong>Éviter l’utilisation de tables temporaires.<br />
</strong>Il est préférable d’utiliser une variable de type table (stockée en mémoire) plutôt qu’une table temporaire (stockée dans la base de données temp sur le disque) lorsque le jeu d’enregistrement n’est pas trop gros.<strong></strong></li>
<li><strong>Ne pas utiliser « SELECT INTO » pour créer une table temporaire.<br />
</strong>Créez manuellement la table avec l’instruction CREATE TABLE.  Le SELECT INTO verrouille la base de données temp ; ce qui peut amener les autres processus à subir des blocages.</li>
</ol>
<p class="MsoNormal">Conception de requêtes :</p>
<p class="ListParagraph" style="text-indent: -18pt;">
<ol>
<li> <strong>Commentez votre code.<br />
</strong>Les commentaires permettront aux autres programmeurs / développeurs et à vous-même de vous comprendre lorsque vous relirez votre code. Il n’y a aucune raison de ne pas inscrire de commentaires, ils n’affectent en rien le code SQL.</li>
<li><strong>Inscrivez les mots clés SQL en lettres majuscules.<br />
</strong>Afin d’améliorer la lisibilité de votre code.</li>
<li><strong>Spécifier les colonnes dans les instructions « INSERT ».</strong><br />
Afin d’éviter les problèmes si la structure des tables constituant la requête change.</li>
<li><strong>Ne pas utiliser « SELECT * ».<br />
</strong>Spécifiez seulement les colonnes dont vous avez besoin. En plus de retourner des résultats inutiles l’utilisation d’un SELECT * peut empêcher l’utilisation d’un index couvrant.</li>
<li><strong>Toujours utiliser une clause « WHERE ».<br />
</strong>Afin de limiter le nombre d’enregistrements renvoyés et de retourner seulement les enregistrements nécessaires.</li>
<li><strong>Éviter d’utiliser la clause « DISTINCT ».<br />
</strong>Il est préférable d’utiliser une clause GROUP BY car elle est exécutée avant la clause DISTINCT dans le plan d’exécution d’une requête.</li>
<li><strong>Éviter d’utiliser des curseurs.</strong><br />
Les curseurs utilisent énormément de ressources, il est préférable d’utiliser une approche ensembliste (set based) plutôt qu’une approche procédurale telle un curseur. Si un curseur est inévitable, préférer une boucle « WHILE ».</li>
<li><strong>Éviter les « ORDER BY ».<br />
</strong>Effectuer les tris (order by) au niveau du client ; si ce n’est pas possible, spécifier la colonne plutôt qu’utiliser son numéro.</li>
<li><strong>Éviter les expressions suivantes qui ne sont pas sargable (qui ne profitent pas de l’utilisation d’un index et qui résultent en scan d’indexes ou de tables) :</strong>
<ol>
<li>L’utilisation du JOKER au début d’une expression dans une recherche WHERE [...] LIKE.</li>
<li>Les opérateurs « n’égale pas » (&lt;&gt; et NOT).</li>
<li>Les clauses IN et NOT IN, EXISTS et NOT EXISTS (bien que ces derniers soient préférables aux IN / NOT IN).</li>
<li> NOT LIKE</li>
<li>IS NULL</li>
</ol>
</li>
<li><strong>Utiliser des « Stored procedures ».<br />
</strong>Dès qu’une application cliente doit exécuter des requêtes TSQL , il est préférable d’utiliser des procédures stockées (SPROC) plutôt que des scripts dans l’application. Voici quelques avantages :</p>
<ol>
<li>Réduire le trafic sur le réseau.</li>
<li>Les plans d’exécution des SPROC peuvent être réutilisés par l’optimiseur de requêtes, ce qui aide à réduire la charge sur le serveur.</li>
<li>Permet d’encapsuler la logique d’affaire dans la base de données.</li>
</ol>
</li>
<li><strong>Débuter toutes les procédures stockées par « SET NOCOUNT ON ».</strong><br />
Cette commande permet de réduire le trafic sur le réseau et devrait débuter toutes les SPROC. Elle évite à SQL Server de calculer le nombre de lignes concernées par une requête ou une procédure stockée.</li>
<li><strong>Ne pas préfixer les procédures stockées par « sp_ ».<br />
</strong>Ce préfixe est réservé pour les procédures stockées systèmes.  Lorsqu’une procédure débutant par « sp_ » est rencontrée, SQL essaie de la localiser premièrement dans la base de données master.</li>
<li><strong>Éviter les longues requêtes.<br />
</strong>Il est préférable de séparer les longues requêtes en plusieurs petites requêtes.  Écrivez des requêtes claires et aussi courtes que possible.</li>
</ol>
<p class="ListParagraph" style="margin-left: 0cm;">Permissions :</p>
<p class="ListParagraph" style="text-indent: -18pt;">
<ol>
<li><strong>Donner les permissions adéquates aux objets.<br />
</strong>Ne pas donner des permissions aux usagers d’application dont ils n’ont pas besoin. Permettez seulement les opérations requises (SELECT, INSERT, DELETE, UPDATE, EXECUTE) par l’application sur les objets de la base de données. Dans le cas de tables contenant des données sensibles, spécifiez des permissions précises sur les colonnes plutôt que sur la table.</li>
<li><strong>Ne jamais utiliser le login « SA » pour l’accès aux données pour une application!</strong></li>
</ol>
<p class="ListParagraph" style="margin-left: 0cm;">Références :</p>
<ul>
<li><a href="http://www.sql-server-performance.com/articles/dev/sql_best_practices_p1.aspx" target="_blank">SQL Server TSQL Coding Conventions, Best Practices, and Programming Guidelines</a> <a href="http://blogs.techrepublic.com.com/10things/?p=381"></a></li>
<li><a href="http://blogs.techrepublic.com.com/10things/?p=381" target="_blank">10+ tips for getting the best performance out of your SQL Server data types</a></li>
<li>SQL Server DBA Best Practices by Brad McGehe</li>
<li><a href="http://www.google.ca/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fwww.amazon.com%2FInside-Microsoft-SQL-Server-2005%2Fdp%2F0735623139&amp;ei=PerQSJ7OJ4TQepvrrKAE&amp;usg=AFQjCNFc9NIvOIuACfVs_bc8BSnS0eBNfw&amp;sig2=1sKp94297OJEMo8ZaKnmJA" target="_blank">Inside MS SQL Server : T-SQL Querying</a>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.bolivier.com/2008/09/16/bonnes-pratiques-sql/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Liens : Dynamics GP</title>
		<link>http://blog.bolivier.com/2008/09/11/liens-dynamics/</link>
		<comments>http://blog.bolivier.com/2008/09/11/liens-dynamics/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 00:29:56 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
		
		<category><![CDATA[Dynamics GP]]></category>

		<guid isPermaLink="false">http://blog.bolivier.com/?p=59</guid>
		<description><![CDATA[J&#8217;ai ajouté une page où l&#8217;on peut retrouver des liens pointant vers différentes ressources concernant Dynamics GP : blogues, articles, sites divers.
N&#8217;hésitez pas à me faire part de sites à y ajouter!
]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai ajouté une <a href="http://blog.bolivier.com/liens-dynamics-gp/">page</a> où l&#8217;on peut retrouver des liens pointant vers différentes ressources concernant Dynamics GP : blogues, articles, sites divers.</p>
<p>N&#8217;hésitez pas à me faire part de sites à y ajouter!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bolivier.com/2008/09/11/liens-dynamics/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Microsoft Powershell</title>
		<link>http://blog.bolivier.com/2008/07/17/microsoft-powershell/</link>
		<comments>http://blog.bolivier.com/2008/07/17/microsoft-powershell/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 23:59:54 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
		
		<category><![CDATA[SQL Server]]></category>

		<category><![CDATA[powershell]]></category>

		<guid isPermaLink="false">http://vldimension.com/bo/wp/?p=24</guid>
		<description><![CDATA[En résumé : WOW!
Depuis quelques temps je vois de plus en plus d&#8217;articles ou de scripts destinés à Powershell, mais je ne m&#8217;y étais pas encore attardé : quelle erreur!  Étant un amateur du terminal de linux et un irréductible du shell de Windows, Microsoft n&#8217;aurait pu me faire une plus belle surprise que cet [...]]]></description>
			<content:encoded><![CDATA[<p>En résumé : WOW!</p>
<p>Depuis quelques temps je vois de plus en plus d&#8217;articles ou de scripts destinés à Powershell, mais je ne m&#8217;y étais pas encore attardé : quelle erreur!  Étant un amateur du terminal de linux et un irréductible du shell de Windows, Microsoft n&#8217;aurait pu me faire une plus belle surprise que cet outil.<span id="more-24"></span></p>
<p>Afin de démystifier un peu le sujet je vous suggère d&#8217;écouter le <a href="http://www.microsoft.com/events/EventDetails.aspx?CMTYSvcSource=MSCOMMedia&amp;Params=%7eCMTYDataSvcParams%5e%7earg+Name%3d%22ID%22+Value%3d%221032319212%22%2f%5e%7earg+Name%3d%22ProviderID%22+Value%3d%22A6B43178-497C-4225-BA42-DF595171F04C%22%2f%5e%7earg+Name%3d%22lang%22+Value%3d%22en%22%2f%5e%7earg+Name%3d%22cr%22+Value%3d%22US%22%2f%5e%7esParams%5e%7e%2fsParams%5e%7e%2fCMTYDataSvcParams%5e" target="_blank">TechNet Webcast: An Overview of Windows PowerShell (Level 200)</a> de Don Jones; en 40 minutes cela vous donnera une idée générale des possibilités de l&#8217;outil et vous donnera les bases pour l&#8217;explorer par vous-même.</p>
<p>Vous trouverez quelques applications &#8220;SQL&#8221; du Powershell en regardant les <a href="http://www.databasejournal.com/article.php/3300441" target="_blank">séries d&#8217;articles de &#8220;MAK&#8221;</a> sur Databasejournal :</p>
<ul>
<li><span class="ser"><span><span>Microsoft Windows PowerShell and SQL Server 2005 SMO</span></span></span></li>
<li><span class="ser">Check your SQL Server using Windows PowerShell</span></li>
</ul>
<p>Voici un script tiré de ses articles qui permet de lancer des backups sur un serveur SQL avec une simple ligne de commande dans le Powershell :</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">#backupSQL.ps1</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">param</span> <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span><span class="re3">string</span><span class="br0">&#93;</span> <span class="re0">$ServerName</span>,</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span><span class="re3">string</span><span class="br0">&#93;</span> <span class="re0">$DatabaseName</span>,</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#91;</span><span class="re3">string</span><span class="br0">&#93;</span> <span class="re0">$Backuptype</span> ,</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span><span class="re3">string</span><span class="br0">&#93;</span> <span class="re0">$BackupPath</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span><span class="re4">System.Reflection.Assembly</span><span class="br0">&#93;</span>::<span class="re5">LoadWithPartialName</span><span class="br0">&#40;</span><span class="st0">&quot;Microsoft.SqlServer.Smo&quot;</span><span class="br0">&#41;</span> | <span class="kw1">out-null</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>System.IO.Directory<span class="br0">&#93;</span>::CreateDirectory<span class="br0">&#40;</span><span class="re0">$BackupPath</span><span class="br0">&#41;</span> | <span class="kw1">out-null</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$srv</span>=<span class="kw1">New-Object</span> <span class="st0">&quot;Microsoft.SqlServer.Management.Smo.Server&quot;</span> <span class="st0">&quot;$servername&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$bck</span>=<span class="kw1">new-object</span> <span class="st0">&quot;Microsoft.SqlServer.Management.Smo.Backup&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">if</span> <span class="br0">&#40;</span><span class="re0">$Backuptype</span> <span class="kw4">-eq</span> <span class="st0">&quot;FULL&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$bck</span>.Action <span class="kw4">=</span> <span class="st0">&#8216;Database&#8217;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$extenstion</span>=<span class="st0">&quot;.BAK&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$text1</span>=<span class="st0">&quot;Full Backup &quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw3">if</span> <span class="br0">&#40;</span><span class="re0">$Backuptype</span> <span class="kw4">-eq</span> <span class="st0">&quot;TRAN&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$bck</span>.Action <span class="kw4">=</span> <span class="st0">&#8216;Log&#8217;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$extenstion</span>=<span class="st0">&quot;.LOG&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$text1</span>=<span class="st0">&quot;Transactional Log Backup &quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">if</span> <span class="br0">&#40;</span><span class="re0">$Backuptype</span> <span class="kw4">-eq</span> <span class="st0">&quot;DIFF&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$bck</span>.Incremental <span class="kw4">=</span> <span class="nu0">1</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$extenstion</span>=<span class="st0">&quot;.DIFF&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$text1</span>=<span class="st0">&quot;Differential Backup &quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$fil</span>=<span class="kw1">new-object</span> <span class="st0">&quot;Microsoft.SqlServer.Management.Smo.BackupDeviceItem&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$fil</span>.DeviceType=<span class="st0">&#8216;File&#8217;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$fil</span>.Name=<span class="br0">&#91;</span>System.IO.Path<span class="br0">&#93;</span>::Combine<span class="br0">&#40;</span><span class="re0">$BackupPath</span>, <span class="re0">$DatabaseName</span>+ <span class="st0">&quot;_&quot;</span><span class="kw4">+</span> <span class="br0">&#91;</span>DateTime<span class="br0">&#93;</span>::Today.ToString<span class="br0">&#40;</span><span class="st0">&quot;yyyy_MM_dd&quot;</span><span class="br0">&#41;</span>+<span class="re0">$extenstion</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$bck</span>.Devices.Add<span class="br0">&#40;</span><span class="re0">$fil</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$bck</span>.Database=<span class="re0">$DatabaseName</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$bck</span>.SqlBackup<span class="br0">&#40;</span><span class="re0">$srv</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">write-host</span> <span class="re0">$text1</span> of <span class="re0">$Databasename</span> done</div>
</li>
</ol>
</div>
<p>Une fois le script créé, il suffit de le lancer avec la commande</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">backupSQL <span class="st0">&quot;SQLSERVERNAME&quot;</span> <span class="st0">&quot;DATABASENAME&quot;</span> <span class="st0">&quot;FULL&quot;</span> <span class="st0">&quot;SAVEPATH&quot;</span></div>
</li>
</ol>
</div>
<p>Si vous désirez en apprendre plus voici quelques étapes pour commencer :</p>
<ol>
<li><a href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx" target="_blank">Téléchargez</a> et installez l&#8217;application.</li>
<li>Tapez &#8220;powershell&#8221; dans Déarrer /exécuter.</li>
<li>Amusez-vous!</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.bolivier.com/2008/07/17/microsoft-powershell/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Fonction InitCap pour SQL Server</title>
		<link>http://blog.bolivier.com/2008/04/15/fonction-initcap-pour-sql-server/</link>
		<comments>http://blog.bolivier.com/2008/04/15/fonction-initcap-pour-sql-server/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 23:16:35 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
		
		<category><![CDATA[tsql]]></category>

		<guid isPermaLink="false">http://vldimension.com/bo/wp/?p=5</guid>
		<description><![CDATA[Pour ceux qui ne la connaissent pas, la fonction InitCap permet sous Oracle de remplacer la première lettre de chaque mot dans un string par une majuscule; les autres lettres sont  en minuscule. Voici une fonction définie par l&#8217;usager pour simuler la fonction InitCap sous SQL Server.
J&#8217;utilise cette fonction depuis déjà longtemps au travail; je [...]]]></description>
			<content:encoded><![CDATA[<p>Pour ceux qui ne la connaissent pas, la fonction InitCap permet sous Oracle de remplacer la première lettre de chaque mot dans un string par une majuscule; les autres lettres sont  en minuscule. Voici une fonction définie par l&#8217;usager pour simuler la fonction InitCap sous SQL Server.<span id="more-5"></span></p>
<p>J&#8217;utilise cette fonction depuis déjà longtemps au travail; je ne me souviens malheureusement pas à qui revient les mérites de la fonction originale&#8230;</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">CREATE</span> <span class="kw1">FUNCTION</span> <span class="br0">&#91;</span>dbo<span class="br0">&#93;</span>.<span class="br0">&#91;</span>initcap<span class="br0">&#93;</span> <span class="br0">&#40;</span>@<span class="kw1">TEXT</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">4000</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">RETURNS</span> <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">4000</span><span class="br0">&#41;</span> <span class="kw1">AS</span> <span class="kw1">BEGIN</span> <span class="kw1">DECLARE</span>    @counter <span class="kw1">INT</span>,</div>
</li>
<li class="li1">
<div class="de1">@length <span class="kw1">INT</span>,</div>
</li>
<li class="li1">
<div class="de1">@<span class="kw1">CHAR</span> <span class="kw1">CHAR</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li2">
<div class="de2">@textnew <span class="kw1">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">4000</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">IF</span> @<span class="kw1">TEXT</span> &lt;&gt; <span class="st0">&#8221;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">BEGIN</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">SET</span> @<span class="kw1">TEXT</span> = <span class="kw2">RTRIM</span><span class="br0">&#40;</span>@<span class="kw1">TEXT</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">SET</span> @<span class="kw1">TEXT</span> = <span class="kw2">LOWER</span><span class="br0">&#40;</span>@<span class="kw1">TEXT</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">SET</span> @length = <span class="kw2">LEN</span><span class="br0">&#40;</span>@<span class="kw1">TEXT</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">SET</span> @counter = <span class="nu0">1</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">SET</span> @<span class="kw1">TEXT</span> = <span class="kw2">UPPER</span><span class="br0">&#40;</span><span class="kw1">LEFT</span><span class="br0">&#40;</span>@<span class="kw1">TEXT</span>, <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> + <span class="kw1">RIGHT</span><span class="br0">&#40;</span>@<span class="kw1">TEXT</span>, @length - <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">WHILE</span> @counter &lt;&gt; @length</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">BEGIN</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">SELECT</span> @<span class="kw1">CHAR</span> = <span class="kw2">SUBSTRING</span><span class="br0">&#40;</span>@<span class="kw1">TEXT</span>, @counter, <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">IF</span> @<span class="kw1">CHAR</span> = <span class="kw1">SPACE</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>  OR @<span class="kw1">CHAR</span> =  <span class="st0">&#8216;_&#8217;</span> OR @<span class="kw1">CHAR</span> = <span class="st0">&#8216;,&#8217;</span>  OR @<span class="kw1">CHAR</span> = <span class="st0">&#8216;.&#8217;</span> OR @<span class="kw1">CHAR</span> = <span class="st0">&#8216;<span class="es0">\&#8217;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">OR @char = &#8216;</span>/<span class="st0">&#8216; OR @char = &#8216;</span><span class="br0">&#40;</span><span class="st0">&#8216; OR @char = &#8216;</span><span class="br0">&#41;</span><span class="st0">&#8216; OR @char = &#8216;</span>-<span class="st0">&#8216;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="st0">BEGIN</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">SET @textnew = LEFT(@text, @counter) + upper(substring(@text, @counter+1, 1)) + RIGHT(@text, (@length - @counter) - 1)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">SET @text = @textnew</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="st0">END</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">SET @counter = @counter + 1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">END</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">END</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">RETURN @text END</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bolivier.com/2008/04/15/fonction-initcap-pour-sql-server/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Schémas de bases de données de MS Dynamics</title>
		<link>http://blog.bolivier.com/2008/04/04/schemas-de-bases-de-donnees-de-ms-dynamics/</link>
		<comments>http://blog.bolivier.com/2008/04/04/schemas-de-bases-de-donnees-de-ms-dynamics/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 22:20:22 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
		
		<category><![CDATA[Dynamics GP]]></category>

		<category><![CDATA[tsql]]></category>

		<guid isPermaLink="false">http://vldimension.com/bo/wp/?p=8</guid>
		<description><![CDATA[Mise en situation :
Un utilisateur de Dynamics vient me voir pour m&#8217;apprendre que les relevés bancaires ont été conciliés par erreur&#8230; on ne sait pas quand, ni par qui. À l&#8217;aide de Log Explorer il a été facile de retrouver le moment où l&#8217;action a été produite; malheurusement il était impossible d&#8217;effectuer un rollback des [...]]]></description>
			<content:encoded><![CDATA[<p>Mise en situation :</p>
<p>Un utilisateur de Dynamics vient me voir pour m&#8217;apprendre que les relevés bancaires ont été conciliés par erreur&#8230; on ne sait pas quand, ni par qui. À l&#8217;aide de Log Explorer il a été facile de retrouver le moment où l&#8217;action a été produite; malheurusement il était impossible d&#8217;effectuer un rollback des transactions.<span id="more-8"></span></p>
<p>Résolution :</p>
<p>Passer un nombre d&#8217;heures indéterminé à reproduire les opérations effectuées par l&#8217;usager, «loguer» et scruter à la loupe toutes les entrées dans SQL Profiler et Log Explorer afin de déterminer tous les champs de toutes les tables qui ont pu être touchées afin d&#8217;effectuer les correctifs appropriées.</p>
<p>Souhait :</p>
<p>Pourquoi ne pourrais-je pas avoir les schémas des tables de la base de données&#8230; cela serait si facile.</p>
<p>Réponse divine :</p>
<p>Les diagrammes se trouvent sur le deuxième disque de l&#8217;installation de MS Dynamics GP. Il suffit d&#8217;installer la «bibliothèque d&#8217;outils de services professionnels».</p>
<p>À titre d&#8217;exemple, voici le schéma des tables du module des achats de GP :</p>
<p><a href="http://vldimension.com/bo/wp/wp-content/uploads/2008/07/dynbdachats.png"><img class="alignnone size-medium wp-image-9" title="dynbdachats" src="http://vldimension.com/bo/wp/wp-content/uploads/2008/07/dynbdachats-279x300.png" alt="" width="279" height="300" /></a></p>
<p>Je regrette seulement de ne pas avoir trouvé ces schémas plus tôt&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bolivier.com/2008/04/04/schemas-de-bases-de-donnees-de-ms-dynamics/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Générer des numéros de ligne sous SQL Server 2000?</title>
		<link>http://blog.bolivier.com/2008/03/27/generer-des-numeros-de-ligne-sous-sql-server-2000/</link>
		<comments>http://blog.bolivier.com/2008/03/27/generer-des-numeros-de-ligne-sous-sql-server-2000/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 00:15:42 +0000</pubDate>
		<dc:creator>Benjamin</dc:creator>
		
		<category><![CDATA[SQL Server]]></category>

		<category><![CDATA[tsql]]></category>

		<category><![CDATA[SQL Server 2000]]></category>

		<guid isPermaLink="false">http://vldimension.com/bo/wp/?p=6</guid>
		<description><![CDATA[Sous SQL Server 2005, il est possible de facilement générer des numéros de ligne dans une requête en utilisant la fonction ROW_NUMBER.
On peut arriver au même résultat sous MSSQL2000 en utilisant un champ IDENTITY dans une table temporaire.
Un petit exemple qui dit tout :



SELECT &#160; &#160; NoEmploye, NomEmploye, IDENTITY&#40;INT,1,1&#41; AS &#91;ROW Number&#93;


INTO &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Sous SQL Server 2005, il est possible de facilement générer des numéros de ligne dans une requête en utilisant la fonction ROW_NUMBER.</p>
<p>On peut arriver au même résultat sous MSSQL2000 en utilisant un champ IDENTITY dans une table temporaire.<span id="more-6"></span></p>
<p>Un petit exemple qui dit tout :</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">SELECT</span> &nbsp; &nbsp; NoEmploye, NomEmploye, <span class="kw1">IDENTITY</span><span class="br0">&#40;</span><span class="kw1">INT</span>,<span class="nu0">1</span>,<span class="nu0">1</span><span class="br0">&#41;</span> <span class="kw1">AS</span> <span class="br0">&#91;</span><span class="kw1">ROW</span> Number<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">INTO</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>#tempBen<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">FROM</span> &nbsp; &nbsp; &nbsp; &nbsp; Employes</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">ORDER</span> <span class="kw1">BY</span> &nbsp; &nbsp;DateEmbauche <span class="kw1">DESC</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bolivier.com/2008/03/27/generer-des-numeros-de-ligne-sous-sql-server-2000/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
