<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - hmira</title>
		<link>https://www.developpez.net/forums/blogs/24310-hmira/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Fri, 17 Apr 2026 12:55:30 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - hmira</title>
			<link>https://www.developpez.net/forums/blogs/24310-hmira/</link>
		</image>
		<item>
			<title>SQL Server - TRIM et la clause FROM</title>
			<link>https://www.developpez.net/forums/blogs/24310-hmira/b9874/sql-server-trim-clause-from/</link>
			<pubDate>Mon, 02 Nov 2020 06:47:23 GMT</pubDate>
			<description>La fonction TRIM a été...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">La fonction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">TRIM</span>a été introduite à partir de SQL Server 2017.<br />
Dans sa forme la plus simple et triviale, elle permet de supprimer les caractères espaces char(32) situés au début et à la fin d'une chaîne. Elle peut ainsi avantageusement remplacer  <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">LTRIM(RTRIM(xxx))</span>Exemple : <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">SELECT</span> <span style="color: #FF0000;">'['</span> + TRIM<span class="br0">&#40;</span><span style="color: #FF0000;">'  VFDRBM '</span><span class="br0">&#41;</span> + <span style="color: #FF0000;">']'</span>  <span style="color: #0000ff;">as</span> Result</pre>
</div><br />
Résultat :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">Result
---------
[VFDRBM]</pre></td></tr></table></pre>
</div>Mais, un autre aspect peu connu de la fonction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">TRIM</span>, est celui qui consiste à supprimer d'autres caractères, autres que les espaces, situés au début et à la fin d'une chaîne, et ce, par le truchement de la clause <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">FROM</span>.<br />
Je vous laisse méditer sur le résultat de la requête ci-dessous.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> <span style="color: #FF0000;">'['</span> + TRIM<span class="br0">&#40;</span><span style="color: #FF0000;">' 0123456789'</span> <span style="color: #0000ff;">FROM</span> Code<span class="br0">&#41;</span> + <span style="color: #FF0000;">']'</span> <span style="color: #0000ff;">as</span> Result
<span style="color: #0000ff;">FROM</span>
<span class="br0">&#40;</span>
    <span style="color: #0000ff;">VALUES</span>
        <span class="br0">&#40;</span><span style="color: #FF0000;">' 145ABCDF42'</span><span class="br0">&#41;</span> ,
	<span class="br0">&#40;</span><span style="color: #FF0000;">'8179527EGH223  '</span><span class="br0">&#41;</span>,
        <span class="br0">&#40;</span><span style="color: #FF0000;">'1224996TRGCV852'</span><span class="br0">&#41;</span>,
	<span class="br0">&#40;</span><span style="color: #FF0000;">' 07745GHCWQM 12 9 0 '</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> Z <span class="br0">&#40;</span>Code<span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
Résultat :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">Result
-------------
[ABCDF]
[EGH]
[TRGCV]
[GHCWQM]</pre></td></tr></table></pre>
</div>A+<br />
<b>Hamid MIRA</b></blockquote>

]]></content:encoded>
			<dc:creator>hmira</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/24310-hmira/b9874/sql-server-trim-clause-from/</guid>
		</item>
		<item>
			<title><![CDATA[SQL Server - BIT vs  VARCHAR ('True' / 'False')]]></title>
			<link>https://www.developpez.net/forums/blogs/24310-hmira/b7861/sql-server-bit-vs-varchar-true-false/</link>
			<pubDate>Thu, 08 Aug 2019 14:38:40 GMT</pubDate>
			<description>Ci-dessous un exemple simple...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Ci-dessous un exemple simple qui montre comment on peut substituer les valeurs 0 (False) et 1 (True) du type <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">BIT</span>, respectivement par des chaînes de caractères mnémoniques, compréhensibles  ‘True’ et ‘Flase’. <br />
<br />
Il faut toutefois rester prudent ! Cette technique met en œuvre, en arrière-plan, le transtypage implicite. Les expressions peuvent rapidement devenir NON-SARG. Il convient donc d’être attentif et vigilant quant aux plans d’exécution des requêtes SQL, notamment lorsque cette technique est utilisée dans une clause <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">WHERE</span> ou dans une clause de jointure <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">JOIN</span>, ce qui n’est pas le cas dans l’exemple cité. <br />
<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">DECLARE</span> <span style="color: #339933;">@IsTrusted</span> <span style="color: #0000ff;">BIT</span>;
&nbsp;
<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@IsTrusted</span> = <span style="color: #FF0000;">'True'</span>;
&nbsp;
<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@IsTrusted</span> = ~ <span style="color: #339933;">@IsTrusted</span>;
&nbsp;
PRINT IIF<span class="br0">&#40;</span><span style="color: #339933;">@IsTrusted</span>=<span style="color: #cc66cc;">1</span>, <span style="color: #FF0000;">'True'</span>, <span style="color: #FF0000;">'False'</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>Résultat :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">False</pre>
</div>A+<br />
<br />
Hamid MIRA</blockquote>

]]></content:encoded>
			<dc:creator>hmira</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/24310-hmira/b7861/sql-server-bit-vs-varchar-true-false/</guid>
		</item>
		<item>
			<title><![CDATA[SQL Server - T-SQL :  Le ";" (point-virgule) est-il vraiment nécessaire ?]]></title>
			<link>https://www.developpez.net/forums/blogs/24310-hmira/b5942/sql-server-t-sql-point-virgule-vraiment-necessaire/</link>
			<pubDate>Tue, 14 Aug 2018 15:33:37 GMT</pubDate>
			<description>Je me suis toujours posé la...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Je me suis toujours posé la question concernant la nécessité d'ajouter un &quot;;&quot;  (point-virgule) à la fin de certaines instructions T-SQL.<br />
<br />
Et, force est de constater que la réponse n'est pas toujours évidente. Le manque de rigueur du langage T-SQL contribue, à mon avis, à cette confusion !<br />
<br />
Pendant longtemps et même jusqu'à aujourd'hui, sauf dans de rares cas (Exemple &quot;;WITH CTE ...&quot; ) , l'ajout du point-virgule n'est pas vraiment indispensable pour que le code T-SQL compile correctement, en ce sens qu'aucun message d'erreur ou d'avertissement n'est généré si on omet les points virgules à la fin des instructions.<br />
<br />
Ayant développé dans d'autres langages plus stricts, personnellement, je me force d'être également plus rigoureux avec le langage T-SQL et je rajoute systématiquement des points virgules à la fin des instructions T-SQL, même si parfois j'avais quelques doutes ou questions quant à l'utilisation du point-virgule ! J'ai fini par trancher ces doutes et questions (Voir plus loin dans cet article).<br />
<br />
Exemple de questions :<br />
<i>- Fallait-il vraiment un point-virgule après un BEGIN ?</i><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">BEGIN</span>;</pre>
</div>Remarque :<br />
&quot;BEGIN;&quot; me paraissait tellement &quot;moche&quot; que personnellement, je n'ai jamais mis de point-virgule après un &quot;BEGIN&quot;<br />
En plus, je n'ai jamais vu d'exemple T-SQL où on peut voir un &quot;BEGIN;&quot; ! Pour moi, cette question a été vite tranchée.<br />
En faisant quelques recherches sur ce sujet, il semble que &quot;BEGIN;&quot; est équivalent à un &quot;BEGIN&quot; suivi d'une instruction vide qui ne sert à rien !<br />
<br />
<i>- Fallait-il vraiment un point-virgule après un END ?</i><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">BEGIN</span> <span style="color: #808080;">-- avec ou sans point-virgule !</span>
<span style="color: #0000ff;">END</span>;</pre></td></tr></table></pre>
</div>Remarque :<br />
Là, franchement, j'hésitais (?). En effet, on peut, trouver des exemples dans Le BOL avec des &quot;END;&quot; et d'autre avec &quot;END&quot; sans le &quot;;&quot; (point-virgule).<br />
Exemple :<br />
<br />
Syntaxe extraite du BOL, sans le point-virgule :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">BEGIN</span>
	 <span class="br0">&#123;</span>
	sql_statement | statement_block
	 <span class="br0">&#125;</span>
<span style="color: #0000ff;">END</span></pre></td></tr></table></pre>
</div>Exemple extrait du BOL, avec point-virgule :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">IF</span> <span style="color: #339933;">@@TRANCOUNT</span> = <span style="color: #cc66cc;">0</span>
<span style="color: #0000ff;">BEGIN</span>
...
<span style="color: #0000ff;">END</span>;</pre></td></tr></table></pre>
</div>Remarque : <br />
On peut aisément constater une incohérence entre la syntaxe et les exemples de &quot;BEGIN .. END&quot; !<br />
<br />
<i>- Fallait-il vraiment un point-virgule après un &quot;BGIN TRAN&quot;, &quot;BEGIN TRANSACTION&quot;, ROLLBACK, ROLLBACK TRANSACTION ? </i><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">BEGIN</span> <span style="color: #0000ff;">TRAN</span>;
<span style="color: #0000ff;">BEGIN</span> <span style="color: #0000ff;">TRANSACTION</span>;
<span style="color: #0000ff;">ROLLBACK</span>;
<span style="color: #0000ff;">ROLLBACK</span> <span style="color: #0000ff;">TRANSACTION</span>;
&nbsp;
<span style="color: #808080;">-- Etc.</span></pre></td></tr></table></pre>
</div>Voilà, autant de questions sujettes à interprétation ou plutôt à &quot;confusion&quot; !<br />
<br />
Microsoft, dans le BOL précise désormais ceci :<br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				;	Terminateur d'instruction Transact-SQL. Bien que le point-virgule ne soit pas requis pour la plupart des instructions dans cette version de SQL Server, il sera requis dans une version à venir.
			
		</div>
	</div>
</div>Personne ne pourra sérieusement croire que Microsoft osera un jour franchir le pas et rendre le &quot;;&quot; (point-virgule) obligatoire. Le poids du code T-SQL existant est tel que cela &quot;foutrait la pagaille&quot; ! Et beaucoup n'utiliseront peut être jamais les nouvelles versions SQL Server intégrant cette exigence stricte.<br />
<br />
<b>En conclusion</b><br />
<br />
Après avoir effectué des recherches sur ce sujet et surtout examiné beaucoup de code T-SQL j'en arrive à la conclusion suivante :<br />
<br />
<b>1</b> - Rajouter un &quot;;&quot; (point-virgule) à la fin de chaque instruction T-SQL, à quelques exceptions près (voir point 2 ci-dessous)<br />
<br />
<b>2</b> - Ne pas rajouter un &quot;;&quot; (point-virgule) après les mots clés suivants :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">BEGIN</span>
&nbsp;
<span style="color: #0000ff;">IF</span>
&nbsp;
<span style="color: #0000ff;">ELSE</span>
&nbsp;
<span style="color: #0000ff;">BEGIN</span> <span style="color: #0000ff;">TRY</span>
&nbsp;
<span style="color: #0000ff;">END</span> <span style="color: #0000ff;">TRY</span>
&nbsp;
<span style="color: #0000ff;">BEGIN</span> <span style="color: #0000ff;">CATCH</span>
&nbsp;
<span style="color: #0000ff;">WHILE</span>
&nbsp;
<span style="color: #0000ff;">GO</span></pre></td></tr></table></pre>
</div><b>3</b> - Rajouter un &quot;;&quot; (point-virgule) à la fin des instructions T-SQL telles que ci-dessous :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">BEGIN</span> <span style="color: #0000ff;">TRAN</span>;
<span style="color: #0000ff;">BEGIN</span> <span style="color: #0000ff;">TRAN</span> Transaction_Name;
<span style="color: #0000ff;">BEGIN</span> <span style="color: #0000ff;">TRAN</span> Transaction_Name <span style="color: #0000ff;">WITH</span> <span style="color: #0000ff;">MARK</span> Description;
&nbsp;
<span style="color: #0000ff;">BEGIN</span> <span style="color: #0000ff;">TRANSACTION</span>;
<span style="color: #0000ff;">BEGIN</span> <span style="color: #0000ff;">TRANSACTION</span> Transaction_Name;
<span style="color: #0000ff;">BEGIN</span> <span style="color: #0000ff;">TRANSACTION</span> Transaction_Name <span style="color: #0000ff;">WITH</span> <span style="color: #0000ff;">MARK</span> Description;
&nbsp;
<span style="color: #0000ff;">COMMIT</span> <span style="color: #0000ff;">TRAN</span>;
<span style="color: #0000ff;">COMMIT</span> <span style="color: #0000ff;">TRAN</span> Transaction_Name;
&nbsp;
<span style="color: #0000ff;">COMMIT</span> <span style="color: #0000ff;">TRANSACTION</span>;
<span style="color: #0000ff;">COMMIT</span> <span style="color: #0000ff;">TRANSACTION</span> Transaction_Name;
&nbsp;
<span style="color: #0000ff;">END</span> <span style="color: #0000ff;">CATCH</span>;
&nbsp;
<span style="color: #0000ff;">END</span>;
&nbsp;
<span style="color: #0000ff;">ROLLBACK</span>;
<span style="color: #0000ff;">ROLLBACK</span> <span style="color: #0000ff;">TRAN</span>;
<span style="color: #0000ff;">ROLLBACK</span> <span style="color: #0000ff;">TRAN</span> Transaction_Name;
<span style="color: #0000ff;">ROLLBACK</span> <span style="color: #0000ff;">TRAN</span> SavePoint_Name;
&nbsp;
<span style="color: #0000ff;">ROLLBACK</span> <span style="color: #0000ff;">TRANSACTION</span>;
<span style="color: #0000ff;">ROLLBACK</span> <span style="color: #0000ff;">TRANSACTION</span> Transaction_Name;
&nbsp;
<span style="color: #0000ff;">SAVE</span> <span style="color: #0000ff;">TRAN</span> SavePoint_Name;
<span style="color: #0000ff;">SAVE</span> <span style="color: #0000ff;">TRANSACTION</span> SavePoint_Name;
<span style="color: #0000ff;">SAVE</span> <span style="color: #0000ff;">TRANSACTION</span> SavePoint_Name;
&nbsp;
<span style="color: #0000ff;">USE</span> Database_Name;</pre></td></tr></table></pre>
</div><b>4</b> - Rajouter, le cas échéant, et non pas systématiquement, un ';'  (point-virgule) au début des déclarations CTE (Common Table Expression). Dans la pratique, rajouter un &quot;;&quot;  (point-virgule) uniquement si vous obtenez des erreurs de syntaxes.<br />
<br />
Exemple :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:132px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0">;<span style="color: #0000ff;">WITH</span> CTE_Client <span style="color: #0000ff;">AS</span>
 <span class="br0">&#40;</span><span style="color: #0000ff;">SELECT</span> Nom
 <span style="color: #0000ff;">FROM</span> dbo.Client
	<span style="color: #0000ff;">WHERE</span> ...
	<span class="br0">&#41;</span>
