{"id":15,"date":"2007-11-07T19:46:14","date_gmt":"2007-11-07T17:46:14","guid":{"rendered":"http:\/\/mayeur.com\/wordpressfr\/?p=15"},"modified":"2007-11-07T20:01:25","modified_gmt":"2007-11-07T18:01:25","slug":"sql-server-et-la-fonction-isnumeric","status":"publish","type":"post","link":"https:\/\/mayeur.com\/wordpressfr\/sql-server-et-la-fonction-isnumeric\/","title":{"rendered":"SQL Server et la fonction ISNUMERIC"},"content":{"rendered":"<p>La fonction ISNUMERIC de SQL Server est particuli\u00e8rement malicieuse, &#8230; surtout pour nous francophones.<\/p>\n<p>En effet, la <a target=\"_blank\" href=\"http:\/\/technet.microsoft.com\/fr-fr\/library\/ms186272.aspx\" title=\"documentation officielle ISNUMERIC\">documentation Microsoft<\/a> d\u00e9finie la chose suivante : <em>\u00ab\u00a0<\/em><em>Lorsque la valeur\u00a01 est retourn\u00e9e, ceci indique que l&rsquo;expression peut \u00eatre convertie au minimum en l&rsquo;un des types num\u00e9riques.<\/em><\/p>\n<p>Les types num\u00e9riques sont les suivants :<\/p>\n<table border=\"1\" width=\"100%\">\n<tr>\n<td><strong>int<\/strong><\/td>\n<td><strong>numeric<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>bigint<\/strong><\/td>\n<td><strong>money<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>smallint<\/strong><\/td>\n<td><strong>smallmoney<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>tinyint<\/strong><\/td>\n<td><strong>float<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>decimal<\/strong><\/td>\n<td><strong>real<\/strong><\/td>\n<\/tr>\n<\/table>\n<p>En fait, il faut bien avoir \u00e0 l&rsquo;esprit que les signes non <em>purement<\/em> num\u00e9riques tels que +, -, &lsquo;.&rsquo; &lsquo;,&rsquo;, $, &#8230;\u00a0sont tous pris en compte. Dans la pratique, la fonction ISNUMERIC garantie que la valeur est convertible dans le type MONEY au format am\u00e9ricain (la virgule pour s\u00e9parateur de millier, m\u00eame si la langue de l&rsquo;utilisateur SQL Server est French).<\/p>\n<p>\u00a0Ainsi le code suivant retourne une erreur :<\/p>\n<p><code>DECLARE @test VARCHAR(10)<br \/>\nSET @test='$10,1'<br \/>\nIF ISNUMERIC(@test)=1 PRINT CONVERT(DECIMAL(18,0),@test)<br \/>\n<\/code><\/p>\n<p>La solution est\u00a0de\u00a0remplacer les virgules par des points, puis de faire une double conversion en passant par le type MONEY ainsi par exemple\u00a0:<\/p>\n<p><code>DECLARE @test VARCHAR(10)<br \/>\nSET @test='$10,1'<br \/>\nIF ISNUMERIC(@test)=1<br \/>\n\u00a0\u00a0PRINT CONVERT(DECIMAL(18,0),<strong>CONVERT(MONEY,REPLACE(@test,',','.'))<\/strong>)<br \/>\n<\/code><\/p>\n<p>Il peut donc \u00eatre utile d&rsquo;\u00e9crire une fonction de conversion de la sorte :<br \/>\n<code><br \/>\nCREATE FUNCTION getNumeric(@str VARCHAR(50)) RETURNS MONEY<br \/>\nAS<br \/>\nBEGIN<br \/>\n\u00a0\u00a0DECLARE @ret MONEY<br \/>\n\u00a0\u00a0IF ISNUMERIC(@str)=1<br \/>\n\u00a0\u00a0\u00a0\u00a0SELECT @ret=CONVERT(MONEY,REPLACE(@str,',','.'))<br \/>\n\u00a0\u00a0RETURN @ret<br \/>\nEND<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La fonction ISNUMERIC de SQL Server est particuli\u00e8rement malicieuse, &#8230; surtout pour nous francophones. En effet, la documentation Microsoft d\u00e9finie la chose suivante : \u00ab\u00a0Lorsque la valeur\u00a01 est retourn\u00e9e, ceci indique que l&rsquo;expression peut \u00eatre convertie au minimum en l&rsquo;un des types num\u00e9riques. Les types num\u00e9riques sont les suivants : int numeric bigint money smallint [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[9],"tags":[],"class_list":["post-15","post","type-post","status-publish","format-standard","hentry","category-sql-server"],"_links":{"self":[{"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/posts\/15","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/comments?post=15"}],"version-history":[{"count":0,"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/posts\/15\/revisions"}],"wp:attachment":[{"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/media?parent=15"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/categories?post=15"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mayeur.com\/wordpressfr\/wp-json\/wp\/v2\/tags?post=15"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}