2017-03-24 2 views
-1

J'essaie de comparer une table et une table de rapport comme une preuve de test, avec la table de rapport contenant un ID de 12 caractères plus leur date de naissance, et la table source ayant seulement un ID.sql gauche convertit char en int?

select cast(ID as char(12)) as ID into #IDnums 
from members 
where client='some_client' 

select ID 
from #IDnums 
where ID not in (
    select left(12,rtrim(ltrim(memberID))) 
    from report_table 
    ) 

memberID est un champ char (50). Quand je lance ce que j'obtiens l'erreur:

The conversion of the varchar value '74857358238119880131' overflowed an int column.

Je ne sais pas où le varchar ou int vient, ou comment résoudre ce problème.

+1

Tag les DBMS que vous utilisez. Certains non-ANSI SQL là ... – jarlh

+3

bien, vous utilisez mal 'LEFT', il est censé être la chaîne en premier, et la longueur plus tard:' left (rtrim (ltrim (memberID)), 12) ' – Lamak

Répondre

2

Lorsque vous utilisez left() le premier argument est la chaîne et le deuxième argument est la longueur. Par conséquent, il interprète l'expression sur memberid comme un nombre entier. C'est là que la conversion échoue. Vous voulez:

select ID 
from #IDnums 
where ID not in (select left(rtrim(ltrim(memberID)), 12) from report_table); 

Je considère comme une mauvaise habitude d'utiliser not in avec une sous-requête. Le problème est ce qui se passe si memberId est NULL. Dans ce cas, not in ne renvoie aucune ligne. C'est pourquoi je suggère d'utiliser not exists à la place.

Je ne comprends pas non plus pourquoi vous utilisez une table temporaire. Est-ce que faire ce que vous voulez:

select id 
from members m 
where not exists (select 1 
        from report_table rt 
        where left(rt.memberId, 12) = cast(m.id as varchar(12)) 
       ); 

ou:

select id 
from members m 
where not exists (select 1 
        from report_table rt 
        where rt.memberId like concat(m.id, '%') 
       );