<span style="color: #0000ff;">SELECT</span> Nom
<span style="color: #0000ff;">FROM</span> CTE_Client
<span style="color: #0000ff;">WHERE</span> ...</pre></td></tr></table></pre>
</div>Remarque :<br />
Le &quot;;&quot; (point-virgule) en début d'une déclaration CTE n'est pas toujours requis. Si par exemple la déclaration CTE est la première instruction de votre bloc T-SQL, le &quot;;&quot; (point-virgule) n'est pas nécessaire en début de la déclaration. En effet, le &quot;;&quot; (point-virgule) est avant tout un &quot;Terminateur&quot; et non un &quot;Démarreur&quot; !<br />
Il se trouve que, pour des raisons diverses (1), l'instruction WITH CTE exige que l'instruction précédente, si elle existe, soit explicitement terminée avec un &quot;;&quot; (point-virgule).<br />
<br />
(1) : La raison est que le mot clé WITH est utilisé également dans plusieurs contextes différents (Indicateur de verrou WITH (NOLOCK), Indicateurs divers de requêtes WITH (...) etc. Le fait de marquer, par un &quot;;&quot; (point-virgule) que l'instruction précédente est bien terminée, aide l'Analyseur syntaxique en lui permettant de lever toute ambiguïté et donc ainsi de ne pas générer des messages erreurs.<br />
<br />
A+<br />
<br />
<b>Hamid MIRA</b></blockquote>

]]></content:encoded>
			<dc:creator>hmira</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/24310-hmira/b5942/sql-server-t-sql-point-virgule-vraiment-necessaire/</guid>
		</item>
		<item>
			<title>SQL Server - Lister les fichiers de données (.mdf, .ndf) ou de log (.ldf) orphelins</title>
			<link>https://www.developpez.net/forums/blogs/24310-hmira/b1872/sql-server-lister-fichiers-donnees-mdf-ndf-log-ldf-orphelins/</link>
			<pubDate>Fri, 30 Dec 2016 17:37:21 GMT</pubDate>
			<description>*I - Préambule * 
 
Le but de...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><b>I - Préambule </b><br />
<br />
Le but de ce billet est de vous présenter une méthode simple, vous permettant de lister les fichiers de données (.mdf, .ndf) ou les fichiers des journaux de transactions (.ldf) orphelins, c.à.d. des fichiers (.mdf, .ndf ou ldf) qui ne sont rattachés à aucune base de données du Serveur. <br />
Ces fichiers orphelins de bases de données occupent généralement beaucoup d’espaces disques inutilement dès lors que les bases de données originelles correspondantes ont déjà fait l’objet de sauvegarde et d’archivage.<br />
<br />
L’émergence de ces fichiers orphelins survient généralement après de multiples opérations habituelles d’administration, de type <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">OFFLINE</span>/<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">ONLINE</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">DETACH</span>/<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">ATTACH</span> appliquées à des bases de données, suivies de déplacements, au niveau de l’OS, des fichiers de bases de données (.mdf, .ndf ou ldf) d’un Serveurs SQL vers un autre, etc. <br />
<br />
Ces fichiers (.mdf, .ndf ou ldf) orphelins, peuvent, <u>après vérification minutieuse bien sûr</u>, être définitivement supprimés pour libérer de l'espaces disques. <br />
<br />
<b>II - Mise en œuvre </b><br />
<br />
Pour la mise en œuvre de cette méthode, j’utilise principalement : <br />
- La procédure système non documentée <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">master.sys.xp_dirtree</span> Celle-ci permet de lister tous les fichiers et/ou sous répertoires d’un répertoire donné.<br />
- La vue système <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">master.sys.master_files</span>. Celle-ci contient une ligne par fichier de base de données, et ce, pour toutes les bases de données de l’instance SQL Server. <br />
<br />
Vous trouverez ci-dessous le script de la procédure <b>dbo.uspListeFichiersDataOuLogOrphelinsDeBasesDeDonnees</b> accomplissant cette tâche.  <br />
Celle-ci attend deux paramètres : <br />
. <b>@pi_DefaultDirectoryData</b> : Le répertoire des fichiers de données (.mdf, ndf), exprimé soit de façon explicite, Exemple : N'C:\SQL\Data'<br />
ou de façon implicite, en affectant la valeur NULL, pour faire référence au répertoire par défaut des fichiers de données défini au niveau de l'instance<br />
. <b>@pi_DefaultDirectoryLog</b> : Le répertoire des fichiers des journaux de transactions (.ldf) ), exprimé soit de façon explicite, Exemple : 'C:\SQL\Log' ou de façon implicite, en affectant la valeur NULL, pour faire référence au répertoire par défaut des fichiers des journaux de transactions défini au niveau de l'instance.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">-- J'utilise la base master, mais vous pouvez utiliser une autre base de votre choix</span>
<span style="color: #0000ff;">USE</span> master
<span style="color: #0000ff;">GO</span>
<span style="color: #0000ff;">IF</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">EXISTS</span> <span class="br0">&#40;</span> <span style="color: #0000ff;">SELECT</span> p.*
				<span style="color: #0000ff;">FROM</span> sys.procedures <span style="color: #0000ff;">AS</span> p <span style="color: #0000ff;">WITH</span> <span class="br0">&#40;</span>nolock<span class="br0">&#41;</span>
				<span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> sys.schemas <span style="color: #0000ff;">AS</span> s <span style="color: #0000ff;">WITH</span> <span class="br0">&#40;</span>nolock<span class="br0">&#41;</span>
				  <span style="color: #0000ff;">ON</span> p.schema_id = p.schema_id
				<span style="color: #0000ff;">WHERE</span> s.name = N<span style="color: #FF0000;">'dbo'</span> <span style="color: #0000ff;">AND</span> P.name = N<span style="color: #FF0000;">'uspListeFichiersDataOuLogOrphelinsDeBasesDeDonnees'</span> <span style="color: #0000ff;">AND</span> P.type <span style="color: #0000ff;">IN</span> <span class="br0">&#40;</span>N<span style="color: #FF0000;">'P'</span>, N<span style="color: #FF0000;">'PC'</span><span class="br0">&#41;</span>
			  <span class="br0">&#41;</span>
<span style="color: #0000ff;">BEGIN</span>
	<span style="color: #0000ff;">EXEC</span> dbo.sp_executesql
		 <span style="color: #339933;">@statement</span> = N<span style="color: #FF0000;">'CREATE PROCEDURE dbo.uspListeFichiersDataOuLogOrphelinsDeBasesDeDonnees</span>
<span style="color: #FF0000;">AS</span>
<span style="color: #FF0000;">BEGIN</span>
<span style="color: #FF0000;">-- !!! &quot;Stub&quot; doit &ecirc;tre impl&eacute;ment&eacute; !!!</span>
<span style="color: #FF0000;">SET NOCOUNT ON;</span>
<span style="color: #FF0000;">END; '</span>;
<span style="color: #0000ff;">END</span>;
<span style="color: #0000ff;">GO</span>
&nbsp;
<span style="color: #808080;">-- ----------------------------------------------------------------------------</span>
<span style="color: #808080;">-- Proc&eacute;dure          : dbo.uspListeFichiersDataOuLogOrphelinsDeBasesDeDonnees</span>
<span style="color: #808080;">-- Cr&eacute;ateur           : Hamid MIRA</span>
<span style="color: #808080;">-- Date de cr&eacute;ation   : 28/12/2016</span>
<span style="color: #808080;">-- Objet              : Ce script permet de lister les fichiers de donn&eacute;es (.mdf, .ndf, etc.)</span>
<span style="color: #808080;">--                      ou les fichiers de journaux de transactions (.ldf) orphelins, c.&agrave;.d. des fichiers (.mdf, .ndf, ldf , etc.)</span>
<span style="color: #808080;">--                      qui ne sont rattach&eacute;s &agrave; aucune base de donn&eacute;es du Serveur.</span>
<span style="color: #808080;">-- Param&egrave;tres :</span>
<span style="color: #808080;">--   @pi_DefaultDirectoryData : Le r&eacute;pertoire explicite des fichiers de donn&eacute;es (.mdf, ndf)  Exemple : N'C:\SQL\Data'</span>
<span style="color: #808080;">--                              Transmettez NULL pour utiliser le r&eacute;pertoire par d&eacute;faut des fichiers de donn&eacute;es d&eacute;fini au niveau de l'instance</span>
<span style="color: #808080;">--   @pi_DefaultDirectoryLog  : Le r&eacute;pertoire explicite des fichiers des journaux de transaction  (.ldf) )  Exemple : 'C:\SQL\Log'</span>
<span style="color: #808080;">--                              Transmettez NULL pour utiliser le r&eacute;pertoire par d&eacute;faut des fichiers des journaux de transactions d&eacute;fini au niveau de l'instance</span>
<span style="color: #808080;">-- Exemple d'utilisation :</span>
<span style="color: #808080;">--   EXEC dbo.uspListeFichiersDataOuLogOrphelinsDeBasesDeDonnees NULL, NULL</span>
<span style="color: #808080;">--   EXEC dbo.uspListeFichiersDataOuLogOrphelinsDeBasesDeDonnees N'C:\SQL\Data', N'C:\SQL\Log'</span>
<span style="color: #808080;">-- ----------------------------------------------------------------------------</span>
<span style="color: #0000ff;">ALTER</span> <span style="color: #0000ff;">PROCEDURE</span> dbo.uspListeFichiersDataOuLogOrphelinsDeBasesDeDonnees
<span class="br0">&#40;</span><span style="color: #339933;">@pi_DefaultDirectoryData</span> nvarchar<span class="br0">&#40;</span><span style="color: #cc66cc;">512</span><span class="br0">&#41;</span> = <span style="color: #0000ff;">NULL</span>,
 <span style="color: #339933;">@pi_DefaultDirectoryLog</span>  nvarchar<span class="br0">&#40;</span><span style="color: #cc66cc;">512</span><span class="br0">&#41;</span> = <span style="color: #0000ff;">NULL</span>  <span class="br0">&#41;</span>
<span style="color: #0000ff;">AS</span>
<span style="color: #0000ff;">BEGIN</span>
	<span style="color: #0000ff;">SET</span> NOCOUNT <span style="color: #0000ff;">ON</span>
	<span style="color: #0000ff;">DECLARE</span> <span style="color: #339933;">@MasterDirectoryData</span> nvarchar<span class="br0">&#40;</span><span style="color: #cc66cc;">512</span><span class="br0">&#41;</span>,
			<span style="color: #339933;">@MasterDirectoryLog</span> nvarchar<span class="br0">&#40;</span><span style="color: #cc66cc;">512</span><span class="br0">&#41;</span>, 
			<span style="color: #339933;">@VersionMajor</span> <span style="color: #0000ff;">tinyint</span>;
&nbsp;
	<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@VersionMajor</span> = <span style="color: #0000ff;">CAST</span><span class="br0">&#40;</span><span style="color: #0000ff;">LEFT</span><span class="br0">&#40;</span><span style="color: #0000ff;">CAST</span><span class="br0">&#40;</span>SERVERPROPERTY<span class="br0">&#40;</span><span style="color: #FF0000;">'ProductVersion'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> nvarchar<span class="br0">&#40;</span><span style="color: #cc66cc;">128</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, CHARINDEX<span class="br0">&#40;</span><span style="color: #FF0000;">'.'</span>,<span style="color: #0000ff;">CAST</span><span class="br0">&#40;</span>SERVERPROPERTY<span class="br0">&#40;</span><span style="color: #FF0000;">'ProductVersion'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> nvarchar<span class="br0">&#40;</span><span style="color: #cc66cc;">128</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> - <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: #0000ff;">INT</span><span class="br0">&#41;</span>;
	PRINT <span style="color: #FF0000;">'@VersionMajor=['</span>+<span style="color: #0000ff;">CAST</span><span class="br0">&#40;</span>ISNULL<span class="br0">&#40;</span><span style="color: #339933;">@VersionMajor</span>,-<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: #0000ff;">VARCHAR</span><span class="br0">&#40;</span><span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>+<span style="color: #FF0000;">']'</span>;
