Bonjour,

Je viens de faire face à un curieux problème, que j'ai contourné, mais vos avis m'intéressent sur ce 'truc' :

Je précise que j'ai le soucis sur un SQL Server 2008 SP3 64bits
Voici donc la requête (simplifiée le plus possible pour illustrer le pb) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
  declare @test as table(string varchar(10))
  insert into @test values('01234 aaaa')
  insert into @test values('12345 bbbb')
  insert into @test values('cccccccccc')
 
  select sub.ceci_est_un_integer
  from
  (
	  select convert(integer,left(string,2)) ceci_est_un_integer
	  from @test
	  where string like '[0-9][0-9]%'
  ) as sub
Jusque là, tout va bien, j'ai bien comme résultat, les valeurs int 1 et 12.

Et là, je rajoute juste un petit where :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
  declare @test as table(string varchar(10))
  insert into @test values('01234 aaaa')
  insert into @test values('12345 bbbb')
  insert into @test values('cccccccccc')
 
  select sub.ceci_est_un_integer
  from
  (
	  select convert(integer,left(string,2)) ceci_est_un_integer
	  from @test
	  where string like '[0-9][0-9]%'
  ) as sub
  where sub.ceci_est_un_integer > 1
Et paf :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
(1 row(s) affected)
(1 row(s) affected)
(1 row(s) affected)
Msg 245, Level 16, State 1, Line 6
Conversion failed when converting the varchar value 'cc' to data type int.
==> Je suppose que le SGBD tente de simplifier la requête, mais même si j'écris la requête de la sorte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
  select convert(integer,left(string,2)) ceci_est_un_integer
  from @test
  where string like '[0-9][0-9]%'
  and convert(integer,left(string,2)) > 1
Et bien ça fonctionne.

Du coup, qu'en pensez-vous ?