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

<channel>
	<title>Optimisation et diagnostic SQL Server</title>
	<atom:link href="https://blog.developpez.com/babaluga/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/babaluga</link>
	<description>Articles et fragments de code pour l&#039;optimisation SQL Server</description>
	<lastBuildDate>Wed, 26 Mar 2014 09:30:39 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>optimize for adhoc workloads</title>
		<link>https://blog.developpez.com/babaluga/p12549/vues-de-gestion-dynamique/optimize-for-adhoc-workloads</link>
		<comments>https://blog.developpez.com/babaluga/p12549/vues-de-gestion-dynamique/optimize-for-adhoc-workloads#comments</comments>
		<pubDate>Wed, 26 Mar 2014 09:30:39 +0000</pubDate>
		<dc:creator><![CDATA[rudib]]></dc:creator>
				<category><![CDATA[vues de gestion dynamique]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/babaluga/?p=57</guid>
		<description><![CDATA[SQL Server maintient un cache de plans d&#8217;exécution. Ces plans permettent au moteur de ne pas ré-optimiser les requêtes si elles sont exécutées une deuxième fois. C&#8217;est valable bien sûr pour les procédures stockées, mais aussi pour les requêtes ad-hoc. Le problème avec les requêtes ad-hoc (celles qui sont générées dans le code de l&#8217;application [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>SQL Server maintient un cache de plans d&rsquo;exécution. Ces plans permettent au moteur de ne pas ré-optimiser les requêtes si elles sont exécutées une deuxième fois. C&rsquo;est valable bien sûr pour les procédures stockées, mais aussi pour les requêtes ad-hoc. Le problème avec les requêtes ad-hoc (celles qui sont générées dans le code de l&rsquo;application au lieu de faire un appel de procédure stockée), c&rsquo;est que le plan concerne une requête, et non pas une requête paramétrée. En d&rsquo;autres termes, ces deux requêtes :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT * FROM dbo.Client WHERE Nom = 'MAUGHAN';<br />
SELECT * FROM dbo.Client WHERE Nom = 'LLOYD';</div></div>
<p>Vont générer deux plans en mémoire (probablement identiques), parce que SQL Server ne paramétrise pas la requête automatiquement, car le plan pourrait être différent selon le nombre de valeur à retourner par paramètre.<br />
Nous pouvons voir la taille occupée par ces plans qui ne sont utilisés qu&rsquo;une fois à l&rsquo;aide de la requête suivante :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT SUM(CAST(cp.size_in_bytes as bigint)) / 1024 / 1024 as adhoc_once_mb<br />
FROM sys.dm_exec_cached_plans AS cp<br />
WHERE cp.cacheobjtype = N'Compiled Plan' <br />
AND cp.objtype = N'Adhoc' <br />
AND cp.usecounts = 1<br />
OPTION (RECOMPILE);</div></div>
<p>Pour économiser cette mémoire, une option de l&rsquo;instance disponible à partir de SQL Server 2008 peut être activée. Son nom est « optimize for adhoc workloads ». Vous la trouvez dans les propriétés de l&rsquo;instance, ou vous pouvez la modifier comme suit :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SP_CONFIGURE 'show advanced options',1<br />
RECONFIGURE<br />
GO<br />
<br />
SP_CONFIGURE 'optimize for ad hoc workloads',1<br />
RECONFIGURE<br />
GO</div></div>
<p>Cette option modifie le comportement de SQL Server de la manière suivante : lorsqu&rsquo;un plan de requête ad-hoc est calculé, il n&rsquo;est plus directement stocké dans le cache, seul l&rsquo;est un résumé du plan (un stub) qui permettra de reconnaître le même plan ensuite. Si le même plan doit être calculé une deuxième fois, il sera cette fois gardé en cache.<br />
<strong>Je vous recommande d&rsquo;activer cette option systématiquement sur tous vos serveurs SQL</strong>.<br />
Voici une requête synoptique pour vous rendre compte de la situation sur votre serveur:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT<br />
&nbsp; &nbsp; cacheobjtype, <br />
&nbsp; &nbsp; objtype, <br />
&nbsp; &nbsp; 'total' as [type],<br />
&nbsp; &nbsp; SUM(CAST(size_in_bytes as bigint)) / 1024 / 1014 as size_in_mb<br />
FROM sys.dm_exec_cached_plans<br />
GROUP BY cacheobjtype, objtype<br />
UNION ALL<br />
SELECT<br />
&nbsp; &nbsp; cacheobjtype, <br />
&nbsp; &nbsp; objtype, <br />
&nbsp; &nbsp; '1x',<br />
&nbsp; &nbsp; SUM(CAST(size_in_bytes as bigint)) / 1024 / 1014 as size_in_mb<br />
FROM sys.dm_exec_cached_plans<br />
WHERE usecounts = 1<br />
GROUP BY cacheobjtype, objtype<br />
ORDER BY cacheobjtype, objtype, [type];</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modifier les colonnes TEXT en VARCHAR(MAX)</title>
		<link>https://blog.developpez.com/babaluga/p12518/t-sql/modifier-les-colonnes-text-en-varcharmax</link>
		<comments>https://blog.developpez.com/babaluga/p12518/t-sql/modifier-les-colonnes-text-en-varcharmax#comments</comments>
		<pubDate>Tue, 11 Mar 2014 12:03:31 +0000</pubDate>
		<dc:creator><![CDATA[rudib]]></dc:creator>
				<category><![CDATA[catalogue]]></category>
		<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/babaluga/?p=54</guid>
		<description><![CDATA[Le type de données TEXT est déprécié depuis SQL Server 2005. Outre les problèmes de gestion dans le code et sa non compatibilité avec plusieurs fonctions de chaînes, et est gourmand en espace disque et ralentit les opérations de lecture et d&#8217;écriture, parce que le moteur de stockage doit créer une allocation spécifique aux LOB [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Le type de données TEXT est déprécié depuis SQL Server 2005. Outre les problèmes de gestion dans le code et sa non compatibilité avec plusieurs fonctions de chaînes, et est gourmand en espace disque et ralentit les opérations de lecture et d&rsquo;écriture, parce que le moteur de stockage doit créer une allocation spécifique aux LOB pour chaque ligne insérée.<br />
Le type qui le remplace s&rsquo;appelle VARCHAR(MAX), et l&rsquo;allocation dans la page ou en LOB se fait dynamiquement selon le contenu inséré dans la colonne. Dans la pratique, cela prend beaucoup moins d&rsquo;espace en base.</p>
<p>Voici un code se basant sur une vue de catalogue, pour générer les instructions ALTER TABLE pour convertir les types de données, et ensuite pour reconstruire les tables (à partir de SQL Server 2008). Vous pouvez au besoin modifier le code pour accommoder des colonnes NTEXT, et IMAGE (à remplacer par VARBINARY(MAX)) si vous en avez.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT <br />
&nbsp; &nbsp; 'ALTER TABLE ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] ALTER COLUMN ['+COLUMN_NAME+'] VARCHAR(MAX) '<br />
&nbsp; &nbsp; +CASE IS_NULLABLE WHEN 'YES' THEN 'NULL' ELSE 'NOT NULL' END + ';'<br />
FROM INFORMATION_SCHEMA.COLUMNS<br />
WHERE DATA_TYPE = 'text';<br />
<br />
SELECT <br />
&nbsp; &nbsp; 'ALTER TABLE ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] REBUILD;'<br />
FROM INFORMATION_SCHEMA.COLUMNS<br />
WHERE DATA_TYPE = 'text'<br />
GROUP BY TABLE_SCHEMA, TABLE_NAME;</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Surveillance de l&#8217;activité disque</title>
		<link>https://blog.developpez.com/babaluga/p12505/vues-de-gestion-dynamique/surveillance-de-lactivite-disque</link>
		<comments>https://blog.developpez.com/babaluga/p12505/vues-de-gestion-dynamique/surveillance-de-lactivite-disque#comments</comments>
		<pubDate>Mon, 24 Feb 2014 12:58:49 +0000</pubDate>
		<dc:creator><![CDATA[rudib]]></dc:creator>
				<category><![CDATA[vues de gestion dynamique]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/babaluga/?p=51</guid>
		<description><![CDATA[La requête suivante retourne l&#8217;activité disque enregistrée par SQL Server depuis le démarrage de l&#8217;instance, par fichier de base de données. SELECT &#160; &#160; DB_NAME(mf.database_id) as db, &#160; &#160; mf.name, &#160; &#160; LEFT(mf.physical_name, 2) as disque, &#160; &#160; fs.num_of_reads, fs.num_of_bytes_read, &#160; &#160; fs.num_of_writes, fs.num_of_bytes_written, &#160; &#160; fs.io_stall, fs.io_stall_read_ms, fs.io_stall_write_ms FROM sys.dm_io_virtual_file_stats(null,null) AS fs INNER JOIN [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>La requête suivante retourne l&rsquo;activité disque enregistrée par SQL Server depuis le démarrage de l&rsquo;instance, par fichier de base de données.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT <br />
&nbsp; &nbsp; DB_NAME(mf.database_id) as db, <br />
&nbsp; &nbsp; mf.name, <br />
&nbsp; &nbsp; LEFT(mf.physical_name, 2) as disque, <br />
&nbsp; &nbsp; fs.num_of_reads, fs.num_of_bytes_read,<br />
&nbsp; &nbsp; fs.num_of_writes, fs.num_of_bytes_written,<br />
&nbsp; &nbsp; fs.io_stall, fs.io_stall_read_ms, fs.io_stall_write_ms<br />
FROM sys.dm_io_virtual_file_stats(null,null) AS fs<br />
INNER JOIN sys.master_files AS mf<br />
ON fs.database_id = mf.database_id<br />
AND fs.[file_id] = mf.[file_id]</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>informations de session</title>
		<link>https://blog.developpez.com/babaluga/p12458/vues-de-gestion-dynamique/informations-de-session</link>
		<comments>https://blog.developpez.com/babaluga/p12458/vues-de-gestion-dynamique/informations-de-session#comments</comments>
		<pubDate>Thu, 30 Jan 2014 09:09:05 +0000</pubDate>
		<dc:creator><![CDATA[rudib]]></dc:creator>
				<category><![CDATA[vues de gestion dynamique]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/babaluga/?p=48</guid>
		<description><![CDATA[La requête suivante vous indique les sessions ouvertes sur SQL Server, avec nom de la machine client, le login, type d&#8217;authentification (SQL ou Windows), et le nom du programme tel qu&#8217;indiqué dans la chaîne de connexion. SELECT &#160; &#160; c.session_id, &#160; &#160; s.login_name, &#160; &#160; CASE c.auth_scheme &#160; &#160; &#160; &#160; WHEN 'sql' THEN 'SQL' [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>La requête suivante vous indique les sessions ouvertes sur SQL Server, avec nom de la machine client, le login, type d&rsquo;authentification (SQL ou Windows), et le nom du programme tel qu&rsquo;indiqué dans la chaîne de connexion.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT <br />
&nbsp; &nbsp; c.session_id, <br />
&nbsp; &nbsp; s.login_name,<br />
&nbsp; &nbsp; CASE c.auth_scheme<br />
&nbsp; &nbsp; &nbsp; &nbsp; WHEN 'sql' THEN 'SQL'<br />
&nbsp; &nbsp; &nbsp; &nbsp; ELSE 'Windows'<br />
&nbsp; &nbsp; END as Authentification_mode,<br />
&nbsp; &nbsp; s.host_name,<br />
&nbsp; &nbsp; s.program_name<br />
FROM sys.dm_exec_connections c<br />
JOIN sys.dm_exec_sessions s ON c.session_id = s.session_id</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>In-Memory OLTP sur machine virtuelle VirtualBox</title>
		<link>https://blog.developpez.com/babaluga/p12394/sql-server-2014/in-memory-oltp-sur-machine-virtuelle-virtualbox</link>
		<comments>https://blog.developpez.com/babaluga/p12394/sql-server-2014/in-memory-oltp-sur-machine-virtuelle-virtualbox#comments</comments>
		<pubDate>Thu, 19 Dec 2013 09:39:18 +0000</pubDate>
		<dc:creator><![CDATA[rudib]]></dc:creator>
				<category><![CDATA[SQL Server 2014]]></category>
		<category><![CDATA[In-Memory OLTP]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/babaluga/?p=44</guid>
		<description><![CDATA[Lorsque j&#8217;ai voulu créer une table In-Memory dans SQL Server 2014 CTP2, dans une machine virtuelle virtualBox, j&#8217;ai obetnu la message d&#8217;erreur suivant de la part de SQL Server : Msg 41342, Level 15, State 1, Line 5 The model of the processor on the system does not support creating filegroups with MEMORY_OPTIMIZED_DATA. This error [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Lorsque j&rsquo;ai voulu créer une table In-Memory dans SQL Server 2014 CTP2, dans une machine virtuelle virtualBox, j&rsquo;ai obetnu la message d&rsquo;erreur suivant de la part de SQL Server :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Msg 41342, Level 15, State 1, Line 5<br />
<br />
The model of the processor on the system does not support creating filegroups with MEMORY_OPTIMIZED_DATA. This error typically occurs with older processors. See SQL Server Books Online for information on supported models.</div></div>
<p>J&rsquo;ai trouvé la réponse ici : mattsql.wordpress.com/2013/07/08/in-memory-oltp-with-sql-server-2014/</p>
<p>qui est: lancer ceci en ligne de commande :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">VBoxManage setextradata [vmname] VBoxInternal/CPUM/CMPXCHG16B 1</div></div>
<p>et redémarrer la machine virtuelle. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>voir les requêtes en cours d&#8217;exécution</title>
		<link>https://blog.developpez.com/babaluga/p12388/vues-de-gestion-dynamique/voir-les-requetes-en-cours-dexecution</link>
		<comments>https://blog.developpez.com/babaluga/p12388/vues-de-gestion-dynamique/voir-les-requetes-en-cours-dexecution#comments</comments>
		<pubDate>Mon, 16 Dec 2013 09:06:17 +0000</pubDate>
		<dc:creator><![CDATA[rudib]]></dc:creator>
				<category><![CDATA[vues de gestion dynamique]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/babaluga/?p=40</guid>
		<description><![CDATA[Cette requête utilise la vue de gestion dynamique sys.dm_exec_requests pour lister les requêtes en cours d&#8217;exécution avec quelques informations utiles. SELECT &#160; &#160; s.host_name, &#160; &#160; t.text, &#160; &#160; r.start_time, &#160; &#160; r.status, &#160; &#160; r.total_elapsed_time, &#160; &#160; r.logical_reads, &#160; &#160; r.granted_query_memory FROM sys.dm_exec_requests r JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Cette requête utilise la vue de gestion dynamique sys.dm_exec_requests pour lister les requêtes en cours d&rsquo;exécution avec quelques informations utiles.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT<br />
&nbsp; &nbsp; s.host_name, <br />
&nbsp; &nbsp; t.text, <br />
&nbsp; &nbsp; r.start_time, <br />
&nbsp; &nbsp; r.status, <br />
&nbsp; &nbsp; r.total_elapsed_time, <br />
&nbsp; &nbsp; r.logical_reads, <br />
&nbsp; &nbsp; r.granted_query_memory <br />
FROM sys.dm_exec_requests r<br />
JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id<br />
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t<br />
WHERE s.session_id &amp;gt; 50;</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Contraintes non trustées</title>
		<link>https://blog.developpez.com/babaluga/p12351/catalogue/contraintes-non-trustees</link>
		<comments>https://blog.developpez.com/babaluga/p12351/catalogue/contraintes-non-trustees#comments</comments>
		<pubDate>Thu, 21 Nov 2013 12:36:01 +0000</pubDate>
		<dc:creator><![CDATA[rudib]]></dc:creator>
				<category><![CDATA[catalogue]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/babaluga/?p=37</guid>
		<description><![CDATA[Une contrainte CHECK est marque comme étant digne de confiance si elle a été créée avec l&#8217;option WITH CHECK (valeur par défaut), c&#8217;est-à-dire qu&#8217;elle vérifie les données existantes dans la table à la création. Une contrainte marquée comme non digne de confiance ne pourra pas être utilisée par l&#8217;optimiseur pour éliminer certains cas dans la [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Une contrainte CHECK est marque comme étant digne de confiance si elle a été créée avec l&rsquo;option WITH CHECK (valeur par défaut), c&rsquo;est-à-dire qu&rsquo;elle vérifie les données existantes dans la table à la création. Une contrainte marquée comme non digne de confiance ne pourra pas être utilisée par l&rsquo;optimiseur pour éliminer certains cas dans la recherche. Cela vaut donc la peine de vérifier que vos contraintes sont dignes de confiance.<br />
Voici une requête qui liste toutes les contraintes CHECK de votre base de données qui ne sont pas dignes de confiance :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT <br />
&nbsp; &nbsp; OBJECT_NAME(parent_object_id) AS NomTable,<br />
&nbsp; &nbsp; name AS NomContrainte<br />
FROM sys.objects<br />
WHERE type_desc = 'CHECK_CONSTRAINT'<br />
AND OBJECTPROPERTY([object_id], 'CnstIsNotTrusted') = 1<br />
ORDER BY NomTable, NomContrainte;</div></div>
<p>Si vous voulez les rendre dignes de confiance, vous pouvez utiliser une instruction comme celle qui suit :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ALTER TABLE CDRRating WITH CHECK CHECK CONSTRAINT NomDeLaContrainte;<br />
ALTER TABLE CDRRating WITH CHECK CHECK CONSTRAINT ALL; -- pour toutes les contraintes de la table</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>recherche dans les plans en mémoire</title>
		<link>https://blog.developpez.com/babaluga/p12350/vues-de-gestion-dynamique/recherche-dans-les-plans-en-memoire</link>
		<comments>https://blog.developpez.com/babaluga/p12350/vues-de-gestion-dynamique/recherche-dans-les-plans-en-memoire#comments</comments>
		<pubDate>Thu, 21 Nov 2013 10:47:27 +0000</pubDate>
		<dc:creator><![CDATA[rudib]]></dc:creator>
				<category><![CDATA[vues de gestion dynamique]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/babaluga/?p=26</guid>
		<description><![CDATA[Voici quelques requêtes permettant de faire des recherches dans les plans d&#8217;exécution gardés en mémoire dans le cache de plans. Ces plans sont représentés en XML, donc nous utilisons du XQuery pour effectuer les recherches. Recherche des plans parallélisés : SELECT TOP 10 p.*, q.*, qs.*, cp.plan_handle FROM sys.dm_exec_cached_plans cp CROSS apply sys.dm_exec_query_plan(cp.plan_handle) p CROSS [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Voici quelques requêtes permettant de faire des recherches dans les plans d&rsquo;exécution gardés en mémoire dans le cache de plans. Ces plans sont représentés en XML, donc nous utilisons du XQuery pour effectuer les recherches.</p>
<p><strong>Recherche des plans parallélisés :</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT TOP 10<br />
p.*,<br />
q.*,<br />
qs.*,<br />
cp.plan_handle<br />
FROM<br />
sys.dm_exec_cached_plans cp<br />
CROSS apply sys.dm_exec_query_plan(cp.plan_handle) p<br />
CROSS apply sys.dm_exec_sql_text(cp.plan_handle) AS q<br />
JOIN sys.dm_exec_query_stats qs<br />
ON qs.plan_handle = cp.plan_handle<br />
WHERE<br />
cp.cacheobjtype = 'Compiled Plan' AND<br />
p.query_plan.value('declare namespace p=&quot;http://schemas.microsoft.com/sqlserver/2004/07/showplan&quot;;<br />
max(//p:RelOp/@Parallel)', 'float') &amp;gt; 0<br />
OPTION (MAXDOP 1)</div></div>
<p><strong>Recherche de tous les plans qui utilisent un index:</strong><br />
<em>inspiré de <a href="http://stackoverflow.com/questions/17572261/how-to-filter-xml-execution-plan-data-in-a-where-clause-using-tsql" target="_blank">http://stackoverflow.com/questions/17572261/how-to-filter-xml-execution-plan-data-in-a-where-clause-using-tsql</a></em></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED<br />
<br />
DECLARE @IndexName nvarchar(100) = '[I_CDRRating_Status_SubscriberId_BillingPopulationId]';<br />
<br />
WITH XMLNAMESPACES (default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')<br />
SELECT OBJECT_NAME(qp.objectid, qp.dbid) as obj,<br />
&nbsp; &nbsp; st.text,<br />
&nbsp; &nbsp; cp.usecounts,<br />
&nbsp; &nbsp; cp.objtype,<br />
&nbsp; &nbsp; qp.query_plan.value('(//RelOp[IndexScan/Object/@Index = sql:variable(&quot;@IndexName&quot;)]/@PhysicalOp)[1]', 'varchar(50)') as usage,<br />
&nbsp; &nbsp; qp.query_plan<br />
FROM sys.dm_exec_cached_plans cp<br />
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp<br />
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st<br />
where --cp.objtype = 'Proc' and<br />
&nbsp; &nbsp; &nbsp; qp.query_plan.exist('//RelOp[<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (@PhysicalOp = &quot;Index Seek&quot; or @PhysicalOp = &quot;Index Scan&quot;) and <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IndexScan/Object/@Index = sql:variable(&quot;@IndexName&quot;)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ]') = 1<br />
ORDER BY cp.usecounts DESC<br />
OPTION (MAXDOP 1);</div></div>
<p><strong>Retrouver les index manquants dans les plans d&rsquo;exécution en cache:</strong><br />
Un requête est disponible pour ce faire sur cette entrée de blog de Jason Strate.<br />
<a href="http://www.jasonstrate.com/2010/12/can-you-dig-it-missing-indexes/" target="_blank">http://www.jasonstrate.com/2010/12/can-you-dig-it-missing-indexes/</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>exporter la structure d&#8217;une base avec Powershell</title>
		<link>https://blog.developpez.com/babaluga/p12320/powershell/exporter-la-structure-dune-base-avec-powershell</link>
		<comments>https://blog.developpez.com/babaluga/p12320/powershell/exporter-la-structure-dune-base-avec-powershell#comments</comments>
		<pubDate>Sat, 09 Nov 2013 23:09:51 +0000</pubDate>
		<dc:creator><![CDATA[rudib]]></dc:creator>
				<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/babaluga/?p=31</guid>
		<description><![CDATA[Le code ci-dessous peut être sauvegardé dans un fichier .ps1, pour être utilisé comme script. Changez simplement l&#8217;adresse de votre serveur SQL à la ligne 3, et le chemin de sauvegarde des scripts à la ligne 17. Il va exporter toutes les structures de vos bases de données dans des sous-répertoires, dans un répertoire nommé [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Le code ci-dessous peut être sauvegardé dans un fichier .ps1, pour être utilisé comme script. Changez simplement l&rsquo;adresse de votre serveur SQL à la ligne 3, et le chemin de sauvegarde des scripts à la ligne 17. Il va exporter toutes les structures de vos bases de données dans des sous-répertoires, dans un répertoire nommé selon le moment de l&rsquo;exécution. Cela vous permet de conserver plusieurs versions de votre export, et d&rsquo;utiliser un programme de diff (comme <a href="http://sourceforge.net/projects/winmerge/" title="WinMerge" target="_blank">WinMerge</a>) pour voir les différences.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[System.Reflection.Assembly]::LoadWithPartialName(&quot;Microsoft.SqlServer.Smo&quot;) | out-null<br />
<br />
$srv = New-Object &quot;Microsoft.SqlServer.Management.Smo.Server&quot; &quot;.\SQL2008&quot; <br />
$so = New-Object &quot;Microsoft.SqlServer.Management.Smo.ScriptingOptions&quot;;<br />
#$so.ScriptDrops = $TRUE;<br />
$so.IncludeIfNotExists = $TRUE;<br />
$so.AppendToFile = $FALSE<br />
$so.ToFileOnly = $TRUE<br />
$so.AnsiFile = $TRUE<br />
$so.ConvertUserDefinedDataTypesToBaseType = $TRUE<br />
$so.DriAll = $TRUE<br />
$so.Permissions = $TRUE<br />
$so.Triggers = $TRUE<br />
$so.PrimaryObject = $TRUE<br />
<br />
#$path = &quot;~/db_scripts/&quot;<br />
$path = &quot;c:/temp/db_scripts/$((Get-Date f 'yyyyMMdd-HHmm'))/&quot;<br />
if (!(Test-Path -path $path)) { Mkdir $path }<br />
<br />
foreach ($db in $srv.Databases) {<br />
&nbsp; &nbsp; if (!$db.IsSystemObject) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; $localPath = $path+$db.Name+&quot;/&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!(Test-Path -path ($localPath))) { Mkdir ($localPath) }<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!(Test-Path -path ($localPath+&quot;tables/&quot;))) { Mkdir ($localPath+&quot;tables/&quot;) }<br />
&nbsp; &nbsp; &nbsp; &nbsp; foreach ($tbl in $db.tables) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!$tbl.IsSystemObject) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $so.FileName = $localPath+&quot;tables/&quot;+$tbl.Schema+&quot;.&quot;+$tbl.Name+&quot;.tbl.sql&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #Write-Host &quot;criture de $($tbl.Name) dans $($so.FileName)&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $so.FileName<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $tbl.Script($so)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #$tbl.Script($so) &amp;gt; [$tbl.Name].tbl.sql<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } # if (!$tbl.IsSystemObject)<br />
&nbsp; &nbsp; &nbsp; &nbsp; } # foreach $tbl<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!(Test-Path -path ($localPath+&quot;procedures/&quot;))) { Mkdir ($localPath+&quot;procedures/&quot;) }<br />
&nbsp; &nbsp; &nbsp; &nbsp; foreach ($sp in $db.StoredProcedures) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!$sp.IsSystemObject) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $so.FileName = $localPath+&quot;procedures/&quot;+$sp.Schema+&quot;.&quot;+$sp.Name+&quot;.sp.sql&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $so.FileName<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $sp.Script($so)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } # if (!$tbl.IsSystemObject)<br />
&nbsp; &nbsp; &nbsp; &nbsp; } # foreach $sp<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (!(Test-Path -path ($localPath+&quot;vues/&quot;))) { Mkdir ($localPath+&quot;vues/&quot;) }<br />
&nbsp; &nbsp; &nbsp; &nbsp; foreach ($vw in $db.Views) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!$vw.IsSystemObject) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $so.FileName = $localPath+&quot;vues/&quot;+$vw.Schema+&quot;.&quot;+$vw.Name+&quot;.view.sql&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $so.FileName<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $vw.Script($so)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } # if (!$tbl.IsSystemObject)<br />
&nbsp; &nbsp; &nbsp; &nbsp; } # foreach $vw<br />
&nbsp; &nbsp; } # if ($db.IsSystemObject)<br />
} # foreach $db</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>fonction UPDATE() dans un déclencheur</title>
		<link>https://blog.developpez.com/babaluga/p12319/t-sql/fonction-update-dans-un-declencheur</link>
		<comments>https://blog.developpez.com/babaluga/p12319/t-sql/fonction-update-dans-un-declencheur#comments</comments>
		<pubDate>Sat, 09 Nov 2013 22:12:40 +0000</pubDate>
		<dc:creator><![CDATA[rudib]]></dc:creator>
				<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/babaluga/?p=16</guid>
		<description><![CDATA[Attention à la fonction UPDATE() utilisée dans les déclencheures (triggers). Ne pensez pas que cela vous indique que la valeur de la colonne a changé, mais simplement que la colonne a été mentionnée dans l&#8217;instruction. Un exemple : USE tempdb; GO CREATE TABLE dbo.Contact &#40;Id INT, Name VARCHAR&#40;50&#41;&#41; GO INSERT INTO dbo.Contact VALUES &#40;1, 'Fillon'&#41;, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Attention à la fonction UPDATE() utilisée dans les déclencheures (triggers).<br />
Ne pensez pas que cela vous indique que la valeur de la colonne a changé, mais simplement<br />
que la colonne a été mentionnée dans l&rsquo;instruction. Un exemple :</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">USE</span> tempdb;<br />
<span style="color: #993333; font-weight: bold;">GO</span><br />
<br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> dbo<span style="color: #66cc66;">.</span>Contact <span style="color: #66cc66;">&#40;</span>Id <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">,</span> Name <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #993333; font-weight: bold;">GO</span><br />
<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> dbo<span style="color: #66cc66;">.</span>Contact <br />
<span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Fillon'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Copé'</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> atr_u_Contact<br />
<span style="color: #993333; font-weight: bold;">ON</span> dbo<span style="color: #66cc66;">.</span>Contact <br />
AFTER <span style="color: #993333; font-weight: bold;">UPDATE</span><br />
<span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #993333; font-weight: bold;">BEGIN</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">UPDATE</span><span style="color: #66cc66;">&#40;</span>Name<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; PRINT <span style="color: #ff0000;">'ok'</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ELSE</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; PRINT <span style="color: #ff0000;">'non'</span><br />
<span style="color: #993333; font-weight: bold;">END</span><br />
<br />
<span style="color: #993333; font-weight: bold;">UPDATE</span> dbo<span style="color: #66cc66;">.</span>Contact <br />
<span style="color: #993333; font-weight: bold;">SET</span> Name <span style="color: #66cc66;">=</span> Name<br />
<span style="color: #993333; font-weight: bold;">WHERE</span> Id <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span>;<br />
<span style="color: #808080; font-style: italic;">-- affiche oui</span><br />
<br />
<span style="color: #993333; font-weight: bold;">UPDATE</span> dbo<span style="color: #66cc66;">.</span>Contact <br />
<span style="color: #993333; font-weight: bold;">SET</span> Id <span style="color: #66cc66;">=</span> Id<br />
<span style="color: #993333; font-weight: bold;">WHERE</span> Id <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span>;<br />
<span style="color: #808080; font-style: italic;">-- affiche non</span></div></div>
<p>Donc il vaut mieux tester s&rsquo;il y a eu réellement une modification avant d&rsquo;exécuter tout le reste. Par exemple, à la place de ceci :</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> atr_u_Contact<br />
<span style="color: #993333; font-weight: bold;">ON</span> dbo<span style="color: #66cc66;">.</span>Contact <br />
AFTER <span style="color: #993333; font-weight: bold;">UPDATE</span><br />
<span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #993333; font-weight: bold;">BEGIN</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">UPDATE</span><span style="color: #66cc66;">&#40;</span>Name<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> ContactHistory <span style="color: #66cc66;">&#40;</span>Id<span style="color: #66cc66;">,</span> Name<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">SELECT</span> Id<span style="color: #66cc66;">,</span> Name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">FROM</span> deleted;<br />
<span style="color: #993333; font-weight: bold;">END</span></div></div>
<p>ceci :</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> atr_u_Contact<br />
<span style="color: #993333; font-weight: bold;">ON</span> dbo<span style="color: #66cc66;">.</span>Contact <br />
AFTER <span style="color: #993333; font-weight: bold;">UPDATE</span><br />
<span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #993333; font-weight: bold;">BEGIN</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">IF</span> @@ROWCOUNT <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #993333; font-weight: bold;">RETURN</span><br />
<br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">UPDATE</span><span style="color: #66cc66;">&#40;</span>Name<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> ContactHistory <span style="color: #66cc66;">&#40;</span>Id<span style="color: #66cc66;">,</span> Name<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">SELECT</span> d<span style="color: #66cc66;">.</span>Id<span style="color: #66cc66;">,</span> d<span style="color: #66cc66;">.</span>Name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">FROM</span> deleted d<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">JOIN</span> inserted i <span style="color: #993333; font-weight: bold;">ON</span> d<span style="color: #66cc66;">.</span>Id <span style="color: #66cc66;">=</span> i<span style="color: #66cc66;">.</span>Id<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">WHERE</span> d<span style="color: #66cc66;">.</span>Name &nbsp;i<span style="color: #66cc66;">.</span>Name;<br />
<span style="color: #993333; font-weight: bold;">END</span></div></div>
<p>Ici nous ajoutons aussi, en toute première ligne (c&rsquo;est important), l&rsquo;instruction</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">IF</span> @@ROWCOUNT <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #993333; font-weight: bold;">RETURN</span></div></div>
<p>pour tester si le déclencheur est appelé pour une bonne raison. En effet, une instruction comme celle-ci:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">UPDATE</span> dbo<span style="color: #66cc66;">.</span>Contact<br />
<span style="color: #993333; font-weight: bold;">SET</span> Name <span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">UPPER</span><span style="color: #66cc66;">&#40;</span>Name<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>;</div></div>
<p>n’affecterait aucune ligne, mais appellerait pourtant le déclencheur, qui lancerait des requêtes pour rien. Le test sur @@ROWCOUNT permet de sortir immédiatement du trigger si aucune ligne n&rsquo;a été affectée.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