&nbsp;
	<span style="color: #0000ff;">IF</span> <span style="color: #339933;">@pi_DefaultDirectoryData</span> <span style="color: #0000ff;">IS</span> <span style="color: #0000ff;">NULL</span>
	<span style="color: #0000ff;">BEGIN</span>
		<span style="color: #808080;">-- Version SQL Server 2008 R2 (incluse) et versions ant&eacute;rieures</span>
		<span style="color: #0000ff;">IF</span> <span style="color: #339933;">@VersionMajor</span> &lt;= <span style="color: #cc66cc;">10</span>
		<span style="color: #0000ff;">BEGIN</span>
			<span style="color: #0000ff;">EXEC</span> master.dbo.xp_instance_regread N<span style="color: #FF0000;">'HKEY_LOCAL_MACHINE'</span>, N<span style="color: #FF0000;">'Software<span style="color: #800000;">\M</span>icrosoft<span style="color: #800000;">\M</span>SSQLServer<span style="color: #800000;">\M</span>SSQLServer'</span>, N<span style="color: #FF0000;">'DefaultData'</span>, <span style="color: #339933;">@pi_DefaultDirectoryData</span> <span style="color: #0000ff;">output</span>
		<span style="color: #0000ff;">END</span>
		<span style="color: #0000ff;">ELSE</span>
		<span style="color: #0000ff;">BEGIN</span>
			<span style="color: #808080;">-- Version SQL Server 2012 (incluse) et versions sup&eacute;rieures</span>
			<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@pi_DefaultDirectoryData</span> =	<span style="color: #0000ff;">CAST</span><span class="br0">&#40;</span>SERVERPROPERTY<span class="br0">&#40;</span><span style="color: #FF0000;">'INSTANCEDEFAULTDATAPATH'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> nvarchar<span class="br0">&#40;</span><span style="color: #cc66cc;">512</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		<span style="color: #0000ff;">END</span>;
		<span style="color: #0000ff;">IF</span> <span style="color: #339933;">@pi_DefaultDirectoryData</span> <span style="color: #0000ff;">IS</span> <span style="color: #0000ff;">NULL</span>
		<span style="color: #0000ff;">BEGIN</span>
			<span style="color: #0000ff;">EXEC</span> master.dbo.xp_instance_regread N<span style="color: #FF0000;">'HKEY_LOCAL_MACHINE'</span>, N<span style="color: #FF0000;">'Software<span style="color: #800000;">\M</span>icrosoft<span style="color: #800000;">\M</span>SSQLServer<span style="color: #800000;">\M</span>SSQLServer<span style="color: #800000;">\P</span>arameters'</span>, N<span style="color: #FF0000;">'SqlArg0'</span>, <span style="color: #339933;">@MasterDirectoryData</span> <span style="color: #0000ff;">output</span>
			<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@MasterDirectoryData</span> = <span style="color: #0000ff;">SUBSTRING</span><span class="br0">&#40;</span><span style="color: #339933;">@MasterDirectoryData</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">255</span><span class="br0">&#41;</span>
			<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@MasterDirectoryData</span> = <span style="color: #0000ff;">SUBSTRING</span><span class="br0">&#40;</span><span style="color: #339933;">@MasterDirectoryData</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #0000ff;">LEN</span><span class="br0">&#40;</span><span style="color: #339933;">@MasterDirectoryData</span><span class="br0">&#41;</span> - CHARINDEX<span class="br0">&#40;</span><span style="color: #FF0000;">'<span style="color: #800000;">\'</span>, REVERSE(@MasterDirectoryData)))</span>
<span style="color: #FF0000;">			SET @pi_DefaultDirectoryData = @MasterDirectoryData;</span>
<span style="color: #FF0000;">		END;</span>
<span style="color: #FF0000;">	END;</span>
&nbsp;
<span style="color: #FF0000;">	IF @pi_DefaultDirectoryLog IS NULL</span>
<span style="color: #FF0000;">	BEGIN</span>
<span style="color: #FF0000;">		-- Version SQL Server 2008 R2 (incluse) et versions ant&eacute;rieures</span>
<span style="color: #FF0000;">		IF @VersionMajor &lt;= 10</span>
<span style="color: #FF0000;">		BEGIN</span>
<span style="color: #FF0000;">			EXEC master.dbo.xp_instance_regread N'</span>HKEY_LOCAL_MACHINE<span style="color: #FF0000;">', N'</span>Software\Microsoft\MSSQLServer\MSSQLServer<span style="color: #FF0000;">', N'</span>DefaultLog<span style="color: #FF0000;">', @pi_DefaultDirectoryLog output</span>
<span style="color: #FF0000;">		END</span>
<span style="color: #FF0000;">		ELSE</span>
<span style="color: #FF0000;">		BEGIN</span>
<span style="color: #FF0000;">			-- Version SQL Server 2012 (incluse) et versions sup&eacute;rieures</span>
<span style="color: #FF0000;">			SET @pi_DefaultDirectoryLog =  CAST( SERVERPROPERTY('</span>INSTANCEDEFAULTLOGPATH<span style="color: #FF0000;">') AS nvarchar(512));</span>
<span style="color: #FF0000;">		END;</span>
&nbsp;
<span style="color: #FF0000;">		IF @pi_DefaultDirectoryLog IS NULL</span>
<span style="color: #FF0000;">		BEGIN</span>
<span style="color: #FF0000;">			EXEC master.dbo.xp_instance_regread N'</span>HKEY_LOCAL_MACHINE<span style="color: #FF0000;">', N'</span>Software\Microsoft\MSSQLServer\MSSQLServer\<span style="color: #0000ff;">Parameters</span><span style="color: #FF0000;">', N'</span>SqlArg2<span style="color: #FF0000;">', @MasterDirectoryLog output</span>
<span style="color: #FF0000;">			SET @MasterDirectoryLog = SUBSTRING(@MasterDirectoryLog, 3, 255)</span>
<span style="color: #FF0000;">			SET @MasterDirectoryLog = SUBSTRING(@MasterDirectoryLog, 1, LEN(@MasterDirectoryLog) - CHARINDEX('</span>\<span style="color: #FF0000;">', REVERSE(@MasterDirectoryLog)))</span>
<span style="color: #FF0000;">			SET @pi_DefaultDirectoryLog = @MasterDirectoryLog;</span>
<span style="color: #FF0000;">		END;</span>
<span style="color: #FF0000;">	END;</span>
&nbsp;
<span style="color: #FF0000;">	-- Recadrage &eacute;ventuel de la valeur @pi_DefaultDirectoryData</span>
<span style="color: #FF0000;">	SET @pi_DefaultDirectoryData = RTRIM(LTRIM((@pi_DefaultDirectoryData)));</span>
<span style="color: #FF0000;">	SET @pi_DefaultDirectoryData  = LEFT(@pi_DefaultDirectoryData, 2) + REPLACE (RIGHT(@pi_DefaultDirectoryData, len(@pi_DefaultDirectoryData) -2), '</span>\\<span style="color: #FF0000;">', '</span>\<span style="color: #FF0000;">');</span>
<span style="color: #FF0000;">	IF RIGHT(@pi_DefaultDirectoryData, 1) &lt;&gt; '</span>\<span style="color: #FF0000;">'</span>
<span style="color: #FF0000;">		SET @pi_DefaultDirectoryData = @pi_DefaultDirectoryData + '</span>\<span style="color: #FF0000;">';</span>
&nbsp;
<span style="color: #FF0000;">    -- Recadrage &eacute;ventuel de la valur @pi_DefaultDirectoryLog</span>
<span style="color: #FF0000;">	SET @pi_DefaultDirectoryLog = RTRIM(LTRIM(( @pi_DefaultDirectoryLog)));</span>
<span style="color: #FF0000;">	SET @pi_DefaultDirectoryLog =  LEFT(@pi_DefaultDirectoryLog, 2) + REPLACE (RIGHT(@pi_DefaultDirectoryLog, len(@pi_DefaultDirectoryLog) -2), '</span>\\<span style="color: #FF0000;">', '</span>\<span style="color: #FF0000;">');</span>
<span style="color: #FF0000;">	IF RIGHT( @pi_DefaultDirectoryLog, 1) &lt;&gt; '</span>\<span style="color: #FF0000;">'</span>
<span style="color: #FF0000;">		SET @pi_DefaultDirectoryLog = @pi_DefaultDirectoryLog + '</span>\<span style="color: #FF0000;">';</span>
&nbsp;
<span style="color: #FF0000;">	PRINT '</span><span style="color: #339933;">@pi_DefaultDirectoryData</span>=<span style="color: black;">[' +ISNULL(@pi_DefaultDirectoryData, '{NULL}') +']</span><span style="color: #FF0000;">';</span>
<span style="color: #FF0000;">	PRINT '</span><span style="color: #339933;">@pi_DefaultDirectoryLog</span>=<span style="color: black;">[' +ISNULL( @pi_DefaultDirectoryLog, '{NULL}') +']</span><span style="color: #FF0000;">';</span>
&nbsp;
<span style="color: #FF0000;">	IF OBJECT_ID('</span>tempdb.dbo.<span style="color: #808080;">#DirTreeData') IS NOT NULL</span>
		<span style="color: #0000ff;">DROP</span> <span style="color: #0000ff;">TABLE</span> <span style="color: #808080;">#DirTreeData</span>
	<span style="color: #0000ff;">IF</span> OBJECT_ID<span class="br0">&#40;</span><span style="color: #FF0000;">'tempdb.dbo.#DirTreeLog'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">IS</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>
		<span style="color: #0000ff;">DROP</span> <span style="color: #0000ff;">TABLE</span> <span style="color: #808080;">#DirTreeLog</span>
&nbsp;
	<span style="color: #808080;">-- -----------------------------------------</span>
	<span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> <span style="color: #808080;">#DirTreeData(</span>
		Id <span style="color: #0000ff;">int</span> <span style="color: #0000ff;">identity</span><span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> <span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span> CLUSTERED,
		SubDirectory nvarchar<span class="br0">&#40;</span><span style="color: #cc66cc;">255</span><span class="br0">&#41;</span>,
		Depth <span style="color: #0000ff;">smallint</span>,
		FileFlag <span style="color: #0000ff;">bit</span>,
		ParentDirectoryID <span style="color: #0000ff;">int</span>
		<span class="br0">&#41;</span>;
	<span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> <span style="color: #808080;">#DirTreeLog(</span>
		Id <span style="color: #0000ff;">int</span> <span style="color: #0000ff;">identity</span><span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> <span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span> CLUSTERED,
		SubDirectory nvarchar<span class="br0">&#40;</span><span style="color: #cc66cc;">255</span><span class="br0">&#41;</span>,
		Depth <span style="color: #0000ff;">smallint</span>,
		FileFlag <span style="color: #0000ff;">bit</span>,
		ParentDirectoryID <span style="color: #0000ff;">int</span>
		<span class="br0">&#41;</span>;
&nbsp;
	<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> <span style="color: #808080;">#DirTreeData (SubDirectory, Depth, FileFlag)</span>
	<span style="color: #0000ff;">EXEC</span> master..xp_dirtree <span style="color: #339933;">@pi_DefaultDirectoryData</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span>; <span style="color: #808080;">-- Profondeur : 1 (premier niveau), Lister &eacute;galement les fichiers : 1  (Oui)</span>
&nbsp;
	<span style="color: #0000ff;">UPDATE</span> <span style="color: #808080;">#DirTreeData</span>
		<span style="color: #0000ff;">SET</span> SubDirectory = <span style="color: #339933;">@pi_DefaultDirectoryData</span> + LTRIM<span class="br0">&#40;</span>RTRIM<span class="br0">&#40;</span>SubDirectory<span class="br0">&#41;</span><span class="br0">&#41;</span>;
&nbsp;
	<span style="color: #0000ff;">IF</span> ISNULL<span class="br0">&#40;</span><span style="color: #339933;">@pi_DefaultDirectoryLog</span>, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span> &lt;&gt; ISNULL<span class="br0">&#40;</span><span style="color: #339933;">@pi_DefaultDirectoryData</span>, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>
	<span style="color: #0000ff;">BEGIN</span>
		<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> <span style="color: #808080;">#DirTreeLog(SubDirectory, Depth, FileFlag)</span>
		<span style="color: #0000ff;">EXEC</span> master..xp_dirtree  <span style="color: #339933;">@pi_DefaultDirectoryLog</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span>; <span style="color: #808080;">-- Profondeur : 1 (premier niveau), lister &eacute;galement les fichiers : 1  (Oui)</span>
		<span style="color: #0000ff;">UPDATE</span> <span style="color: #808080;">#DirTreeLog</span>
			<span style="color: #0000ff;">SET</span> SubDirectory = <span style="color: #339933;">@pi_DefaultDirectoryLog</span> + LTRIM<span class="br0">&#40;</span>RTRIM<span class="br0">&#40;</span>SubDirectory<span class="br0">&#41;</span><span class="br0">&#41;</span>;
	<span style="color: #0000ff;">END</span>
&nbsp;
	;<span style="color: #0000ff;">WITH</span> smf <span style="color: #0000ff;">AS</span>
	  <span class="br0">&#40;</span><span style="color: #0000ff;">SELECT</span> <span style="color: #0000ff;">LEFT</span><span class="br0">&#40;</span>RTRIM<span class="br0">&#40;</span>LTRIM<span class="br0">&#40;</span>physical_name<span class="br0">&#41;</span><span class="br0">&#41;</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> + <span style="color: #0000ff;">REPLACE</span> <span class="br0">&#40;</span><span style="color: #0000ff;">RIGHT</span><span class="br0">&#40;</span>RTRIM<span class="br0">&#40;</span>LTRIM<span class="br0">&#40;</span>physical_name<span class="br0">&#41;</span><span class="br0">&#41;</span>, <span style="color: #0000ff;">len</span><span class="br0">&#40;</span>RTRIM<span class="br0">&#40;</span>LTRIM<span class="br0">&#40;</span>physical_name<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> -<span style="color: #cc66cc;">2</span><span class="br0">&#41;</span>, <span style="color: #FF0000;">'<span style="color: #800000;">\\</span>'</span>, <span style="color: #FF0000;">'<span style="color: #800000;">\'</span>) AS physical_name_fmt</span>
