<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
	
	>
<channel>
	<title>Commentaires pour SQL &amp; SQL Server sans tabou</title>
	<atom:link href="https://blog.developpez.com/mssql-sans-tabou/comments/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/mssql-sans-tabou</link>
	<description></description>
	<lastBuildDate>Wed, 19 Sep 2012 15:51:43 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Commentaires sur Et si on se passait des clés étrangères ? par iberserk</title>
		<link>https://blog.developpez.com/mssql-sans-tabou/p11039/le-cote-obscure/sans_fk#comment-16</link>
		<dc:creator><![CDATA[iberserk]]></dc:creator>
		<pubDate>Wed, 19 Sep 2012 15:51:43 +0000</pubDate>
		<guid isPermaLink="false">#comment-16</guid>
		<description><![CDATA[Ce n&#039;est pas spécialement pour abonder dans le sens de SQLPRO mais votre approche me semble bien naïve...
Vous partez du POSTULAT que votre &quot;technique&quot; est infaillible car &quot;tout le monde il est gentil tout le monde il est compétent, et personne ne ferait de requête en oubliant la jointure&quot;.

Et bien on ne vit pas dans le même monde...

Impossible pour moi de cautionner cela, il y aura toujours des &quot;boulettes&quot; de faites d&#039;autant plus probables à la vue du niveau moyen en SQL des développeurs (non DBA j&#039;entends...)...

La preuve même les japonais se sont fait avoir :-)

J&#039;en reste là...]]></description>
		<content:encoded><![CDATA[<p>Ce n&rsquo;est pas spécialement pour abonder dans le sens de SQLPRO mais votre approche me semble bien naïve&#8230;<br />
Vous partez du POSTULAT que votre &laquo;&nbsp;technique&nbsp;&raquo; est infaillible car &laquo;&nbsp;tout le monde il est gentil tout le monde il est compétent, et personne ne ferait de requête en oubliant la jointure&nbsp;&raquo;.</p>
<p>Et bien on ne vit pas dans le même monde&#8230;</p>
<p>Impossible pour moi de cautionner cela, il y aura toujours des &laquo;&nbsp;boulettes&nbsp;&raquo; de faites d&rsquo;autant plus probables à la vue du niveau moyen en SQL des développeurs (non DBA j&rsquo;entends&#8230;)&#8230;</p>
<p>La preuve même les japonais se sont fait avoir <img src="https://blog.developpez.com/mssql-sans-tabou/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /></p>
<p>J&rsquo;en reste là&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Commentaires sur Quand les fonctions tables surpassent les vues et CTE. par iberserk</title>
		<link>https://blog.developpez.com/mssql-sans-tabou/p11057/le-cote-obscure/function_vs_cte#comment-15</link>
		<dc:creator><![CDATA[iberserk]]></dc:creator>
		<pubDate>Wed, 19 Sep 2012 15:17:40 +0000</pubDate>
		<guid isPermaLink="false">#comment-15</guid>
		<description><![CDATA[Le résultat que vous souhaitez obtenir n&#039;a rien à voir avec la récursivité utilisée dans votre CTE (CTE ne veux pas dire récursif au passage....)???

Vous pouvez appliquer cette logique à n&#039;importe qu&#039;elle auto-jointure si vous allez par là...]]></description>
		<content:encoded><![CDATA[<p>Le résultat que vous souhaitez obtenir n&rsquo;a rien à voir avec la récursivité utilisée dans votre CTE (CTE ne veux pas dire récursif au passage&#8230;.)???</p>
<p>Vous pouvez appliquer cette logique à n&rsquo;importe qu&rsquo;elle auto-jointure si vous allez par là&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Commentaires sur Quelques choses à savoir sur les espaces en fin de chaîne par zinzineti</title>
		<link>https://blog.developpez.com/mssql-sans-tabou/p11117/bon-a-savoir/quelques_choses_a_savoir_sur_les_espaces#comment-13</link>
		<dc:creator><![CDATA[zinzineti]]></dc:creator>
		<pubDate>Thu, 28 Jun 2012 22:14:13 +0000</pubDate>
		<guid isPermaLink="false">#comment-13</guid>
		<description><![CDATA[http://blog.developpez.com/zinzineti/p10550/sql-server-2008/attention-a-la-fonction-len/]]></description>
		<content:encoded><![CDATA[<p><a href="http://blog.developpez.com/zinzineti/p10550/sql-server-2008/attention-a-la-fonction-len/" rel="nofollow">http://blog.developpez.com/zinzineti/p10550/sql-server-2008/attention-a-la-fonction-len/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>Commentaires sur Assigner des variables et renvoyer un résultat en une seule  opération par sergejack</title>
		<link>https://blog.developpez.com/mssql-sans-tabou/p11074/le-cote-obscure/variable_n_return#comment-8</link>
		<dc:creator><![CDATA[sergejack]]></dc:creator>
		<pubDate>Wed, 27 Jun 2012 13:39:18 +0000</pubDate>
		<guid isPermaLink="false">#comment-8</guid>
		<description><![CDATA[Voici un exemple plus &quot;viril&quot; qui peut vous aider à cerner les gains de performance que cette approche peut amener:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;&#160;&lt;br /&gt;
SET NOCOUNT ON&#160;&lt;br /&gt;
SET STATISTICS TIME OFF&#160;&lt;br /&gt;
SET STATISTICS IO OFF&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
IF Object_ID(&#039;dbo.t388Part&#039;, &#039;U&#039;) IS NOT NULL DROP TABLE dbo.t388Part;&#160;&lt;br /&gt;
IF Object_ID(&#039;dbo.t388Article&#039;, &#039;U&#039;) IS NOT NULL DROP TABLE dbo.t388Article;&#160;&lt;br /&gt;
IF Object_ID(&#039;dbo.t388Blacklist&#039;, &#039;U&#039;) IS NOT NULL DROP TABLE dbo.t388Blacklist;&#160;&lt;br /&gt;
GO&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
SELECT&#160;&lt;br /&gt;
&#160;   Src.Name -- Non unique&#160;&lt;br /&gt;
&#160;   , N&#039;&#160;&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet urna at nulla aliquam vulputate quis eget dui. Quisque ac mauris lorem. Donec sed neque nec urna tincidunt ultrices et eleifend nunc. Sed nunc nunc, egestas at rhoncus at, lacinia at risus. Sed tincidunt odio nec felis lacinia ac vestibulum urna sodales. Curabitur egestas elementum mauris non consequat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum venenatis ipsum vel metus euismod posuere vitae a odio. Mauris eget est vel massa dapibus vestibulum a at ipsum. Quisque vel libero nec justo posuere ultrices. Morbi volutpat dapibus ornare. Nulla facilisis lobortis pretium. Phasellus leo mauris, suscipit eget imperdiet sit amet, egestas non urna. Fusce non euismod orci.&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
Proin a ligula risus, sed scelerisque orci. Fusce imperdiet viverra est eu pretium. Sed nibh erat, volutpat at hendrerit interdum, bibendum sed libero. Pellentesque ut ullamcorper felis. In hac habitasse platea dictumst. Morbi ut quam bibendum arcu rhoncus tempus a id ipsum. Aliquam ornare mollis magna, vitae fermentum nisi viverra quis. Nulla lectus felis, suscipit vel viverra nec, pharetra ut elit. Nulla a bibendum ipsum. Sed odio quam, dignissim in fermentum at, rutrum id mauris.&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
Nunc congue dictum dolor, a tristique quam sollicitudin a. Nullam nec ornare ipsum. Quisque id dignissim magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus scelerisque arcu et dui porttitor varius. Proin at nisl odio, ut vehicula nulla. Curabitur tempus lobortis aliquet. Quisque quis enim orci, varius commodo felis. Mauris non ligula in sem euismod dapibus.&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
Aliquam convallis consequat quam, sed suscipit justo fermentum commodo. Aliquam elit libero, placerat sit amet posuere in, malesuada quis massa. Morbi hendrerit enim non sapien congue sit amet tristique sem aliquet. Ut sed justo ac tellus pellentesque gravida sed a est. Integer ut imperdiet arcu. Curabitur volutpat sagittis massa vitae faucibus. Phasellus aliquam, erat quis tempus porta, dui massa molestie orci, sit amet suscipit augue arcu ut velit. Mauris ultrices erat lorem.&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
Proin eget augue sed dui condimentum faucibus vitae vel lectus. Curabitur turpis lacus, sodales id pellentesque eget, dictum et ligula. Curabitur malesuada ante vel ante aliquet convallis cursus mauris iaculis. Vestibulum commodo condimentum luctus. Nam nisl lacus, consequat vel suscipit ut, consectetur sed lorem. Cras eu consequat elit. Sed condimentum adipiscing magna vel interdum. Quisque interdum metus at nibh condimentum a commodo massa venenatis. Duis eget sem turpis, eu volutpat est. Aliquam molestie, quam sed varius pellentesque, leo est facilisis tortor, ut congue erat lorem non quam. Nam porta cursus consectetur. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus condimentum venenatis massa eget volutpat. Mauris at sem non nisi ultricies tristique at id urna. Curabitur volutpat, nunc sed dapibus hendrerit, mauris quam auctor ligula, sed semper sem est nec magna. &#160;&lt;br /&gt;
&#039; AS Txt&#160;&lt;br /&gt;
INTO t388Blacklist&#160;&lt;br /&gt;
FROM (&#160;&lt;br /&gt;
&#160;   VALUES(&#039;A%&#039;), (&#039;LAS%&#039;), (&#039;ERREM%&#039;), (&#039;CORPORA%&#039;), (&#039;AT%&#039;), (&#039;SEA%&#039;), (&#039;SIT%&#039;), (&#039;PETENTIUM%&#039;), (&#039;QUAERENDUM%&#039;), (&#039;EU%&#039;), (&#039;FASTIDII%&#039;), (&#039;OFFICIIS%&#039;), (&#039;MEI%&#039;), (&#039;AN%&#039;), (&#039;EST%&#039;), (&#039;TE%&#039;), (&#039;FABULAS%&#039;), (&#039;PERICULIS%&#039;), (&#039;EU%&#039;), (&#039;TATION%&#039;), (&#039;OFFICIIS%&#039;), (&#039;HIS%&#039;), (&#039;SIT%&#039;), (&#039;AUTEM%&#039;), (&#039;INVIDUNT%&#039;), (&#039;UT%&#039;)&#160;&lt;br /&gt;
) Src(Name);&#160;&lt;br /&gt;
GO&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
WITH A (N) AS (SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) X (N)),&#160;&lt;br /&gt;
B (N) AS (SELECT 1 FROM A A1, A A2, A A3),&#160;&lt;br /&gt;
C (N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) FROM B B1, B B2, B B3),&#160;&lt;br /&gt;
Nums AS (SELECT N FROM C WHERE N &lt;= 1000)&#160;&lt;br /&gt;
SELECT DISTINCT&#160;&lt;br /&gt;
&#160;   Src.Name + Convert(varchar(11), Nums.N) Name -- Unique&#160;&lt;br /&gt;
INTO t388Article&#160;&lt;br /&gt;
FROM&#160;&lt;br /&gt;
&#160;   (&#160;&lt;br /&gt;
&#160;        VALUES(&#039;STET&#039;), (&#039;PORRO&#039;), (&#039;PUTENT&#039;), (&#039;NO&#039;), (&#039;PRO&#039;), (&#039;DICO&#039;), (&#039;DOLORES&#039;), (&#039;ACCOMMODARE&#039;), (&#039;NEC&#039;), (&#039;EU&#039;), (&#039;USU&#039;), (&#039;TE&#039;), (&#039;ZRIL&#039;), (&#039;SCRIPSERIT&#039;), (&#039;NECESSITATIBUS&#039;), (&#039;IUS&#039;), (&#039;SUMO&#039;), (&#039;QUIDAM&#039;), (&#039;FACILISIS&#039;), (&#039;EA&#039;), (&#039;IUS&#039;), (&#039;AT&#039;), (&#039;ATQUI&#039;), (&#039;REFERRENTUR&#039;), (&#039;EA&#039;), (&#039;VIRIS&#039;), (&#039;OCURRERET&#039;), (&#039;CONSTITUAM&#039;), (&#039;MEI&#039;), (&#039;PRI&#039;), (&#039;IN&#039;), (&#039;IRIURE&#039;), (&#039;RECTEQUE&#039;), (&#039;VOLUPTATUM&#039;), (&#039;EX&#039;), (&#039;DOLORE&#039;), (&#039;PUTENT&#039;), (&#039;VOLUPTATUM&#039;), (&#039;USU&#039;)&#160;&lt;br /&gt;
&#160;   ) Src(Name)&#160;&lt;br /&gt;
&#160;   CROSS JOIN Nums&#160;&lt;br /&gt;
GO&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
SELECT&#160;&lt;br /&gt;
&#160;   A.Name refArticle,&#160;&lt;br /&gt;
&#160;   X.Number&#160;&lt;br /&gt;
INTO t388Part   &#160;&lt;br /&gt;
FROM&#160;&lt;br /&gt;
&#160;   t388Article A&#160;&lt;br /&gt;
&#160;   CROSS APPLY (&#160;&lt;br /&gt;
&#160;        SELECT ABS(CAST(CAST(NEWID() AS VARBINARY) AS BIGINT))&#160;&lt;br /&gt;
&#160;   ) Random (Number)&#160;&lt;br /&gt;
&#160;   -- 1 to 5 parts&#160;&lt;br /&gt;
&#160;   CROSS APPLY (&#160;&lt;br /&gt;
&#160;        SELECT&#160;&#160;Src.Number&#160;&lt;br /&gt;
&#160;        FROM (VALUES (1),(2),(3),(4),(5)) Src (Number)&#160;&lt;br /&gt;
&#160;        WHERE Src.Number &lt;= (Random.Number % 5) + 1&#160;&lt;br /&gt;
&#160;   ) X&#160;&lt;br /&gt;
GO&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
SET STATISTICS IO ON;&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
PRINT &#039;&#160;&lt;br /&gt;
No op&#160;&lt;br /&gt;
&#039;;&#160;&lt;br /&gt;
PRINT &#039;No op Step 1: Articles blacklisted more than once&#039;&#160;&lt;br /&gt;
&#160;   SELECT&#160;&lt;br /&gt;
&#160;        A.Name,&#160;&lt;br /&gt;
&#160;        BL.Txt,&#160;&lt;br /&gt;
&#160;        Count(*) NbBlacklist,&#160;&lt;br /&gt;
&#160;        Sum(CASE WHEN A.Name = BL.Name THEN 1 ELSE 0 END) ExactMatch&#160;&lt;br /&gt;
&#160;   FROM&#160;&lt;br /&gt;
&#160;       t388Article A&#160;&lt;br /&gt;
&#160;       INNER JOIN t388Blacklist BL&#160;&lt;br /&gt;
&#160;       &#160;&#160;ON A.Name LIKE BL.Name&#160;&lt;br /&gt;
&#160;   GROUP BY A.Name, BL.Txt&#160;&lt;br /&gt;
&#160;   HAVING Count(*) &gt;= 2;&#160;&lt;br /&gt;
PRINT &#039;&#039;;&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
PRINT &#039;No op Step 2: Related parts&#039;&#160;&lt;br /&gt;
SELECT&#160;&lt;br /&gt;
&#160;   P.refArticle,&#160;&lt;br /&gt;
&#160;   P.Number&#160;&lt;br /&gt;
FROM&#160;&lt;br /&gt;
&#160;   t388Part P&#160;&lt;br /&gt;
WHERE&#160;&lt;br /&gt;
&#160;   EXISTS (&#160;&lt;br /&gt;
&#160;       SELECT *&#160;&lt;br /&gt;
&#160;       FROM&#160;&lt;br /&gt;
&#160;       &#160;&#160;t388Article A&#160;&lt;br /&gt;
&#160;       &#160;&#160;INNER JOIN t388Blacklist BL&#160;&lt;br /&gt;
&#160;       &#160;&#160;&#160;&#160;ON A.Name LIKE BL.Name&#160;&lt;br /&gt;
&#160;       WHERE&#160;&lt;br /&gt;
&#160;       &#160;&#160;P.refArticle = A.Name&#160;&lt;br /&gt;
&#160;       GROUP BY A.Name, BL.Txt&#160;&lt;br /&gt;
&#160;       HAVING Count(*) &gt;= 2&#160;&lt;br /&gt;
&#160;   );&#160;&lt;br /&gt;
PRINT &#039;&#039;;&#160;&lt;br /&gt;
GO&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
PRINT &#039;&#160;&lt;br /&gt;
insert&#160;&lt;br /&gt;
&#039;;&#160;&lt;br /&gt;
PRINT &#039;insert Step 1: Articles blacklisted more than once&#039;;&#160;&lt;br /&gt;
DECLARE @tmp TABLE (&#160;&lt;br /&gt;
&#160;   Name varchar(Max),&#160;&lt;br /&gt;
&#160;   Txt NVARCHAR(MAX),&#160;&lt;br /&gt;
&#160;   NbBlacklist int,&#160;&lt;br /&gt;
&#160;   ExactMatch int&#160;&lt;br /&gt;
);&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
INSERT @tmp&#160;&lt;br /&gt;
OUTPUT inserted.*&#160;&lt;br /&gt;
SELECT&#160;&lt;br /&gt;
&#160;   A.Name,&#160;&lt;br /&gt;
&#160;   BL.Txt,&#160;&lt;br /&gt;
&#160;   Count(*) NbBlacklist,&#160;&lt;br /&gt;
&#160;   Sum(CASE WHEN A.Name = BL.Name THEN 1 ELSE 0 END) ExactMatch&#160;&lt;br /&gt;
FROM&#160;&lt;br /&gt;
&#160;   t388Article A&#160;&lt;br /&gt;
&#160;   INNER JOIN t388Blacklist BL&#160;&lt;br /&gt;
&#160;       ON A.Name LIKE BL.Name&#160;&lt;br /&gt;
GROUP BY A.Name, BL.Txt&#160;&lt;br /&gt;
HAVING Count(*) &gt;= 2;&#160;&lt;br /&gt;
PRINT &#039;&#039;;&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
PRINT &#039;insert Step 2: Related parts&#039;;&#160;&lt;br /&gt;
SELECT&#160;&lt;br /&gt;
&#160;   P.refArticle,&#160;&lt;br /&gt;
&#160;   P.Number&#160;&lt;br /&gt;
FROM&#160;&lt;br /&gt;
&#160;   t388Part P&#160;&lt;br /&gt;
&#160;   INNER JOIN @tmp T&#160;&lt;br /&gt;
&#160;       ON P.refArticle = T.Name;&#160;&lt;br /&gt;
PRINT &#039;&#039;;&#160;&lt;br /&gt;
GO&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
PRINT &#039;&#160;&lt;br /&gt;
Merge&#160;&lt;br /&gt;
&#039;;&#160;&lt;br /&gt;
PRINT &#039;Merge Step 1: Articles blacklisted more than once&#039;;&#160;&lt;br /&gt;
DECLARE @tmp TABLE (&#160;&lt;br /&gt;
&#160;   Name varchar(MAX)&#160;&lt;br /&gt;
);&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
MERGE @tmp T&#160;&lt;br /&gt;
USING (&#160;&lt;br /&gt;
&#160;   SELECT&#160;&lt;br /&gt;
&#160;       A.Name,&#160;&lt;br /&gt;
&#160;       BL.Txt,&#160;&lt;br /&gt;
&#160;       Count(*) NbBlacklist,&#160;&lt;br /&gt;
&#160;       Sum(CASE WHEN A.Name = BL.Name THEN 1 ELSE 0 END) ExactMatch&#160;&lt;br /&gt;
&#160;   FROM&#160;&lt;br /&gt;
&#160;       t388Article A&#160;&lt;br /&gt;
&#160;       INNER JOIN t388Blacklist BL&#160;&lt;br /&gt;
&#160;       &#160;&#160;ON A.Name LIKE BL.Name&#160;&lt;br /&gt;
&#160;   GROUP BY A.Name, BL.Txt&#160;&lt;br /&gt;
&#160;   HAVING Count(*) &gt;= 2&#160;&lt;br /&gt;
) Src&#160;&lt;br /&gt;
ON 1 = 2&#160;&lt;br /&gt;
WHEN NOT MATCHED THEN&#160;&lt;br /&gt;
&#160;   INSERT (Name)&#160;&lt;br /&gt;
&#160;   VALUES (Src.Name)&#160;&lt;br /&gt;
OUTPUT Src.*;&#160;&lt;br /&gt;
PRINT &#039;&#039;;&#160;&lt;br /&gt;
&#160;&lt;br /&gt;
PRINT &#039;Merge Step 2: Related parts&#039;&#160;&lt;br /&gt;
SELECT&#160;&lt;br /&gt;
&#160;   P.refArticle,&#160;&lt;br /&gt;
&#160;   P.Number&#160;&lt;br /&gt;
FROM&#160;&lt;br /&gt;
&#160;   t388Part P&#160;&lt;br /&gt;
&#160;   INNER JOIN @tmp T&#160;&lt;br /&gt;
&#160;       ON P.refArticle = T.Name;&#160;&lt;br /&gt;
PRINT &#039;&#039;;&#160;&lt;br /&gt;
GO&#160;&lt;br /&gt;
&lt;/code&gt;&lt;/pre&gt;]]></description>
		<content:encoded><![CDATA[<p>Voici un exemple plus &laquo;&nbsp;viril&nbsp;&raquo; qui peut vous aider à cerner les gains de performance que cette approche peut amener:</p>
<pre>

<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">&amp;nbsp;&lt;br /&gt;<br />
SET NOCOUNT ON&amp;nbsp;&lt;br /&gt;<br />
SET STATISTICS TIME OFF&amp;nbsp;&lt;br /&gt;<br />
SET STATISTICS IO OFF&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
IF Object_ID('dbo.t388Part', 'U') IS NOT NULL DROP TABLE dbo.t388Part;&amp;nbsp;&lt;br /&gt;<br />
IF Object_ID('dbo.t388Article', 'U') IS NOT NULL DROP TABLE dbo.t388Article;&amp;nbsp;&lt;br /&gt;<br />
IF Object_ID('dbo.t388Blacklist', 'U') IS NOT NULL DROP TABLE dbo.t388Blacklist;&amp;nbsp;&lt;br /&gt;<br />
GO&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
SELECT&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; Src.Name -- Non unique&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; , N'&amp;nbsp;&lt;br /&gt;<br />
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet urna at nulla aliquam vulputate quis eget dui. Quisque ac mauris lorem. Donec sed neque nec urna tincidunt ultrices et eleifend nunc. Sed nunc nunc, egestas at rhoncus at, lacinia at risus. Sed tincidunt odio nec felis lacinia ac vestibulum urna sodales. Curabitur egestas elementum mauris non consequat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum venenatis ipsum vel metus euismod posuere vitae a odio. Mauris eget est vel massa dapibus vestibulum a at ipsum. Quisque vel libero nec justo posuere ultrices. Morbi volutpat dapibus ornare. Nulla facilisis lobortis pretium. Phasellus leo mauris, suscipit eget imperdiet sit amet, egestas non urna. Fusce non euismod orci.&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
Proin a ligula risus, sed scelerisque orci. Fusce imperdiet viverra est eu pretium. Sed nibh erat, volutpat at hendrerit interdum, bibendum sed libero. Pellentesque ut ullamcorper felis. In hac habitasse platea dictumst. Morbi ut quam bibendum arcu rhoncus tempus a id ipsum. Aliquam ornare mollis magna, vitae fermentum nisi viverra quis. Nulla lectus felis, suscipit vel viverra nec, pharetra ut elit. Nulla a bibendum ipsum. Sed odio quam, dignissim in fermentum at, rutrum id mauris.&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
Nunc congue dictum dolor, a tristique quam sollicitudin a. Nullam nec ornare ipsum. Quisque id dignissim magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus scelerisque arcu et dui porttitor varius. Proin at nisl odio, ut vehicula nulla. Curabitur tempus lobortis aliquet. Quisque quis enim orci, varius commodo felis. Mauris non ligula in sem euismod dapibus.&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
Aliquam convallis consequat quam, sed suscipit justo fermentum commodo. Aliquam elit libero, placerat sit amet posuere in, malesuada quis massa. Morbi hendrerit enim non sapien congue sit amet tristique sem aliquet. Ut sed justo ac tellus pellentesque gravida sed a est. Integer ut imperdiet arcu. Curabitur volutpat sagittis massa vitae faucibus. Phasellus aliquam, erat quis tempus porta, dui massa molestie orci, sit amet suscipit augue arcu ut velit. Mauris ultrices erat lorem.&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
Proin eget augue sed dui condimentum faucibus vitae vel lectus. Curabitur turpis lacus, sodales id pellentesque eget, dictum et ligula. Curabitur malesuada ante vel ante aliquet convallis cursus mauris iaculis. Vestibulum commodo condimentum luctus. Nam nisl lacus, consequat vel suscipit ut, consectetur sed lorem. Cras eu consequat elit. Sed condimentum adipiscing magna vel interdum. Quisque interdum metus at nibh condimentum a commodo massa venenatis. Duis eget sem turpis, eu volutpat est. Aliquam molestie, quam sed varius pellentesque, leo est facilisis tortor, ut congue erat lorem non quam. Nam porta cursus consectetur. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus condimentum venenatis massa eget volutpat. Mauris at sem non nisi ultricies tristique at id urna. Curabitur volutpat, nunc sed dapibus hendrerit, mauris quam auctor ligula, sed semper sem est nec magna. &amp;nbsp;&lt;br /&gt;<br />
' AS Txt&amp;nbsp;&lt;br /&gt;<br />
INTO t388Blacklist&amp;nbsp;&lt;br /&gt;<br />
FROM (&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; VALUES('A%'), ('LAS%'), ('ERREM%'), ('CORPORA%'), ('AT%'), ('SEA%'), ('SIT%'), ('PETENTIUM%'), ('QUAERENDUM%'), ('EU%'), ('FASTIDII%'), ('OFFICIIS%'), ('MEI%'), ('AN%'), ('EST%'), ('TE%'), ('FABULAS%'), ('PERICULIS%'), ('EU%'), ('TATION%'), ('OFFICIIS%'), ('HIS%'), ('SIT%'), ('AUTEM%'), ('INVIDUNT%'), ('UT%')&amp;nbsp;&lt;br /&gt;<br />
) Src(Name);&amp;nbsp;&lt;br /&gt;<br />
GO&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
WITH A (N) AS (SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) X (N)),&amp;nbsp;&lt;br /&gt;<br />
B (N) AS (SELECT 1 FROM A A1, A A2, A A3),&amp;nbsp;&lt;br /&gt;<br />
C (N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) FROM B B1, B B2, B B3),&amp;nbsp;&lt;br /&gt;<br />
Nums AS (SELECT N FROM C WHERE N &amp;lt;= 1000)&amp;nbsp;&lt;br /&gt;<br />
SELECT DISTINCT&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; Src.Name + Convert(varchar(11), Nums.N) Name -- Unique&amp;nbsp;&lt;br /&gt;<br />
INTO t388Article&amp;nbsp;&lt;br /&gt;<br />
FROM&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; (&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VALUES('STET'), ('PORRO'), ('PUTENT'), ('NO'), ('PRO'), ('DICO'), ('DOLORES'), ('ACCOMMODARE'), ('NEC'), ('EU'), ('USU'), ('TE'), ('ZRIL'), ('SCRIPSERIT'), ('NECESSITATIBUS'), ('IUS'), ('SUMO'), ('QUIDAM'), ('FACILISIS'), ('EA'), ('IUS'), ('AT'), ('ATQUI'), ('REFERRENTUR'), ('EA'), ('VIRIS'), ('OCURRERET'), ('CONSTITUAM'), ('MEI'), ('PRI'), ('IN'), ('IRIURE'), ('RECTEQUE'), ('VOLUPTATUM'), ('EX'), ('DOLORE'), ('PUTENT'), ('VOLUPTATUM'), ('USU')&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; ) Src(Name)&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; CROSS JOIN Nums&amp;nbsp;&lt;br /&gt;<br />
GO&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
SELECT&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; A.Name refArticle,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; X.Number&amp;nbsp;&lt;br /&gt;<br />
INTO t388Part &nbsp; &amp;nbsp;&lt;br /&gt;<br />
FROM&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; t388Article A&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; CROSS APPLY (&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SELECT ABS(CAST(CAST(NEWID() AS VARBINARY) AS BIGINT))&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; ) Random (Number)&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; -- 1 to 5 parts&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; CROSS APPLY (&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SELECT&amp;nbsp;&amp;nbsp;Src.Number&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FROM (VALUES (1),(2),(3),(4),(5)) Src (Number)&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WHERE Src.Number &amp;lt;= (Random.Number % 5) + 1&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; ) X&amp;nbsp;&lt;br /&gt;<br />
GO&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
SET STATISTICS IO ON;&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
PRINT '&amp;nbsp;&lt;br /&gt;<br />
No op&amp;nbsp;&lt;br /&gt;<br />
';&amp;nbsp;&lt;br /&gt;<br />
PRINT 'No op Step 1: Articles blacklisted more than once'&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; SELECT&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A.Name,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BL.Txt,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Count(*) NbBlacklist,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Sum(CASE WHEN A.Name = BL.Name THEN 1 ELSE 0 END) ExactMatch&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; FROM&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; t388Article A&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; INNER JOIN t388Blacklist BL&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &amp;nbsp;&amp;nbsp;ON A.Name LIKE BL.Name&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; GROUP BY A.Name, BL.Txt&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; HAVING Count(*) &amp;gt;= 2;&amp;nbsp;&lt;br /&gt;<br />
PRINT '';&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
PRINT 'No op Step 2: Related parts'&amp;nbsp;&lt;br /&gt;<br />
SELECT&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; P.refArticle,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; P.Number&amp;nbsp;&lt;br /&gt;<br />
FROM&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; t388Part P&amp;nbsp;&lt;br /&gt;<br />
WHERE&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; EXISTS (&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; SELECT *&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; FROM&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &amp;nbsp;&amp;nbsp;t388Article A&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &amp;nbsp;&amp;nbsp;INNER JOIN t388Blacklist BL&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ON A.Name LIKE BL.Name&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; WHERE&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &amp;nbsp;&amp;nbsp;P.refArticle = A.Name&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; GROUP BY A.Name, BL.Txt&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; HAVING Count(*) &amp;gt;= 2&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; );&amp;nbsp;&lt;br /&gt;<br />
PRINT '';&amp;nbsp;&lt;br /&gt;<br />
GO&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
PRINT '&amp;nbsp;&lt;br /&gt;<br />
insert&amp;nbsp;&lt;br /&gt;<br />
';&amp;nbsp;&lt;br /&gt;<br />
PRINT 'insert Step 1: Articles blacklisted more than once';&amp;nbsp;&lt;br /&gt;<br />
DECLARE @tmp TABLE (&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; Name varchar(Max),&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; Txt NVARCHAR(MAX),&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; NbBlacklist int,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; ExactMatch int&amp;nbsp;&lt;br /&gt;<br />
);&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
INSERT @tmp&amp;nbsp;&lt;br /&gt;<br />
OUTPUT inserted.*&amp;nbsp;&lt;br /&gt;<br />
SELECT&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; A.Name,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; BL.Txt,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; Count(*) NbBlacklist,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; Sum(CASE WHEN A.Name = BL.Name THEN 1 ELSE 0 END) ExactMatch&amp;nbsp;&lt;br /&gt;<br />
FROM&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; t388Article A&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; INNER JOIN t388Blacklist BL&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; ON A.Name LIKE BL.Name&amp;nbsp;&lt;br /&gt;<br />
GROUP BY A.Name, BL.Txt&amp;nbsp;&lt;br /&gt;<br />
HAVING Count(*) &amp;gt;= 2;&amp;nbsp;&lt;br /&gt;<br />
PRINT '';&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
PRINT 'insert Step 2: Related parts';&amp;nbsp;&lt;br /&gt;<br />
SELECT&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; P.refArticle,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; P.Number&amp;nbsp;&lt;br /&gt;<br />
FROM&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; t388Part P&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; INNER JOIN @tmp T&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; ON P.refArticle = T.Name;&amp;nbsp;&lt;br /&gt;<br />
PRINT '';&amp;nbsp;&lt;br /&gt;<br />
GO&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
PRINT '&amp;nbsp;&lt;br /&gt;<br />
Merge&amp;nbsp;&lt;br /&gt;<br />
';&amp;nbsp;&lt;br /&gt;<br />
PRINT 'Merge Step 1: Articles blacklisted more than once';&amp;nbsp;&lt;br /&gt;<br />
DECLARE @tmp TABLE (&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; Name varchar(MAX)&amp;nbsp;&lt;br /&gt;<br />
);&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
MERGE @tmp T&amp;nbsp;&lt;br /&gt;<br />
USING (&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; SELECT&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; A.Name,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; BL.Txt,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; Count(*) NbBlacklist,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; Sum(CASE WHEN A.Name = BL.Name THEN 1 ELSE 0 END) ExactMatch&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; FROM&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; t388Article A&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; INNER JOIN t388Blacklist BL&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; &amp;nbsp;&amp;nbsp;ON A.Name LIKE BL.Name&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; GROUP BY A.Name, BL.Txt&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; HAVING Count(*) &amp;gt;= 2&amp;nbsp;&lt;br /&gt;<br />
) Src&amp;nbsp;&lt;br /&gt;<br />
ON 1 = 2&amp;nbsp;&lt;br /&gt;<br />
WHEN NOT MATCHED THEN&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; INSERT (Name)&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; VALUES (Src.Name)&amp;nbsp;&lt;br /&gt;<br />
OUTPUT Src.*;&amp;nbsp;&lt;br /&gt;<br />
PRINT '';&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp;&lt;br /&gt;<br />
PRINT 'Merge Step 2: Related parts'&amp;nbsp;&lt;br /&gt;<br />
SELECT&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; P.refArticle,&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; P.Number&amp;nbsp;&lt;br /&gt;<br />
FROM&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; t388Part P&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; INNER JOIN @tmp T&amp;nbsp;&lt;br /&gt;<br />
&amp;nbsp; &nbsp; &nbsp; &nbsp; ON P.refArticle = T.Name;&amp;nbsp;&lt;br /&gt;<br />
PRINT '';&amp;nbsp;&lt;br /&gt;<br />
GO&amp;nbsp;&lt;br /&gt;</div></div>

</pre>
]]></content:encoded>
	</item>
	<item>
		<title>Commentaires sur Quelques choses à savoir sur les espaces en fin de chaîne par sergejack</title>
		<link>https://blog.developpez.com/mssql-sans-tabou/p11117/bon-a-savoir/quelques_choses_a_savoir_sur_les_espaces#comment-12</link>
		<dc:creator><![CDATA[sergejack]]></dc:creator>
		<pubDate>Wed, 27 Jun 2012 08:10:25 +0000</pubDate>
		<guid isPermaLink="false">#comment-12</guid>
		<description><![CDATA[DATALENGTH() renvoyant un résultat dépendant de l&#039;encodage (UNICODE par exemple), je préfère en éviter l&#039;emploi.&lt;br /&gt;
Alors même si DATALENGTH(&#039;abc &#039;) renverra bien 4 (puisqu&#039;il s&#039;agit d&#039;une chaîne non unicode où chaque lettre occupe un octet), je préfère utilisez LENGTH([chaîne unocide ou non] + &#039;.&#039;) - 1]]></description>
		<content:encoded><![CDATA[<p>DATALENGTH() renvoyant un résultat dépendant de l&rsquo;encodage (UNICODE par exemple), je préfère en éviter l&rsquo;emploi.<br />
Alors même si DATALENGTH(&lsquo;abc &lsquo;) renverra bien 4 (puisqu&rsquo;il s&rsquo;agit d&rsquo;une chaîne non unicode où chaque lettre occupe un octet), je préfère utilisez LENGTH([chaîne unocide ou non] + &lsquo;.&rsquo;) &#8211; 1</p>
]]></content:encoded>
	</item>
	<item>
		<title>Commentaires sur Quelques choses à savoir sur les espaces en fin de chaîne par elsuket</title>
		<link>https://blog.developpez.com/mssql-sans-tabou/p11117/bon-a-savoir/quelques_choses_a_savoir_sur_les_espaces#comment-11</link>
		<dc:creator><![CDATA[elsuket]]></dc:creator>
		<pubDate>Wed, 27 Jun 2012 00:29:31 +0000</pubDate>
		<guid isPermaLink="false">#comment-11</guid>
		<description><![CDATA[Bonjour SergeJack,&lt;br /&gt;
&lt;br /&gt;
En effet pour le dernier exemple, si l&#039;on souhaite prendre en compte les espaces, il faudra utiliser la fonction DATALENGTH() ;)&lt;br /&gt;
&lt;br /&gt;
@++ ;)]]></description>
		<content:encoded><![CDATA[<p>Bonjour SergeJack,</p>
<p>En effet pour le dernier exemple, si l&rsquo;on souhaite prendre en compte les espaces, il faudra utiliser la fonction DATALENGTH() <img src="https://blog.developpez.com/mssql-sans-tabou/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>@++ <img src="https://blog.developpez.com/mssql-sans-tabou/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
	</item>
	<item>
		<title>Commentaires sur Et si on se passait des clés étrangères ? par sergejack</title>
		<link>https://blog.developpez.com/mssql-sans-tabou/p11039/le-cote-obscure/sans_fk#comment-7</link>
		<dc:creator><![CDATA[sergejack]]></dc:creator>
		<pubDate>Thu, 21 Jun 2012 16:18:32 +0000</pubDate>
		<guid isPermaLink="false">#comment-7</guid>
		<description><![CDATA[Ce que vous dîtes, tout aussi croustillante soit-il, ne concerne pas la mécanique défendue dans ce billet.&lt;br /&gt;
Il s&#039;agit ici d&#039;un scénario tout à fait analogue à ce que vous avez l&#039;habitude de faire en jouant de SET DEFAULT.&lt;br /&gt;
&lt;br /&gt;
La seule différence (encore une fois, soulignée dans ce billet) est la nécessité de ne jamais récupérer/modifier/insérer des lignes &quot;dépendantes&quot; sans jointure avec les lignes &quot;influentes&quot; (à une ou plusieurs niveaux).&lt;br /&gt;
Si vos tomodachi avaient procédé ainsi (sans que cela aurait forcément été judicieux) il n&#039;auraient pas eu une seule ligne orpheline.&lt;br /&gt;
&lt;br /&gt;
Quant aux suppressions, elles sont faites par batch aux heures creuse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il existe des solutions robustes et performante où des tables de schemas différents sont en relation, comme quoi la vie sans FK est possible.]]></description>
		<content:encoded><![CDATA[<p>Ce que vous dîtes, tout aussi croustillante soit-il, ne concerne pas la mécanique défendue dans ce billet.<br />
Il s&rsquo;agit ici d&rsquo;un scénario tout à fait analogue à ce que vous avez l&rsquo;habitude de faire en jouant de SET DEFAULT.</p>
<p>La seule différence (encore une fois, soulignée dans ce billet) est la nécessité de ne jamais récupérer/modifier/insérer des lignes &laquo;&nbsp;dépendantes&nbsp;&raquo; sans jointure avec les lignes &laquo;&nbsp;influentes&nbsp;&raquo; (à une ou plusieurs niveaux).<br />
Si vos tomodachi avaient procédé ainsi (sans que cela aurait forcément été judicieux) il n&rsquo;auraient pas eu une seule ligne orpheline.</p>
<p>Quant aux suppressions, elles sont faites par batch aux heures creuse.</p>
<p>
Il existe des solutions robustes et performante où des tables de schemas différents sont en relation, comme quoi la vie sans FK est possible.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Commentaires sur Et si on se passait des clés étrangères ? par sqlpro</title>
		<link>https://blog.developpez.com/mssql-sans-tabou/p11039/le-cote-obscure/sans_fk#comment-6</link>
		<dc:creator><![CDATA[sqlpro]]></dc:creator>
		<pubDate>Thu, 21 Jun 2012 14:13:23 +0000</pubDate>
		<guid isPermaLink="false">#comment-6</guid>
		<description><![CDATA[Pour avoir fait depuis une vingtaine d&#039;années de nombreux audits de bases de données, je n&#039;ai jamais vu de base dans laquelle l&#039;absence de contrainte de clef étrangère FOREIGN KEY, et donc l&#039;absence d&#039;intégrité référentielle ne se traduisait pas en production par des lignes orphelines. &lt;br /&gt;
Expérience récente : chez un des grand constructeur de photocopieurs japonais, audit d&#039;une des plus grosse base de données de SAV client réalisée par l&#039;équipe japonaise. Les japonais étant très pointilleux sur la qualité, ils nous avaient assuré que l&#039;application gérait parfaitement l&#039;intégrité des données et qu&#039;en aucun cas ils avaient détecté d&#039;anomalies.&lt;br /&gt;
J&#039;ai d&#039;ailleurs été brillamment surpris : seules, deux tables avaient des lignes orphelines. L&#039;une, une seule ligne, l&#039;autre plusieurs, mais moins de 1% du volume total. &lt;br /&gt;
Lors de la remise de mon rapport d&#039;audit, j&#039;ai pointé du doigt cette problématique qui engendrait non seulement des problèmes de performances, mais aussi des statistiques fausses et des traitements mineurs erronés. &lt;br /&gt;
Mais on m&#039;a demandé de modifier mon rapport fournit en PDF, afin de supprimer ce paragraphe. L&#039;équipe française étant persuadé qu&#039;à la lecture du document les développeurs japonais allaient se faire harakiri...&lt;br /&gt;
&lt;br /&gt;
En fait il est mathématiquement impossible de réaliser l&#039;intégrité référentielle par du code applicatif, tout simplement parce que les bases de données fonctionnement d&#039;un SGBDR est ensembliste (modification d&#039;un ensemble de lignes de manière simultané) alors que le code applicatif est itératif, c&#039;est à dire agissant ligne à ligne.&lt;br /&gt;
&lt;br /&gt;
Notez que Frank Edgar Codd, pointe du doigt dès l&#039;origine, cette problématique dans sa règle n°12 :&lt;br /&gt;
&quot;&lt;br /&gt;
Non subversion : Il ne doit pas être possible de transgresser les règles d’intégrité et les contraintes&lt;br /&gt;
définies par le langage relationnel du SGBDR en utilisant un langage de plus bas&lt;br /&gt;
niveau (gérant une seule ligne à la fois).&lt;br /&gt;
&quot;&lt;br /&gt;
&lt;br /&gt;
A +&lt;br /&gt;
]]></description>
		<content:encoded><![CDATA[<p>Pour avoir fait depuis une vingtaine d&rsquo;années de nombreux audits de bases de données, je n&rsquo;ai jamais vu de base dans laquelle l&rsquo;absence de contrainte de clef étrangère FOREIGN KEY, et donc l&rsquo;absence d&rsquo;intégrité référentielle ne se traduisait pas en production par des lignes orphelines. <br />
Expérience récente : chez un des grand constructeur de photocopieurs japonais, audit d&rsquo;une des plus grosse base de données de SAV client réalisée par l&rsquo;équipe japonaise. Les japonais étant très pointilleux sur la qualité, ils nous avaient assuré que l&rsquo;application gérait parfaitement l&rsquo;intégrité des données et qu&rsquo;en aucun cas ils avaient détecté d&rsquo;anomalies.<br />
J&rsquo;ai d&rsquo;ailleurs été brillamment surpris : seules, deux tables avaient des lignes orphelines. L&rsquo;une, une seule ligne, l&rsquo;autre plusieurs, mais moins de 1% du volume total. <br />
Lors de la remise de mon rapport d&rsquo;audit, j&rsquo;ai pointé du doigt cette problématique qui engendrait non seulement des problèmes de performances, mais aussi des statistiques fausses et des traitements mineurs erronés. <br />
Mais on m&rsquo;a demandé de modifier mon rapport fournit en PDF, afin de supprimer ce paragraphe. L&rsquo;équipe française étant persuadé qu&rsquo;à la lecture du document les développeurs japonais allaient se faire harakiri&#8230;</p>
<p>En fait il est mathématiquement impossible de réaliser l&rsquo;intégrité référentielle par du code applicatif, tout simplement parce que les bases de données fonctionnement d&rsquo;un SGBDR est ensembliste (modification d&rsquo;un ensemble de lignes de manière simultané) alors que le code applicatif est itératif, c&rsquo;est à dire agissant ligne à ligne.</p>
<p>Notez que Frank Edgar Codd, pointe du doigt dès l&rsquo;origine, cette problématique dans sa règle n°12 :<br />
&laquo;&nbsp;<br />
Non subversion : Il ne doit pas être possible de transgresser les règles d’intégrité et les contraintes<br />
définies par le langage relationnel du SGBDR en utilisant un langage de plus bas<br />
niveau (gérant une seule ligne à la fois).<br />
&laquo;&nbsp;</p>
<p>A +</p>
]]></content:encoded>
	</item>
	<item>
		<title>Commentaires sur Et si on se passait des clés étrangères ? par sergejack</title>
		<link>https://blog.developpez.com/mssql-sans-tabou/p11039/le-cote-obscure/sans_fk#comment-5</link>
		<dc:creator><![CDATA[sergejack]]></dc:creator>
		<pubDate>Fri, 25 May 2012 11:37:43 +0000</pubDate>
		<guid isPermaLink="false">#comment-5</guid>
		<description><![CDATA[-Se passer des contraintes FK n&#039;a rien de stupide.-&lt;br /&gt;
&lt;br /&gt;
Cher Terminator (j&#039;ai bien vu votre présentation), la seule stupidité que je voit ici est celle de vos habituelles suffisance et entêtement.&lt;br /&gt;
&lt;br /&gt;
Pour rendre service aux lecteurs (qui souvent vous font confiance), je vais me permettre avant de vous répondre, de trancher un bon coup dans l&#039;aura de gourou qui vous entoure.&lt;br /&gt;
Vous vivez (bien, je suppose) de la diffusion de vos connaissances (livres, cours, etc.) et la contradiction de vos propos ne s’inscrit pas dans votre business plan.&lt;br /&gt;
Néanmoins, vous avez plus souvent que vous ne l&#039;imaginez tort et vous vous cramponnez aux seuls scénarios que vous même aillé envisagés ou rencontrés. Vous avez l&#039;entêtement d&#039;un Terminator et cela handicape très fortement le potentiel dont vous dotent vos connaissances (que j&#039;apprécie, figurez-vous).&lt;br /&gt;
&lt;br /&gt;
Maintenant, en réponse à votre remarque :&lt;br /&gt;
&lt;br /&gt;
1) Ne confondez pas contrainte et donnée.&lt;br /&gt;
&lt;br /&gt;
Je parle bien de supprimer la contrainte, je ne parle aucunement de dé-normaliser les tables.&lt;br /&gt;
Donc, les tables et jointures restent les même, seule la contrainte tombe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Les contraintes FK permettent de ne pas avoir à vérifier la jointure.&lt;br /&gt;
&lt;br /&gt;
Voici l&#039;optimisation à laquelle vous songez (et dont vous parlez dans votre présentation) :&lt;br /&gt;
Quand des tables sont mises en relations dans une requête et qu&#039;il existe une contrainte FK à cet effet, si aucune données de la table influente ne sont exploitées alors SQL Server ne va pas réellement faire la jointure.&lt;br /&gt;
&lt;br /&gt;
Si SQL Server peut faire fit d&#039;une jointure, le développeur de qualité en fera tout autant.&lt;br /&gt;
Car ce dernier aura la même présence d&#039;esprit que SQL Server de ne pas &quot;vérifier ce que la contrainte garantit déjà&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Je sais tout cela et je traite ce point dans le sujet.&lt;br /&gt;
Section &quot;Pourquoi pas&quot;, je me cite &quot;Cela n’est pas gênant quand, dans toutes vos requêtes, vous soumettez déjà les lectures des lignes dépendantes à leur relation aux lignes influentes&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voilà.&lt;br /&gt;
&lt;br /&gt;
En conclusion : se passer des contraintes FK n&#039;a rien de stupide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PS: Lorgnez un peu du côté de la communauté anglophone, ils sont bien plus créatifs (et moins bornés) que la communauté francophone dont vous êtes justement l&#039;un des étendards :-)]]></description>
		<content:encoded><![CDATA[<p>-Se passer des contraintes FK n&rsquo;a rien de stupide.-</p>
<p>Cher Terminator (j&rsquo;ai bien vu votre présentation), la seule stupidité que je voit ici est celle de vos habituelles suffisance et entêtement.</p>
<p>Pour rendre service aux lecteurs (qui souvent vous font confiance), je vais me permettre avant de vous répondre, de trancher un bon coup dans l&rsquo;aura de gourou qui vous entoure.<br />
Vous vivez (bien, je suppose) de la diffusion de vos connaissances (livres, cours, etc.) et la contradiction de vos propos ne s’inscrit pas dans votre business plan.<br />
Néanmoins, vous avez plus souvent que vous ne l&rsquo;imaginez tort et vous vous cramponnez aux seuls scénarios que vous même aillé envisagés ou rencontrés. Vous avez l&rsquo;entêtement d&rsquo;un Terminator et cela handicape très fortement le potentiel dont vous dotent vos connaissances (que j&rsquo;apprécie, figurez-vous).</p>
<p>Maintenant, en réponse à votre remarque :</p>
<p>1) Ne confondez pas contrainte et donnée.</p>
<p>Je parle bien de supprimer la contrainte, je ne parle aucunement de dé-normaliser les tables.<br />
Donc, les tables et jointures restent les même, seule la contrainte tombe.</p>
<p>
2) Les contraintes FK permettent de ne pas avoir à vérifier la jointure.</p>
<p>Voici l&rsquo;optimisation à laquelle vous songez (et dont vous parlez dans votre présentation) :<br />
Quand des tables sont mises en relations dans une requête et qu&rsquo;il existe une contrainte FK à cet effet, si aucune données de la table influente ne sont exploitées alors SQL Server ne va pas réellement faire la jointure.</p>
<p>Si SQL Server peut faire fit d&rsquo;une jointure, le développeur de qualité en fera tout autant.<br />
Car ce dernier aura la même présence d&rsquo;esprit que SQL Server de ne pas &laquo;&nbsp;vérifier ce que la contrainte garantit déjà&nbsp;&raquo;.</p>
<p>
Je sais tout cela et je traite ce point dans le sujet.<br />
Section &laquo;&nbsp;Pourquoi pas&nbsp;&raquo;, je me cite &laquo;&nbsp;Cela n’est pas gênant quand, dans toutes vos requêtes, vous soumettez déjà les lectures des lignes dépendantes à leur relation aux lignes influentes&nbsp;&raquo;.</p>
<p>
Voilà.</p>
<p>En conclusion : se passer des contraintes FK n&rsquo;a rien de stupide.</p>
<p>
PS: Lorgnez un peu du côté de la communauté anglophone, ils sont bien plus créatifs (et moins bornés) que la communauté francophone dont vous êtes justement l&rsquo;un des étendards <img src="https://blog.developpez.com/mssql-sans-tabou/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /></p>
]]></content:encoded>
	</item>
	<item>
		<title>Commentaires sur Et si on se passait des clés étrangères ? par sqlpro</title>
		<link>https://blog.developpez.com/mssql-sans-tabou/p11039/le-cote-obscure/sans_fk#comment-4</link>
		<dc:creator><![CDATA[sqlpro]]></dc:creator>
		<pubDate>Thu, 24 May 2012 17:53:11 +0000</pubDate>
		<guid isPermaLink="false">#comment-4</guid>
		<description><![CDATA[C&#039;est d&#039;autant plus stupide de se passer de clef étrangères (Foreign Keys) que certains SGBDR comme SQL Server dispose d&#039;une optimisation sémantique qui utilise les contraintes pour simplifier les plans de requêtes...&lt;br /&gt;
De plus il faudra se débarrasser des lignes orphelines en faisant des requêtes plus complexes, donc forcément plus couteuses.&lt;br /&gt;
Bref, croire que les contraintes c&#039;est couteux et que l&#039;on peut s&#039;en passer est toujours hautement stupide. C&#039;est une vue à court terme, qui à conduit de nombreux benêts à utiliser des SGBDR bas de gamme du genre MySQL et se trouver aujourd&#039;hui dans des impasses techniques et de performances dramatique, car ce que l&#039;on a pas fait dans les fondations, va rejaillir immanquablement en bien pire lors de la construction des étages :!!!&lt;br /&gt;
&lt;br /&gt;
Pour une idée sur l&#039;importance des contraintes pour l&#039;optimisation des requêtes, regardez la démo que j&#039;ai fait dans le cadre des SQL days 2011 chez Microsoft. Contraintes et performances / Journées SQL Server&lt;br /&gt;
&lt;br /&gt;
A +]]></description>
		<content:encoded><![CDATA[<p>C&rsquo;est d&rsquo;autant plus stupide de se passer de clef étrangères (Foreign Keys) que certains SGBDR comme SQL Server dispose d&rsquo;une optimisation sémantique qui utilise les contraintes pour simplifier les plans de requêtes&#8230;<br />
De plus il faudra se débarrasser des lignes orphelines en faisant des requêtes plus complexes, donc forcément plus couteuses.<br />
Bref, croire que les contraintes c&rsquo;est couteux et que l&rsquo;on peut s&rsquo;en passer est toujours hautement stupide. C&rsquo;est une vue à court terme, qui à conduit de nombreux benêts à utiliser des SGBDR bas de gamme du genre MySQL et se trouver aujourd&rsquo;hui dans des impasses techniques et de performances dramatique, car ce que l&rsquo;on a pas fait dans les fondations, va rejaillir immanquablement en bien pire lors de la construction des étages :!!!</p>
<p>Pour une idée sur l&rsquo;importance des contraintes pour l&rsquo;optimisation des requêtes, regardez la démo que j&rsquo;ai fait dans le cadre des SQL days 2011 chez Microsoft. Contraintes et performances / Journées SQL Server</p>
<p>A +</p>
]]></content:encoded>
	</item>
</channel>
</rss>