<span style="color: #FF0000;">       FROM master.sys.master_files WITH (NOLOCK) )</span>
&nbsp;
<span style="color: #FF0000;">	SELECT SubDirectory</span>
<span style="color: #FF0000;">	FROM #DirTreeData  dtd</span>
<span style="color: #FF0000;">	LEFT OUTER JOIN smf</span>
<span style="color: #FF0000;">	   ON smf.physical_name_fmt = dtd.SubDirectory</span>
<span style="color: #FF0000;">	WHERE dtd.FileFlag = 1            -- Fichiers uniquement (ignorer les r&eacute;pertoires)</span>
<span style="color: #FF0000;">	AND smf.physical_name_fmt IS NULL -- Pas de correspondance du fichier SubDirectory dans master.sys.master_files</span>
<span style="color: #FF0000;">	UNION ALL</span>
<span style="color: #FF0000;">	SELECT SubDirectory</span>
<span style="color: #FF0000;">	FROM #DirTreeLog dtl</span>
<span style="color: #FF0000;">	LEFT OUTER JOIN smf</span>
<span style="color: #FF0000;">	   ON smf.physical_name_fmt = dtl.SubDirectory</span>
<span style="color: #FF0000;">	WHERE dtl.FileFlag = 1            -- Fichier uniquement (ignorer les r&eacute;pertoires)</span>
<span style="color: #FF0000;">	AND smf.physical_name_fmt IS NULL --  Pas de correspondance du fichier SubDirectory dans master.sys.master_files</span>
<span style="color: #FF0000;">	ORDER BY SubDirectory; </span>
&nbsp;
<span style="color: #FF0000;">	-- Suppression des tables temporaires </span>
<span style="color: #FF0000;">	IF OBJECT_ID('</span>tempdb.dbo.<span style="color: #808080;">#DirTreeData') IS NOT NULL</span>
		<span style="color: #0000ff;">DROP</span> <span style="color: #0000ff;">TABLE</span> <span style="color: #808080;">#DirTreeData</span>
	<span style="color: #0000ff;">IF</span> OBJECT_ID<span class="br0">&#40;</span><span style="color: #FF0000;">'tempdb.dbo.#DirTreeLog'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">IS</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>
		<span style="color: #0000ff;">DROP</span> <span style="color: #0000ff;">TABLE</span> <span style="color: #808080;">#DirTreeLog</span>
<span style="color: #0000ff;">END</span>;
<span style="color: #0000ff;">GO</span></pre></td></tr></table></pre>
</div><br />
<b>III – Exemple d’utilisation </b><br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">EXEC</span> dbo.uspListeFichiersDataOuLogOrphelinsDeBasesDeDonnees <span style="color: #0000ff;">NULL</span>, <span style="color: #0000ff;">NULL</span></pre>
</div><br />
Résultat : ( deux fichiers orphelins ) : <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">SubDirectory
----------------------------------------------------------------------------------------
C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER2014\MSSQL\DATA\DEMO001_Data.mdf
C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER2014\MSSQL\DATA\DEMO001_Log.ldf</pre></td></tr></table></pre>
</div>A+ <br />
<br />
Hamid MIRA</blockquote>

]]></content:encoded>
			<dc:creator>hmira</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/24310-hmira/b1872/sql-server-lister-fichiers-donnees-mdf-ndf-log-ldf-orphelins/</guid>
		</item>
		<item>
			<title>SQL Server - Connexion Administrateur Dédiée DAC</title>
			<link>https://www.developpez.net/forums/blogs/24310-hmira/b1536/sql-server-connexion-administrateur-dediee-dac/</link>
			<pubDate>Wed, 20 Jul 2016 13:16:52 GMT</pubDate>
			<description>*I - Préambule* 
 
Dans les...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><b><font size="3">I - Préambule</font></b><br />
<br />
Dans les situations critiques, extrêmes, lorsque, pour diverses raisons, par exemple un manque total de ressources disponibles, les connexions standards au Serveur deviennent impossibles, le <b>DAC</b> (<b>D</b>edicated <b>A</b>dministrator <b>C</b>onnection) ou en français, plus clair, Connexion Administrateur Dédiée, prend toute son importance et devient un élément vital pour l’administrateur de bases de données.<br />
<br />
Malheureusement, il n’est pas rare, que certains administrateurs, négligent l’importance du DAC, voire ignorent complètement son existence et ses fonctionnalités&nbsp;!<br />
<br />
Dans les circonstances critiques, le DAC devient parfois la seule connexion permettant aux administrateurs de bases de données d'accéder à SQL Server pour exécuter des requêtes de diagnostic ainsi que d’autres requêtes de dépannage, comme mettre fin à une connexion gênante, bloquante. Dans ces circonstances critiques, le but ultime est de résoudre les problèmes et de débloquer la situation le plus rapidement possible. <br />
<br />
Un autre point aussi important et crucial concernant le DAC, est d’autoriser les connexions à distance à utiliser la connexion administrateur dédiée (DAC). En effet, par défaut, cette connexion (DAC) n'est disponible qu'à partir d'un client sur le serveur lui-même (IP&nbsp;: 127.0.0.1), et comme dans les situations critiques, il y a de fortes chances qu’un accès TSE au Serveur devienne lui aussi impossible&nbsp;! Il est primordial d’être prévoyant et d’anticiper les problèmes, et ce, en autorisant, bien avant, lorsque tout fonctionne normalement, les connexions à distance d’utiliser le DAC. Parce qu’en cas de problème grave, lorsque la situation devient critique, il y a de fortes chances, que vous ne puissiez plus le faire, vous seriez peut-être même dans l’impossibilité d’accéder au serveur&nbsp;! C’est donc pour apporter une solution à ces situations critiques particulières que le DAC existe.<br />
<br />
<font size="3"><b>II - Autoriser les connexions à distance à utiliser la connexion administrateur dédiée (DAC)<br />
</b></font><br />
<br />
Pour activer le DAC pour les connexions à distance, il suffit d’exécuter le bloc de code T-SQL ci-dessous&nbsp;: <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">EXEC</span> sp_configure <span style="color: #FF0000;">'remote admin connections'</span>, <span style="color: #cc66cc;">1</span>;
<span style="color: #0000ff;">GO</span>
RECONFIGURE
<span style="color: #0000ff;">GO</span></pre></td></tr></table></pre>
</div><br />
Remarque <br />
- Une fois que vous aurez exécuté la commande ci-dessus, je vous suggère de consulter le journal des erreurs de SQL Server, vous verrez des messages d’informations comme ceux indiqués dans l’exemple ci-dessous&nbsp;: <br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=215910&amp;d=1469015824" border="0" alt="Nom : SQLServer_DAC_10_LogRemotePort.png
Affichages : 8862
Taille : 11,2 Ko"  style="float: CONFIG" /><br />
<br />
- Vous remarquerez que SQL Server, pour la connexion administrateur dédié (DAC), écoute désormais sur un nouveau port dédié, dans notre exemple il s’agit du port n° 61148. Ce numéro de port est attribué dynamiquement par SQL Server. À ce stade, l'écouteur DAC est donc activé, et ce, sans nécessiter un redémarrage de SQL Server. <br />
<br />
- La connaissance de ce n° de port d’écoute des connexions DAC à distance, dans notre exemple n° 61148, n’est pas indispensable pour établir une connexion DAC. Nous verrons plus loin comment établir une connexion DAC sans préciser le numéro de port. <br />
<br />
<b><font size="3">III - Comment utiliser la connexion administrateur dédiée (DAC)</font></b><br />
<br />
Vous pouvez utiliser le DAC soit depuis <b>SSMS</b>, soit depuis l’outil en ligne de commande <b>sqlcmd</b> <br />
Notez que, quel que soit le moyen que vous utiliseriez pour la connexion DAC, une et une seule connexion DAC est autorisée par instance. Donc une connexion DAC doit d’abord être terminée (disconnect) pour permettre à une autre connexion d’utiliser le DAC. <br />
<br />
<b><font size="2">III-1 Utiliser le DAC depuis SSMS</font></b><br />
<br />
Comme cela a été rappelé ci-dessus, une et une seule connexion peut utiliser le DAC. Évitez donc d’utiliser une connexion DAC pour l’explorateur d’objets sous SSMS. Sinon, vous ne pourrez plus ouvrir une nouvelle connexion DAC pour diagnostiquer et corriger les problèmes&nbsp;! <br />
<br />
Sous SSMS procédez comme suit&nbsp;: <br />
<br />
- sélectionnez le menu&nbsp;: <br />
 Fichier &gt; Nouveau &gt; Requête de moteur de base de données&nbsp;;<br />
- dans la boite de dialogue connexion, préfixez juste le nom du Serveur par&nbsp;:  <b>ADMIN:</b>   (le mot ADMIN suivi du signe ':' ). Les autres informations de connexion restent inchangées. <br />
<br />
Exemple&nbsp;: <br />
Nom du Serveur&nbsp;: ADMIN:SRV005\SQL2012<br />
Authentification&nbsp;: Authentification SQL Server <br />
Connexion&nbsp;: FriedrichNietzsche<br />
Mot de passe&nbsp;: ******* <br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=215909&amp;d=1469015343" border="0" alt="Nom : SQLServer_DAC_20_SSMSAdminConn.png
Affichages : 6113
Taille : 24,7 Ko"  style="float: CONFIG" /><br />
<br />
Remarque&nbsp;: en cas d’erreur, effectuez les vérifications décrites dans le paragraphe, plus loin dans cet article, <br />
«&nbsp;IV - Vérifier les autres prérequis pour le DAC&nbsp;»<br />
<br />
<b><font size="2">III-2 Utiliser le DAC en ligne de commande depuis sqlcmd </font></b><br />
<br />
Vous pouvez aussi établir une connexion DAC en utilisant l’outil sqlcmd en ligne de commande.  Il suffit pour cela de spécifier le drapeau <b>-A</b><br />
<br />
Exemple&nbsp;: <br />
<br />
&gt;sqlcmd  -SSRV005\SQL2012 –E <b>–A</b><br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=215911&amp;d=1469016777" border="0" alt="Nom : SQLServer_DAC_30_SqlcmdAdminConn.png
Affichages : 5643
Taille : 7,2 Ko"  style="float: CONFIG" /><br />
<br />
Vous pouvez par exemple mettre fin à une session que vous auriez identifiée comme «&nbsp;gênante&nbsp;». <br />
<br />
&gt; kill 54&nbsp;; <br />
&gt; Go <br />
<br />
Ci-dessous un exemple complet d’utilisation&nbsp;:<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQLCMD :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br /></div></td><td valign="top"><pre style="margin: 0">c:\Windows\system32&gt;sqlcmd -S SSRV005\SQL2012 -E -A
1&gt; SELECT CASE
2&gt;      WHEN exs.session_id= @@SPID THEN 'C''est moi-même ! '
3&gt;      ELSE ''
4&gt;     END + coalesce(exs.login_name,'Je ne sais qui ?') as ConnexionDAC
5&gt; , exs.session_id
6&gt; , exs.login_time
7&gt; , exs.status
8&gt; , exs.original_login_name
9&gt; from sys.endpoints as edp with (nolock)
10&gt; join sys.dm_exec_sessions exs with (nolock)
11&gt; on edp.endpoint_id = exs.endpoint_id
12&gt; where edp.name='Dedicated Admin Connection';
13&gt; go
ConnexionDAC
                                 session_id log
in_time       status             original_login_name


--------------------------------------------------------------------------------
----------------------------------------------------------------- ---------- ---
-------------------- ------------------------------ ----------------------------
--------------------------------------------------------------------------------
--------------------
C'est moi-même ! FriedrichNietzsche
                                     51 201
6-07-20 10:08:31.003 running            FriedrichNietzsche



(1 lignes affectées)
1&gt; kill 54;
2&gt; go
1&gt; exit
c:\Windows\system32&gt;</pre></td></tr></table></pre>
</div><br />
Remarque&nbsp;: en cas d’erreur, effectuez les vérifications décrites dans le paragraphe, plus loin dans cet article, <br />
«&nbsp;IV - Vérifier les autres prérequis pour le DAC&nbsp;»<br />
<br />
<b><font size="3">IV - Vérifier les autres prérequis pour le DAC</font></b><br />
<br />
Parmi les prérequis pour le bon fonctionnement des connexions DAC, je cite au moins quatre points importants&nbsp;: <br />
<br />
<b>1</b> - la connexion utilisée pour le DAC doit être membre du rôle fixe du Serveur sysadmin&nbsp;;<br />
<br />
<b>2</b> - le service SQL Server Browser doit être démarré. Assurez-vous donc que le service SQL Server Browser, celui du Serveur, est en cours d’exécution, et le cas échant, s’il est arrêté, lancez-le. <br />
<br />
Si le Service SQL Server Browser est arrêté, toute tentative de connexion administrateur dédié (DAC) est vouée à l’échec, et générera une erreur tel qu’indiqué dans la copie-écran ci-dessous&nbsp;: <br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=215917&amp;d=1469018836" border="0" alt="Nom : SQLServer_DAC_40_ErrSQLBrowser.png
Affichages : 5890
Taille : 26,8 Ko"  style="float: CONFIG" /><br />
<br />
<b>3</b> - vérifiez qu’il n’y a pas une autre connexion DAC en cours. En effet, comme mentionné ci-dessus, pour une instance donnée, une et une seule connexion DAC peut être établie. Si une connexion DAC est déjà établie par quelqu’un d’autre, toute tentative d’une deuxième connexion DAC est vouée à l’échec. Vous obtiendrez un message d’erreur, pas très explicite&nbsp;! Comme le montre la copie-écran ci-dessous&nbsp;: <br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=215918&amp;d=1469018897" border="0" alt="Nom : SQLServer_DAC_50_ErrDACAlreadyExists.png
Affichages : 7169
Taille : 23,7 Ko"  style="float: CONFIG" /><br />
<br />
Pour connaitre quelle connexion utilise actuellement le DAC, vous pouvez vous servir de la requête SQL ci-dessous. Elle permet d’afficher le numéro de session (Session_id)  utilisant le DAC. Si aucune session n’utilise le DAC la requête ne retourne aucune ligne. <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:180px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> <span style="color: #0000ff;">CASE</span> 
     <span style="color: #0000ff;">WHEN</span> exs.session_id= <span style="color: #339933;">@@SPID</span> <span style="color: #0000ff;">THEN</span> <span style="color: #FF0000;">'C'</span><span style="color: #FF0000;">'est moi-m&ecirc;me ! '</span>
     <span style="color: #0000ff;">ELSE</span> <span style="color: #FF0000;">''</span> 
	  <span style="color: #0000ff;">END</span> + coalesce<span class="br0">&#40;</span>exs.login_name,<span style="color: #FF0000;">'Je ne sais qui ?'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> ConnexionDAC
, exs.session_id
, exs.login_time
, exs.<span style="color: #0000ff;">status</span>
, exs.original_login_name 
<span style="color: #0000ff;">from</span> sys.endpoints <span style="color: #0000ff;">as</span> edp <span style="color: #0000ff;">with</span> <span class="br0">&#40;</span>nolock<span class="br0">&#41;</span> 
<span style="color: #0000ff;">join</span> sys.dm_exec_sessions exs <span style="color: #0000ff;">with</span> <span class="br0">&#40;</span>nolock<span class="br0">&#41;</span> 
<span style="color: #0000ff;">on</span> edp.endpoint_id = exs.endpoint_id
<span style="color: #0000ff;">where</span> edp.name=<span style="color: #FF0000;">'Dedicated Admin Connection'</span></pre></td></tr></table></pre>
</div><br />
<b>4</b> - il n'y a que peu de restrictions sur les instructions SQL qui peuvent être exécutées au travers une connexion DAC. Par exemple, vous ne pourrez pas exécuter des requêtes parallélisées ou certaines commandes, comme BACKUP ou RESTORE en utilisant le DAC. N’oubliez pas qu’il est par ailleurs fortement recommandé, sous une connexion DAC, de ne pas exécuter des requêtes gourmandes en ressources qui pourraient aggraver le problème qui vous a amené à utiliser le DAC. La connexion DAC doit être réservée principalement pour le dépannage et le diagnostic. <br />
<br />
Remarque <br />
<br />
- Notez enfin que la mise en œuvre des connexions DAC ne nécessite aucun redémarrage de l‘instance SQL Server.<br />
<br />
- La connexion DAC n’est toutefois pas garantie à 100&nbsp;% pour être toujours utilisable, mais comme le DAC utilise de la mémoire qui lui est proprement réservée, et est doté d’un planificateur (scheduler) privé et implémenté comme un nœud séparé, etc. votre connexion DAC a de très grandes chances d’aboutir alors même que les connexions standard, classiques, deviennent impossibles. <br />
<br />
A+ <br />
<br />
Hamid MIRA</blockquote>

]]></content:encoded>
			<dc:creator>hmira</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/24310-hmira/b1536/sql-server-connexion-administrateur-dediee-dac/</guid>
		</item>
		<item>
			<title>SQL Server - Fonction scalaire T-SQL contrôle numéro SIREN ou SIRET</title>
			<link>https://www.developpez.net/forums/blogs/24310-hmira/b1035/sql-server-fonction-scalaire-t-sql-controle-numero-siren-siret/</link>
			<pubDate>Sun, 17 Jan 2016 15:49:03 GMT</pubDate>
			<description>Je vous présente ci-dessous,...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Je vous présente ci-dessous, une fonction scalaire SQL Server T-SQL, permettant de vérifier au niveau Serveur de base de données si des identifiants <b>SIREN</b> (9 chiffres) ou <b>SIRET</b> (14 chiffres) sont valides ou non. <br />
<br />
Cette fonction s'inspire fortement de l'implémentation en T-SQL de l'algorithme de Luhn réalisée par SQLPro. <br />
voir lien ci-dessous pour plus de détails : <br />
  <a href="http://blog.developpez.com/sqlpro/p7829/langage-sql-norme/controle_de_coherence_par_algorithme_de_" target="_blank">http://blog.developpez.com/sqlpro/p7...algorithme_de_</a> <br />
<br />
L’algorithme de Luhn est utilisé pour le contrôle des identifiants SIREN ou SIRET dans le cas général, autres que La Poste et ses établissements, <br />
<br />
Cette fonction implémente et tient compte également de l'algorithme particulier pour la vérification des identifiants SIREN ou SIRET de La Poste, et ce, depuis que La Poste a changé de statut et qu'elle est devenue une société anonyme. <br />
La Poste est désormais dotée d'un seul SIREN : <b>356000000</b> et d'établissements SIRET : <b>356000000<font color="#0000CD">xxxxx</font></b> <br />
<br />
Ce nouvel algorithme de contrôle des identifiants SIREN ou SIRET, spécifique à La Poste, permet d'immatriculer jusqu'à 18000 établissements environ. Pour plus de détails : <br />
<a href="http://blog.pagesd.info/post/2012/09/05/verifier-numero-siret-la-poste" target="_blank">http://blog.pagesd.info/post/2012/09...siret-la-poste</a> <br />
<br />
Voilà, le but est juste de partager cette fonction avec la communauté. Cette fonction pourra ainsi être utile à d'autres ou servir de base pour le développement d'autres fonctions de contrôle plus spécifiques.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">IF</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">EXISTS</span> <span class="br0">&#40;</span><span style="color: #0000ff;">SELECT</span> *
           <span style="color: #0000ff;">FROM</span> dbo.sysobjects
           <span style="color: #0000ff;">WHERE</span> id = object_id<span class="br0">&#40;</span>N<span style="color: #FF0000;">'dbo.FC_U_IsValidSiret'</span><span class="br0">&#41;</span>
           <span style="color: #0000ff;">AND</span> xtype <span style="color: #0000ff;">IN</span> <span class="br0">&#40;</span>N<span style="color: #FF0000;">'FN'</span>, N<span style="color: #FF0000;">'IF'</span>, N<span style="color: #FF0000;">'TF'</span><span class="br0">&#41;</span>
           <span class="br0">&#41;</span>
   <span style="color: #0000ff;">EXEC</span>   sp_executesql N<span style="color: #FF0000;">'CREATE FUNCTION dbo.FC_U_IsValidSiret</span>
<span style="color: #FF0000;">( @pi_cSIRET VARCHAR(14) )</span>
<span style="color: #FF0000;">RETURNS BIT</span>
<span style="color: #FF0000;">AS</span>
<span style="color: #FF0000;">BEGIN </span>
<span style="color: #FF0000;">RETURN NULL; </span>
<span style="color: #FF0000;">END; '</span> 
<span style="color: #0000ff;">GO</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">ALTER</span>  <span style="color: #0000ff;">FUNCTION</span> dbo.FC_U_IsValidSiret
<span class="br0">&#40;</span> <span style="color: #339933;">@pi_cSIRET</span> <span style="color: #0000ff;">VARCHAR</span><span class="br0">&#40;</span><span style="color: #cc66cc;">14</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>
<span style="color: #0000ff;">RETURNS</span> <span style="color: #0000ff;">BIT</span>
<span style="color: #0000ff;">AS</span>
<span style="color: #808080;">/* ===========================================================================*/</span>
<span style="color: #808080;">/*                          dbo.FC_U_IsValidSiret                             */</span>
<span style="color: #808080;">/* ===========================================================================*/</span>
<span style="color: #808080;">/* Soci&eacute;t&eacute;            :                                                       */</span>
<span style="color: #808080;">/* Cr&eacute;ateur           : Hamid MIRA                                            */</span>
<span style="color: #808080;">/* Date de cr&eacute;ation   : 17/01/2016                                            */</span>
<span style="color: #808080;">/* Version associ&eacute;e   : 1                                                     */</span>
<span style="color: #808080;">/* Objet              :                                                       */</span>
<span style="color: #808080;">/*   - Cette fonction scalaire SQL Server, permet de v&eacute;rifier si un code SIREN (9 chiffes) */</span>
<span style="color: #808080;">/*   ou SIRET (14 chiffres) est valide ou non.                                             */</span>
<span style="color: #808080;">/*   - Cette fonction s'inspire fortement de l'impl&eacute;mentation en T-SQL de l'algorithme     */</span>
<span style="color: #808080;">/*     de Luhn r&eacute;alis&eacute;e par SQLPro. voir lien ci-dessous pour plus de d&eacute;tails :            */</span>
<span style="color: #808080;">/*     http://blog.developpez.com/sqlpro/p7829/langage-sql-norme/controle_de_coherence_par_algorithme_de_ */</span>
<span style="color: #808080;">/*   - Cette fonction tient compte &eacute;galement de l'algorithme particulier de La Poste */</span>
<span style="color: #808080;">/*     depuis qu'elle a chang&eacute; de statut et qu'elle est devenue une soci&eacute;t&eacute; anonyme */</span>
<span style="color: #808080;">/*     dot&eacute;e d'un seul SIREN : 356000000 et des &eacute;tablissement SIRET : 356000000xxxxx */</span>
<span style="color: #808080;">/*     Ce nouvel algorithme sp&eacute;cifique &agrave; La Poste permet d'immatriculer jusqu'&agrave; 18000 &eacute;tablissements environ */</span>
<span style="color: #808080;">/*     Pour plus de d&eacute;tails : http://blog.pagesd.info/post/2012/09/05/verifier-numero-siret-la-poste */</span>
<span style="color: #808080;">/* Appel&eacute;e par        :                                                              */</span>
<span style="color: #808080;">/*                                                                                   */</span>
<span style="color: #808080;">/* Param&egrave;tres : @pi_cSIRET VARCHAR(14)  Code SIREN ou SIRET &agrave; v&eacute;rifier la validit&eacute;   */</span>
<span style="color: #808080;">/*				Valeur de retour de la fonction (BIT) :                              */</span>
<span style="color: #808080;">/*                   1 si le code SIREN ou SIRET est un code Valide                  */</span>
<span style="color: #808080;">/*                   0 si le code SIREN ou SIRET n'est pas un code valide            */</span>
<span style="color: #808080;">/* ===========================================================================*/</span>
<span style="color: #0000ff;">BEGIN</span>
	<span style="color: #808080;">-- Valeurs limites</span>
	<span style="color: #0000ff;">IF</span> <span style="color: #339933;">@pi_cSIRET</span> <span style="color: #0000ff;">IS</span> <span style="color: #0000ff;">NULL</span> <span style="color: #0000ff;">OR</span> <span style="color: #339933;">@pi_cSIRET</span> = <span style="color: #FF0000;">''</span>
	<span style="color: #0000ff;">BEGIN</span>
		<span style="color: #0000ff;">RETURN</span> <span style="color: #0000ff;">NULL</span>;
	<span style="color: #0000ff;">END</span>;
	<span style="color: #0000ff;">DECLARE</span>
	  <span style="color: #339933;">@iLengthSiret</span> <span style="color: #0000ff;">SMALLINT</span>;
&nbsp;
	<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@iLengthSiret</span> = <span style="color: #0000ff;">LEN</span><span class="br0">&#40;</span><span style="color: #339933;">@pi_cSIRET</span><span class="br0">&#41;</span>;
	<span style="color: #0000ff;">IF</span> <span style="color: #339933;">@iLengthSiret</span> &lt;&gt; <span style="color: #cc66cc;">9</span> <span style="color: #0000ff;">AND</span> <span style="color: #339933;">@iLengthSiret</span> &lt;&gt; <span style="color: #cc66cc;">14</span>
	<span style="color: #0000ff;">BEGIN</span>
		<span style="color: #0000ff;">RETURN</span> <span style="color: #cc66cc;">0</span>;  <span style="color: #808080;">-- c.&agrave;.d. False</span>
	<span style="color: #0000ff;">END</span>;
&nbsp;
	<span style="color: #0000ff;">DECLARE</span>
	  <span style="color: #339933;">@I</span>              <span style="color: #0000ff;">TINYINT</span>
	, <span style="color: #339933;">@cChiffre</span>       <span style="color: #0000ff;">CHAR</span><span class="br0">&#40;</span><span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>
	, <span style="color: #339933;">@iSumNombres</span>    <span style="color: #0000ff;">TINYINT</span>
	, <span style="color: #339933;">@iRang</span>          <span style="color: #0000ff;">TINYINT</span>
	, <span style="color: #339933;">@bIsSiretLaPoste</span> <span style="color: #0000ff;">BIT</span>;
&nbsp;
	<span style="color: #0000ff;">DECLARE</span>
	  <span style="color: #339933;">@TableChiffre</span> <span style="color: #0000ff;">TABLE</span>
	<span class="br0">&#40;</span> iRang   <span style="color: #0000ff;">SMALLINT</span>
	, iNombre <span style="color: #0000ff;">SMALLINT</span> <span class="br0">&#41;</span>;
&nbsp;
	<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@bIsSiretLaPoste</span> = <span style="color: #0000ff;">CASE</span>
							  <span style="color: #0000ff;">WHEN</span> <span style="color: #0000ff;">LEFT</span><span class="br0">&#40;</span><span style="color: #339933;">@pi_cSIRET</span>, <span style="color: #cc66cc;">9</span><span class="br0">&#41;</span> = <span style="color: #FF0000;">'356000000'</span> <span style="color: #0000ff;">AND</span> <span style="color: #339933;">@iLengthSiret</span> = <span style="color: #cc66cc;">14</span>
								<span style="color: #0000ff;">THEN</span> <span style="color: #cc66cc;">1</span>
							  <span style="color: #0000ff;">ELSE</span> <span style="color: #cc66cc;">0</span>
						  <span style="color: #0000ff;">END</span>;
	<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@I</span> = <span style="color: #339933;">@iLengthSiret</span>;
	<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@iRang</span> = <span style="color: #cc66cc;">0</span>;
	<span style="color: #0000ff;">WHILE</span> <span style="color: #339933;">@I</span> &gt;= <span style="color: #cc66cc;">1</span>
	<span style="color: #0000ff;">BEGIN</span>
		<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@iRang</span> = <span style="color: #339933;">@iRang</span>+<span style="color: #cc66cc;">1</span>;
		<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@cChiffre</span> = <span style="color: #0000ff;">SUBSTRING</span><span class="br0">&#40;</span><span style="color: #339933;">@pi_cSIRET</span>, <span style="color: #339933;">@I</span>, <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;
&nbsp;
		<span style="color: #808080;">-- V&eacute;rification que la chaine ne contient que des chiffres</span>
		<span style="color: #0000ff;">IF</span> <span style="color: #339933;">@cChiffre</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">BETWEEN</span> <span style="color: #FF0000;">'0'</span> <span style="color: #0000ff;">AND</span> <span style="color: #FF0000;">'9'</span>
		<span style="color: #0000ff;">BEGIN</span>
			<span style="color: #0000ff;">RETURN</span> <span style="color: #cc66cc;">0</span>;
		<span style="color: #0000ff;">END</span>;
		<span style="color: #0000ff;">ELSE</span>
		<span style="color: #0000ff;">BEGIN</span>
			<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> <span style="color: #339933;">@TableChiffre</span><span class="br0">&#40;</span>
			   iRang
			 , iNombre<span class="br0">&#41;</span>
			<span style="color: #0000ff;">VALUES</span>
			<span class="br0">&#40;</span>
			  <span style="color: #339933;">@iRang</span>
			, <span style="color: #0000ff;">CAST</span><span class="br0">&#40;</span><span style="color: #339933;">@cChiffre</span> <span style="color: #0000ff;">AS</span> <span style="color: #0000ff;">SMALLINT</span><span class="br0">&#41;</span>
			<span class="br0">&#41;</span>;
		<span style="color: #0000ff;">END</span>;
		<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@I</span> = <span style="color: #339933;">@I</span>-<span style="color: #cc66cc;">1</span>;
	<span style="color: #0000ff;">END</span>;
	<span style="color: #808080;">--  Cas g&eacute;n&eacute;ral (autre que La Poste)</span>
	<span style="color: #0000ff;">IF</span> <span style="color: #339933;">@bIsSiretLaPoste</span> = <span style="color: #cc66cc;">0</span>
	<span style="color: #0000ff;">BEGIN</span>
		<span style="color: #808080;">-- Multiplication par deux des chiffres de rang paire</span>
		<span style="color: #0000ff;">UPDATE</span> <span style="color: #339933;">@TableChiffre</span>
		  <span style="color: #0000ff;">SET</span>
			  iNombre = iNombre*<span style="color: #cc66cc;">2</span>
		<span style="color: #0000ff;">WHERE</span>
		   iRang%<span style="color: #cc66cc;">2</span> = <span style="color: #cc66cc;">0</span>;
		<span style="color: #808080;">-- Addition des chiffres pour les nombres strictement sup&eacute;rieur &agrave; 9</span>
		<span style="color: #0000ff;">UPDATE</span> <span style="color: #339933;">@TableChiffre</span>
		  <span style="color: #0000ff;">SET</span>
			  iNombre = iNombre-<span style="color: #cc66cc;">9</span>
		<span style="color: #0000ff;">WHERE</span>
		   iNombre &gt; <span style="color: #cc66cc;">9</span>;
	<span style="color: #0000ff;">END</span>;
	<span style="color: #808080;">-- Calcul du total des nombres de la table @TableChiffre</span>
	<span style="color: #0000ff;">SET</span> <span style="color: #339933;">@iSumNombres</span> = <span class="br0">&#40;</span> <span style="color: #0000ff;">SELECT</span>
							<span style="color: #0000ff;">SUM</span><span class="br0">&#40;</span>iNombre<span class="br0">&#41;</span>
						 <span style="color: #0000ff;">FROM</span> <span style="color: #339933;">@TableChiffre</span>
					   <span class="br0">&#41;</span>;
	<span style="color: #0000ff;">RETURN</span> <span style="color: #0000ff;">CASE</span>
		   <span style="color: #808080;">--  Cas g&eacute;n&eacute;ral (autre que La Poste)</span>
			   <span style="color: #0000ff;">WHEN</span> <span style="color: #339933;">@bIsSiretLaPoste</span> = <span style="color: #cc66cc;">0</span>
				 <span style="color: #0000ff;">THEN</span> <span style="color: #0000ff;">CASE</span>
						  <span style="color: #0000ff;">WHEN</span> <span style="color: #339933;">@iSumNombres</span>%<span style="color: #cc66cc;">10</span> = <span style="color: #cc66cc;">0</span>
							<span style="color: #0000ff;">THEN</span> <span style="color: #cc66cc;">1</span>
						  <span style="color: #0000ff;">ELSE</span> <span style="color: #cc66cc;">0</span>
					  <span style="color: #0000ff;">END</span>
			   <span style="color: #0000ff;">ELSE</span>
		   <span style="color: #808080;">-- Case particulier de La Poste</span>
		   <span style="color: #0000ff;">CASE</span>
			   <span style="color: #0000ff;">WHEN</span> <span style="color: #339933;">@iSumNombres</span>%<span style="color: #cc66cc;">5</span> = <span style="color: #cc66cc;">0</span>
				 <span style="color: #0000ff;">THEN</span> <span style="color: #cc66cc;">1</span>
			   <span style="color: #0000ff;">ELSE</span> <span style="color: #cc66cc;">0</span>
		   <span style="color: #0000ff;">END</span>
		   <span style="color: #0000ff;">END</span>;
<span style="color: #0000ff;">END</span>;
<span style="color: #0000ff;">GO</span></pre></td></tr></table></pre>
</div><br />
Exemple d'utilisation  <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span>  <span style="color: #FF0000;">'73282932000074'</span> <span style="color: #0000ff;">AS</span> SIRET, dbo.FC_U_IsValidSiret<span class="br0">&#40;</span><span style="color: #FF0000;">'73282932000074'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> IsValid <span style="color: #808080;">-- Code valide </span>
<span style="color: #0000ff;">UNION</span>  <span style="color: #0000ff;">ALL</span> 
<span style="color: #0000ff;">SELECT</span> <span style="color: #FF0000;">'732829320'</span>,  dbo.FC_U_IsValidSiret<span class="br0">&#40;</span><span style="color: #FF0000;">'732829320'</span><span class="br0">&#41;</span> <span style="color: #808080;">-- Code valide </span>
<span style="color: #0000ff;">UNION</span> <span style="color: #0000ff;">ALL</span> 
<span style="color: #0000ff;">SELECT</span> 	<span style="color: #FF0000;">'356000000'</span>,  dbo.FC_U_IsValidSiret<span class="br0">&#40;</span><span style="color: #FF0000;">'356000000'</span><span class="br0">&#41;</span>  <span style="color: #808080;">-- Code valide : La Poste </span>
<span style="color: #0000ff;">UNION</span> <span style="color: #0000ff;">ALL</span> 
<span style="color: #0000ff;">SELECT</span> 	<span style="color: #FF0000;">'35600000066180'</span>,  dbo.FC_U_IsValidSiret<span class="br0">&#40;</span><span style="color: #FF0000;">'35600000066180'</span><span class="br0">&#41;</span>  <span style="color: #808080;">-- Code valide : Un &eacute;tablissement de La Poste  </span>
<span style="color: #0000ff;">UNION</span> <span style="color: #0000ff;">ALL</span> 
<span style="color: #0000ff;">SELECT</span> <span style="color: #FF0000;">'39244740402112'</span>,  dbo.FC_U_IsValidSiret<span class="br0">&#40;</span><span style="color: #FF0000;">'39244740402112'</span><span class="br0">&#41;</span> <span style="color: #808080;">-- Code invalide !</span></pre></td></tr></table></pre>
</div>Résultat : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code 'SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">SIRET	IsValid
73282932000074	1
732829320	1
356000000	1
35600000066180	1
39244740402112	0</pre></td></tr></table></pre>
</div><br />
A+ <br />
Hamid MIRA</blockquote>

]]></content:encoded>
			<dc:creator>hmira</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/24310-hmira/b1035/sql-server-fonction-scalaire-t-sql-controle-numero-siren-siret/</guid>
		</item>
		<item>
			<title>SQL Server - Gestion des exceptions TRY .. CATCH Rendre une application plus robuste</title>
			<link>https://www.developpez.net/forums/blogs/24310-hmira/b135/sql-server-gestion-exceptions-try-catch-rendre-application-plus-robuste/</link>
			<pubDate>Sun, 04 Jan 2015 13:41:55 GMT</pubDate>
			<description>*I - Introduction * 
 
Depuis...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><b><font size="2">I - Introduction</font> </b><br />
<br />
Depuis SQL Server 2005, (et donc tout ce qui suit est valable également sous SQL Server 2008, 2008R2, 2012, 2014 etc.), il est enfin possible de gérer sérieusement les exceptions au travers les constructions <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">TRY CATCH</span>.<br />
<br />
La gestion des erreurs dans les versions précédentes, sous SQL Server 2000 par exemple, n'était pas vraiment à la hauteur et n'était pas digne d'un langage évolué moderne.<br />
<br />
Sous SQL Server 2000, la détection et la gestion des erreurs déclenchées par les commandes T-SQL ne pouvaient être effectuée qu'en vérifiant le contenu de la variable système globale <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">@@error</span>. Celle-ci retourne le numéro d'erreur déclenchée par la dernière instruction T-SQL exécutée. Donc, sous SQL Server 2000, Il fallait lire le contenu de la variable <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">@@error</span> après chaque instruction T-SQL ! Il faillait, en plus, généralement, stocker le contenu de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">@@error</span> dans une variable locale ! En effet, la variable globale <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">@@error</span> est effacée et réinitialisée (remise à zéro) à chaque exécution d'une instruction. Cette approche complètement archaïque conduisait à surcharger le code T-SQL des procédures par des instructions comme <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">IF @@error &lt;&gt; 0 ..</span> jusqu'à le rendre illisible !<br />
<br />
La construction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">TRY ..CATCH</span>disponible depuis la version SQL Server 2005 (et donc valable également sous SQL Server 2008, 2008R2, 2012, 2014 etc.), offre une syntaxe beaucoup plus lisible, avec laquelle les développeurs sont déjà habitués au travers d'autres langages évolués comme C# ou C++.<br />
<br />
Dans cet article, je vais vous présenter, au travers des exemples concrets, comment grâce à la construction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">TRY CATCH</span>, combinée à l'option <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">XACT_ABORT</span>, et à la fonction XACT_STATE(), vous pouvez écrire du code T-SQL robuste intégrant une gestion sérieuse et solide des erreurs. Dans cet article, j'explique également comment, au travers ces nouvelles constructions (<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">TRY CATCH</span>, etc.), vous pouvez annuler et mettre fin aux transactions en erreur et libérer ainsi les verrous posés par les transactions sur les enregistrements.<br />
<br />
Les verrous, posé sur les enregistrements, non libérés, acquis par une transaction en erreurs, inachevée, sont la sources de nombreux dans les applications.<br />
Le paragraphe § II, ci-dessous, présente un modèle de code d'une procédure stockée, mettant en œuvre ces nouveaux concepts.<br />
<br />
<b><font size="2">II - Modèle de procédure stockée mettant en ouvre la construction TRY CATCH</font></b><br />
<br />
<b>1</b> - Création d’une table temporaire pour le test<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> <span style="color: black;">[dbo]</span>.<span style="color: black;">[Temp01]</span><span class="br0">&#40;</span>  
      Id       <span style="color: #0000ff;">INT</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>,   
      Libelle  <span style="color: #0000ff;">VARCHAR</span><span class="br0">&#40;</span><span style="color: #cc66cc;">50</span><span class="br0">&#41;</span> <span style="color: #0000ff;">NULL</span>  
<span class="br0">&#41;</span>   
<span style="color: #0000ff;">ON</span> <span style="color: black;">[PRIMARY]</span>;   
<span style="color: #0000ff;">GO</span></pre></td></tr></table></pre>
</div><br />
<b>2</b> - Script de la procédure modèle pour les tests<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">DROP</span> <span style="color: #0000ff;">PROCEDURE</span> dbo.PS_U_TEST_TRY_CATCH_XACT_ABORT;
<span style="color: #0000ff;">GO</span>
<span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">PROCEDURE</span> dbo.PS_U_TEST_TRY_CATCH_XACT_ABORT
<span style="color: #0000ff;">AS</span>
<span style="color: #0000ff;">BEGIN</span>
  <span style="color: #0000ff;">SET</span> NOCOUNT <span style="color: #0000ff;">ON</span>;
&nbsp;
   <span style="color: #0000ff;">SET</span> XACT_ABORT <span style="color: #0000ff;">ON</span>;    <span style="color: #808080;">-- (1) On fait notre premier test avec  XACT_ABORT ON</span>
  <span style="color: #808080;">-- SET XACT_ABORT OFF;  -- (2) Faites &eacute;galement un test avec SET XACT_ABORT OFF, </span>
                          <span style="color: #808080;">--     vous verrez les diff&eacute;rences</span>
                          <span style="color: #808080;">--     en terme de r&eacute;sultat et vous comprendrez mieux </span>
                          <span style="color: #808080;">--     la subtilit&eacute; de cette option (XACT_ABORT) !</span>
  <span style="color: #0000ff;">DECLARE</span> <span style="color: #339933;">@Var1</span> FLOAT;
&nbsp;
  <span style="color: #0000ff;">BEGIN</span> <span style="color: #0000ff;">TRY</span>
        <span style="color: #0000ff;">BEGIN</span> <span style="color: #0000ff;">TRAN</span>;
           <span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.Temp01
               <span class="br0">&#40;</span>Id, Libelle<span class="br0">&#41;</span>
           <span style="color: #0000ff;">VALUES</span>
               <span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #FF0000;">'Ecartez la vanit&eacute;, elle g&ecirc;ne l'</span><span style="color: #FF0000;">'orgueil'</span><span class="br0">&#41;</span>; <span style="color: #808080;">-- (Citation de L. Pauwels !)</span>
&nbsp;
           <span style="color: #0000ff;">SET</span> <span style="color: #339933;">@Var1</span> = <span style="color: #cc66cc;">2.5</span>/<span style="color: #cc66cc;">0</span>;  <span style="color: #808080;">-- (3) On effectue volontairement une division par z&eacute;ro </span>
                               <span style="color: #808080;">--     pour g&eacute;n&eacute;rer une exception</span>
        <span style="color: #0000ff;">COMMIT</span> <span style="color: #0000ff;">TRAN</span>;
        PRINT <span style="color: #FF0000;">'COMMIT BLOC TRY ..'</span>  <span style="color: #808080;">-- (4) On ne passe jamais ici, que l'option </span>
                                    <span style="color: #808080;">--     SET XACT_ABORT soit &agrave; ON ou &agrave; OFF</span>
  <span style="color: #0000ff;">END</span> <span style="color: #0000ff;">TRY</span>
  <span style="color: #0000ff;">BEGIN</span> <span style="color: #0000ff;">CATCH</span>
        PRINT  <span style="color: #FF0000;">'ErrNumber '</span> + CONVERT<span class="br0">&#40;</span><span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">50</span><span class="br0">&#41;</span>, ERROR_NUMBER<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> +
               <span style="color: #FF0000;">', ErrSeverity '</span> + CONVERT<span class="br0">&#40;</span><span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>, ERROR_SEVERITY<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> +
               <span style="color: #FF0000;">', ErrState '</span> + CONVERT<span class="br0">&#40;</span><span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>, ERROR_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> +
               <span style="color: #FF0000;">', ErrProcedure '</span> + ISNULL<span class="br0">&#40;</span>ERROR_PROCEDURE<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span style="color: #FF0000;">'-'</span><span class="br0">&#41;</span> +
               <span style="color: #FF0000;">', ErrLine '</span> + CONVERT<span class="br0">&#40;</span><span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>, ERROR_LINE<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ;
         PRINT <span style="color: #FF0000;">'ErrMessage '</span> + ERROR_MESSAGE<span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
        <span style="color: #0000ff;">IF</span> <span class="br0">&#40;</span>XACT_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span> = -<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>
          <span style="color: #0000ff;">BEGIN</span>
             <span style="color: #808080;">-- Il existe une transaction active mais une erreur a entra&icirc;n&eacute; le classement</span>
             <span style="color: #808080;">-- de la transaction comme non validable (uncommittable transaction).</span>
&nbsp;
             <span style="color: #808080;">-- A ce niveau, il est fortement recommand&eacute; de faire un ROLLBACK.</span>
             <span style="color: #808080;">-- En effet, &agrave; ce stade toute instruction Insert, Update, Delete ne peut &ecirc;tre </span>
             <span style="color: #808080;">-- ex&eacute;cut&eacute;e avec succ&egrave;s puisqu'elle serait ex&eacute;cut&eacute;e dans le cadre de la </span>
             <span style="color: #808080;">-- transaction en cours d&eacute;j&agrave; ouverte et consid&eacute;r&eacute;e non validable !</span>
&nbsp;
             <span style="color: #808080;">-- Ne pas faire un*ROLLBACK &agrave; ce stade g&eacute;n&eacute;rerait assur&eacute;ment d'autres erreurs </span>
              <span style="color: #808080;">-- par la suite, tr&egrave;s difficiles &agrave; cerner. </span>
              PRINT <span style="color: #FF0000;">'XACT_STATE() = -1  --&gt; ROLLBACK'</span> ;
              <span style="color: #0000ff;">ROLLBACK</span> <span style="color: #0000ff;">TRAN</span>;
	      PRINT <span style="color: #FF0000;">'ROLLBACK, fortement recommand&eacute;, effectu&eacute;'</span> ;
          <span style="color: #0000ff;">END</span>;
        <span style="color: #0000ff;">ELSE</span> <span style="color: #0000ff;">IF</span> <span class="br0">&#40;</span>XACT_STATE<span class="br0">&#40;</span><span class="br0">&#41;</span> = <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>
         <span style="color: #0000ff;">BEGIN</span>
            <span style="color: #808080;">-- Il existe une transaction active. la validation ou l&#146;annulation de la</span>
            <span style="color: #808080;">-- transaction sont possibles. C'est &agrave; vous de voir.</span>
            PRINT <span style="color: #FF0000;">'XACT_STATE() = 1 --&gt; ROLLBACK OU COMMIT A vous de voir ...'</span>
&nbsp;
            <span style="color: #808080;">-- Vous pouvez aussi, &agrave; ce niveau, si vous le jugez n&eacute;cessaire, faire un COMMIT</span>
            <span style="color: #808080;">-- c'est &agrave; vous de voir selon les contraintes fonctionnelles de votre application</span>
            <span style="color: #808080;">-- Mais attention, il faut faire quelque chose (soit un COMMIT soit un ROLLBACK),</span>
            <span style="color: #808080;">-- ne rien faire &agrave; ce stade serait de nature &agrave; g&eacute;n&eacute;rer assur&eacute;ment d'autres </span>
            <span style="color: #808080;">-- erreurs par la suite, tr&egrave;s difficiles &agrave; cerner.</span>
            <span style="color: #0000ff;">ROLLBACK</span> <span style="color: #0000ff;">TRAN</span>;   <span style="color: #808080;">-- (5) On fait notre premier test avec  ROLLBACK TRAN                                                            </span>
	   PRINT <span style="color: #FF0000;">'ROLLBACK effectu&eacute; (le choix de faire un rollback a &eacute;t&eacute; d&eacute;lib&eacute;r&eacute;) '</span> ; <span style="color: #808080;">-- (5) On fait notre premier test avec  ROLLBACK TRAN  </span>
            <span style="color: #808080;">-- COMMIT TRAN; -- (6) On fait autre test avec COMMIT TRAN; </span>
	    <span style="color: #808080;">-- PRINT 'COMMIT effectu&eacute; (le choix de faire un commit a &eacute;t&eacute; d&eacute;lib&eacute;r&eacute;) ' ; -- (6) On fait autre test avec COMMIT TRAN  </span>
         <span style="color: #0000ff;">END</span>;
  <span style="color: #0000ff;">END</span> <span style="color: #0000ff;">CATCH</span>;
<span style="color: #0000ff;">END</span>;
<span style="color: #0000ff;">GO</span></pre></td></tr></table></pre>
</div>Remarque : Lisez attentivement les commentaires rajoutées dans le code de la procédure ci-dessus. En effet, toute les explications importantes, ayant trait à la construction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">TRY CATCH</span>, et à l'option <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">XACT_ABORT</span>, se trouvent dans ces commentaires !<br />
<br />
<b>3</b> - Test n° 1 : <br />
<br />
- Créez la procédure avec les options (1) et (5) ci-dessous<br />
Ligne  n° 8  : <br />
SET XACT_ABORT ON;    -- (1) On fait notre premier test avec  XACT_ABORT ON<br />
<br />
Ligne n° 63 et 64  <br />
ROLLBACK TRAN;        -- (5) On fait notre premier test avec  ROLLBACK TRAN<br />
PRINT 'ROLLBACK effectué (le choix de faire un rollback a été délibéré) ' ; -- (5) On fait notre premier test avec    <br />
<br />
- Puis exécutez la procédure : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">EXEC</span> dbo.PS_U_TEST_TRY_CATCH_XACT_ABORT;</pre>
</div>Résultat :   <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">ErrNumber 8134, ErrSeverity 16, ErrState 1, ErrProcedure PS_U_TEST_TRY_CATCH_XACT_ABORT,  
ErrLine 20  
ErrMessage Division par zéro.  
XACT_STATE() = -1  --&gt;  ROLLBACK  
ROLLBACK, fortement recommandé, effectué</pre></td></tr></table></pre>
</div>Vérifions le contenu de la table  dbo.Temp01   <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">SELECT</span> * <span style="color: #0000ff;">FROM</span> dbo.Temp01</pre>
</div>Résultat : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">(Aucun enregistrement)</pre>
</div><u>Remarque</u> : Aucune ligne n'a été insérée dans la table dbo.Temp01. Ceci est du au rollback, fortement recommandé, effectué. Voir trace ci-dessus de l'intruction print.  <br />
<br />
<b>4</b> - Test n° 2 : <br />
<br />
- Dropez puis créez à nouveau la procédure avec les options (2) et (6) ci-dessous : <br />
<br />
Ligne n° 9<br />
SET XACT_ABORT OFF;  -- (2) Faites également un test avec SET XACT_ABORT OFF, .. <br />
<br />
Ligne n° 65 et 66  <br />
COMMIT TRAN;         -- (6) On fait autre test avec COMMIT TRAN; <br />
PRINT 'COMMIT effectué (le choix de faire un commit a été délibéré) ' ; -- (6) On fait autre test avec COMMIT TRAN; <br />
<br />
NB : N'oubliez pas pour le teste n° 2 de mettre en commentaire les lignes correspondantes aux options (1) et (5) du test n° 1 <br />
<br />
- Videz également la table dbo.Temp01<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">Truncate</span> <span style="color: #0000ff;">TABLE</span> dbo.Temp01;</pre>
</div>- Puis exécutez à nouveau la procédure <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">EXEC</span> dbo.PS_U_TEST_TRY_CATCH_XACT_ABORT;</pre>
</div>Résultat : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">ErrNumber 8134, ErrSeverity 16, ErrState 1, ErrProcedure PS_U_TEST_TRY_CATCH_XACT_ABORT,   
ErrLine 20  
ErrMessage Division par zéro.  
XACT_STATE() = 1 --&gt;  ROLLBACK OU COMMIT A vous de voir ... 
COMMIT effectué (le choix de faire un commit a été délibéré)</pre></td></tr></table></pre>
</div>Vérifions le contenu de la table  dbo.Temp01   <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">SELECT</span> * <span style="color: #0000ff;">FROM</span> dbo.Temp01</pre>
</div>Résultat : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">Id Libelle  
1 Ecartez la vanité, elle gêne l'orgueil</pre></td></tr></table></pre>
</div><u>Remarque</u> : Malgré la levée de l'exception, la transaction en cours n'était pas considérée comme non validable et le COMMIT (choix délibéré) a bien eu lieu et une ligne a bien été insérée dans la table dbo.Temp01. Les lignes de trace ci-dessus des instructions print montre bien cet état de fait. <br />
<br />
<b><font size="2">III - Notion de Transaction non validable</font></b><br />
<br />
Comme vous avez pu l'observer au travers l'exemple ci-dessus, au sein d'une construction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">TRY…CATCH</span>, une transaction peut passer dans un état dans lequel elle demeure ouverte mais qui ne permet pas sa validation.<br />
Le plus préoccupant, dans cet état est que les verrous acquis par la transaction sont conservés tant qu'une instruction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">ROLLBACK</span>n'est pas émise !<br />
Par exemple, la plupart des erreurs d'une instruction DDL (Data Definition Language), telle que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">CREATE TABLE</span>, ou des erreurs qui se produisent lorsque <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">SET XACT_ABORT</span> a la valeur ON mettent fin à la transaction en dehors d'un bloc TRY mais rendent une transaction non validable à l'intérieur d'un bloc TRY.<br />
<br />
Comme vous l'avez vu au travers l'exemple du Paragraphe II, le code d'un bloc CATCH doit tester l'état d'une transaction à l'aide de la fonction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">XACT_STATE</span>. <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">XACT_STATE</span> retourne -1 si la session contient une transaction qui ne peut pas être validée. Le bloc CATCH ne doit en aucun cas valider la transaction (c.à ne doit pas faire un COMMIT) si <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">XACT_STATE</span> retourne une valeur -1.<br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">SET XACT_ABORT</span> indique l'action que SQL Server doit effectuer suite à une erreur d'exécution. Le paramètre de session par défaut est <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">SET XACT_ABORT OFF</span>, ce qui signifie que seule l'instruction T-SQL qui a déclenché l'erreur est annulée, et la transaction se poursuit. Même lorsque <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">SET XACT_ABORT</span> est définie à OFF, selon la gravité de l'erreur, la transaction entière ou un lot T-SQL peut être annulée.<br />
<br />
<b><font size="2">IV - Comment définir SET XACT_ABORT ON ou OFF ?</font></b><br />
<br />
Notez qu'avec les pools de connexions, le fait de fermer la connexion sans effectuer un <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">ROLLBACK</span> explicite, aura juste pour effet de retourner la connexion au pool de connexion pour une réutilisation ultérieure, mais la transaction restera ouverte jusqu'à ce que la connexion soit réutilisée ou retirée du pool. Et pendant tout ce temps les verrous posés par la transaction resteront actifs. Il en résulte des &quot;Locks&quot; et des blocages de l'application.<br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">SET XACT_ABORT ON</span> demande à SQL Server d'annuler la totalité de la transaction, lorsqu'une erreur se produit pendant l'exécution du traitement. Retenez toutefois que les erreurs de compilation (erreurs de syntaxe, par exemple) ne sont pas affectés par <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">SET XACT_ABORT</span>.<br />
<br />
L'expérience montre que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">SET XACT_ABORT ON</span> contribue à ce que les applications deviennent plus stables et plus robustes. En effet, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">SET XACT_ABORT ON</span> permet d'assurer, qu'en cas d'erreur, les transactions seront annulées, et les verrous libérés, et ce même si le code de l'applications n'effectue pas correctement le nettoyage.<br />
<br />
A moins que vous ayez vraiment des raisons particulières, valables, qui vous obligent de définir <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">SET XACT_ABORT OFF</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">SET XACT_ABORT ON</span> est fortement recommandée et doit être incluse dans toutes les procédures stockées mettant en jeux des transactions explicites.<br />
<br />
Rappelez-vous que les conséquences d'une application qui, sans le vouloir, laisserait des transactions ouvertes et des verrous posés sur les enregistrements, sont désastreuses.<br />
<br />
A+</blockquote>

]]></content:encoded>
			<dc:creator>hmira</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/24310-hmira/b135/sql-server-gestion-exceptions-try-catch-rendre-application-plus-robuste/</guid>
		</item>
		<item>
			<title><![CDATA[SQL Server - L'importance de l'ordre des colonnes d'un Index]]></title>
			<link>https://www.developpez.net/forums/blogs/24310-hmira/b131/sql-server-l-importance-l-ordre-colonnes-d-index/</link>
			<pubDate>Mon, 29 Dec 2014 14:43:52 GMT</pubDate>
			<description>Par exemple, vous constatez...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Par exemple, vous constatez que nombre de clauses <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">WHERE</span> sur la table dbo.MaTable utilisent régulièrement les mêmes critères  :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">  <span style="color: #0000ff;">SELECT</span> ... 
  <span style="color: #0000ff;">FROM</span> dbo.MaTable 
  <span style="color: #0000ff;">WHERE</span> Col1 = ... 
   <span style="color: #0000ff;">AND</span>  Col2 = ... 
   <span style="color: #0000ff;">AND</span>  Col3 = ...</pre></td></tr></table></pre>
</div>et vous décidez de créer un index composite défini sur les 3 colonnes en question  { Col1, Col2, Col3 }. <br />
<br />
Une des questions  très importante et cruciale que vous devez de vous poser est la suivante :<br />
&quot;Ok, je prévois de créer un index sur les colonnes {Col1, Col2, Col3}  mais dans quel Ordre ? <br />
      Col1, Col2, Col3 <br />
ou  Col2, Col1, Col3 <br />
ou  Col3, Col1, Col2 <br />
ou   ....  ?&quot;<br />
<br />
En effet, lors de la création d'un index, l'ordre des colonnes est très important et déterminant pour les performances. <br />
Gardez à l'esprit également que l'ordre des colonnes dans la définition de l'index est complètement dé-corrélé de l'ordre de l'apparition des ces mêmes colonnes dans les clauses <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">WHERE</span>. En d'autres termes, ce n'est pas parce que vos clauses <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">WHERE</span> sont presque toujours sous forme : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">WHERE</span> Col1 = ... 
   <span style="color: #0000ff;">AND</span> Col2 = ... 
   <span style="color: #0000ff;">AND</span>  Col3 = ...</pre></td></tr></table></pre>
</div>que votre index doit être également défini selon le même ordre (Col1, Col2, Col3). Il s'agit d'une grosse erreur ou plutôt d'une idée reçue complètement fausse. <br />
<br />
En réalité, l'ordre d'apparition des colonnes dans une clause <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">WHERE</span> n'a pas beaucoup d'importance dès lors que l'optimiseur, en fonction des indexes déjà existants, est en mesure d'élaborer un chemin optimal. En outre, la requête sera transformée dans une forme canonique lors de l'étape de l'algébrisation et l'ordre d'évaluation des opérateurs logiques peut varier en fonction des choix effectués par l'optimiseur de requêtes.<br />
<br />
En revanche, lors de la définition d'un index, l'ordre des colonnes a tout son importance. En effet, dans un index, les données sont d'abord triées sur le première colonne et à l'intérieur de la première colonne, les données sont triées sur la deuxième colonne et ainsi de suite jusqu'à la dernière colonne de l'index. Gardez à l'esprit que la première colonne d'un index joue un rôle très important pour des diverses raisons que je ne vais pas détailler ici. <br />
<br />
Pour déterminer, en terme de performance, le meilleur ordre de déclaration des colonnes dans un index, vous devez vous intéresser pour chacune des colonnes aux caractéristiques suivantes : <br />
 1 - La sélectivité de la colonne <br />
 2 - La largeur de la colonne <br />
 3 - Le type de donnée de la colonne <br />
  <br />
Pour déterminer cet ordre, vous devez privilégiez en premier les colonnes les plus sélectives, les plus compactes en ce qui concerne la largeur et le type de donnée . <br />
<br />
Prenons un exemple : Soit la requête récurrente (avec les paramètres qui changent bien sûr) ci-dessous : <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> E.*
<span style="color: #0000ff;">FROM</span> Employe <span style="color: #0000ff;">AS</span> E
<span style="color: #0000ff;">WHERE</span> E.SituationMatrimoniale = <span style="color: #FF0000;">'C'</span> <span style="color: #808080;">-- C&eacute;libataire </span>
<span style="color: #0000ff;">AND</span> E.DateNaisance = <span style="color: #FF0000;">'1985-06-21'</span>
<span style="color: #0000ff;">AND</span> E.Sex = <span style="color: #FF0000;">'F'</span> <span style="color: #808080;">-- F&eacute;minin</span></pre></td></tr></table></pre>
</div>Afin de déterminer l'ordre le plus pertinent, nous allons calculer pour chacune des colonne la sélectivité, puis classer celles-ci pat ordre décroissant : <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> A.* <span style="color: #0000ff;">FROM</span> 
<span class="br0">&#40;</span> <span style="color: #0000ff;">SELECT</span> <span style="color: #FF0000;">'SituationMatrimoniale'</span> <span style="color: #0000ff;">as</span> NomColonne, COUNT<span class="br0">&#40;</span><span style="color: #0000ff;">DISTINCT</span> E.SituationMatrimoniale<span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> NombreValeursDistinctes,
COUNT<span class="br0">&#40;</span>E.SituationMatrimoniale<span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> NombreDeLignes,
<span class="br0">&#40;</span><span style="color: #0000ff;">CAST</span><span class="br0">&#40;</span>COUNT<span class="br0">&#40;</span><span style="color: #0000ff;">DISTINCT</span> E.SituationMatrimoniale<span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: #0000ff;">DECIMAL</span><span class="br0">&#41;</span> / <span style="color: #0000ff;">CAST</span><span class="br0">&#40;</span>COUNT<span class="br0">&#40;</span>E.SituationMatrimoniale<span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: #0000ff;">DECIMAL</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> Selectivite,
<span class="br0">&#40;</span><span style="color: #cc66cc;">1.0</span>/<span class="br0">&#40;</span>COUNT<span class="br0">&#40;</span><span style="color: #0000ff;">DISTINCT</span> E.SituationMatrimoniale<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> Densite
<span style="color: #0000ff;">FROM</span> dbo.Employe <span style="color: #0000ff;">AS</span> E
<span style="color: #0000ff;">UNION</span> <span style="color: #0000ff;">ALL</span> 
<span style="color: #0000ff;">SELECT</span> <span style="color: #FF0000;">'DateNaissance'</span> <span style="color: #0000ff;">as</span> NomColonne, COUNT<span class="br0">&#40;</span><span style="color: #0000ff;">DISTINCT</span> E.DateNaissance<span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> NombreValeursDistinctes,
COUNT<span class="br0">&#40;</span>E.DateNaissance<span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> NombreDeLignes,
<span class="br0">&#40;</span><span style="color: #0000ff;">CAST</span><span class="br0">&#40;</span>COUNT<span class="br0">&#40;</span><span style="color: #0000ff;">DISTINCT</span> E.DateNaissance<span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: #0000ff;">DECIMAL</span><span class="br0">&#41;</span> / <span style="color: #0000ff;">CAST</span><span class="br0">&#40;</span>COUNT<span class="br0">&#40;</span>E.DateNaissance<span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: #0000ff;">DECIMAL</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> Selectivite,
<span class="br0">&#40;</span><span style="color: #cc66cc;">1.0</span>/<span class="br0">&#40;</span>COUNT<span class="br0">&#40;</span><span style="color: #0000ff;">DISTINCT</span> E.DateNaissance<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> Densite
<span style="color: #0000ff;">FROM</span> dbo.Employe <span style="color: #0000ff;">AS</span> E
<span style="color: #0000ff;">UNION</span> <span style="color: #0000ff;">ALL</span> 
<span style="color: #0000ff;">SELECT</span> <span style="color: #FF0000;">'Sex'</span> <span style="color: #0000ff;">as</span> NomColonne, COUNT<span class="br0">&#40;</span><span style="color: #0000ff;">DISTINCT</span> E.Sex<span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> NombreValeursDistinctes,
COUNT<span class="br0">&#40;</span>E.Sex<span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> NombreDeLignes,
<span class="br0">&#40;</span><span style="color: #0000ff;">CAST</span><span class="br0">&#40;</span>COUNT<span class="br0">&#40;</span><span style="color: #0000ff;">DISTINCT</span> E.Sex<span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: #0000ff;">DECIMAL</span><span class="br0">&#41;</span> / <span style="color: #0000ff;">CAST</span><span class="br0">&#40;</span>COUNT<span class="br0">&#40;</span>E.Sex<span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: #0000ff;">DECIMAL</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> Selectivite,
<span class="br0">&#40;</span><span style="color: #cc66cc;">1.0</span>/<span class="br0">&#40;</span>COUNT<span class="br0">&#40;</span><span style="color: #0000ff;">DISTINCT</span> E.Sex<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> Densite
<span style="color: #0000ff;">FROM</span> dbo.Employe <span style="color: #0000ff;">AS</span> E
<span class="br0">&#41;</span> A 
<span style="color: #0000ff;">ORDER</span> <span style="color: #0000ff;">BY</span> A.Selectivite <span style="color: #0000ff;">DESC</span></pre></td></tr></table></pre>
</div><br />
<div class="cms_table"><table width="500" class="cms_table_outer_border"><tr valign="top" class="cms_table_outer_border_tr"><td class="cms_table_outer_border_td">NomColonne</td>
<td class="cms_table_outer_border_td">NombreValeursDistinctes</td>
<td class="cms_table_outer_border_td">NombreDeLignes</td>
<td class="cms_table_outer_border_td">Selectivite</td>
<td class="cms_table_outer_border_td">Densite</td>
</tr>
<tr valign="top" class="cms_table_outer_border_tr"><td class="cms_table_outer_border_td">DateNaissance</td>
<td class="cms_table_outer_border_td">279</td>
<td class="cms_table_outer_border_td">290</td>
<td class="cms_table_outer_border_td">0.9620689655172413793</td>
<td class="cms_table_outer_border_td">0.003584229390</td>
</tr>
<tr valign="top" class="cms_table_outer_border_tr"><td class="cms_table_outer_border_td">SituationMatrimoniale</td>
<td class="cms_table_outer_border_td">4</td>
<td class="cms_table_outer_border_td">290</td>
<td class="cms_table_outer_border_td">0.0137931034482758620</td>
<td class="cms_table_outer_border_td">0.250000000000</td>
</tr>
<tr valign="top" class="cms_table_outer_border_tr"><td class="cms_table_outer_border_td">Sex</td>
<td class="cms_table_outer_border_td">2</td>
<td class="cms_table_outer_border_td">290</td>
<td class="cms_table_outer_border_td">0.0068965517241379310</td>
<td class="cms_table_outer_border_td">0.500000000000</td>
</tr>
</table></div>
<br />
D'après le résultat ci-dessus, on peut en déduire que l'index sera plus performant si l'ordre des colonnes est défini comme suit <br />
(DateNaissance, SituationMatrimoniale, Sex) <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">INDEX</span> IX_Employe_DateNaissance_SituationMatrimoniale_Sex <span style="color: #0000ff;">ON</span>
 dbo.Employe <span class="br0">&#40;</span>DateNaissance, SituationMatrimoniale, Sex<span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>Autres considération à prendre en compte : <br />
Comme je l'ai mentionné ci-dessus, la première colonne joue un rôle important, en outre seule les requêtes référençant la première colonne de l'index pourront éventuellement utiliser cet index. <br />
Dans notre exemple, les clauses WHERE référençant les colonnes suivantes : <br />
    DateNaissance<br />
ou DateNaissance, SituationMatrimoniale <br />
ou DateNaissance, SituationMatrimoniale, Sex <br />
<br />
Pourront le cas échéant bénéficier de l'index <br />
<br />
A contrario, il est quasiment improbable que la requête ci-dessous :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> E.*
<span style="color: #0000ff;">FROM</span> Employe <span style="color: #0000ff;">AS</span> E
<span style="color: #0000ff;">WHERE</span> E.SituationMatrimoniale = <span style="color: #FF0000;">'C'</span> <span style="color: #808080;">-- C&eacute;libataire </span>
<span style="color: #0000ff;">AND</span> E.Sex = <span style="color: #FF0000;">'F'</span> <span style="color: #808080;">-- F&eacute;minin</span></pre></td></tr></table></pre>
</div>puisse utiliser l'index basé sur les colonnes (DateNaissance, SituationMatrimoniale, Sex) ; ou alors, si tel est le cas, l'optimiseur utilisera l'index mais en effectuant forcément un full scan de l'index. En effet la première colonne de l'index est absente de la clause <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">WHERE</span>, et un Full Scan de l'index ne présente aucun intérêt ! <br />
<br />
A+</blockquote>

]]></content:encoded>
			<dc:creator>hmira</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/24310-hmira/b131/sql-server-l-importance-l-ordre-colonnes-d-index/</guid>
		</item>
	</channel>
</rss>
