2016-11-30 4 views
0

Ich versuche, ein smallint-Feld in einem varchar-Feld zu verknüpfen. Ich brauche nur die ganzzahligen Werte, aber ich bekomme einen Fehler. Das varchar-Feld hat Integer und Strings. Ich brauche nicht das ID-Feld nur die DESC.Konversion an innerem Join fehlgeschlagen

Ich erhalte eine Fehlermeldung:

Conversion failed when converting the varchar value 'AWOL' to data type smallint.

Dies ist, was die Tabelle wie folgt aussehen:

================================== 
|ID  |DESC     | 
|==========|=====================| 
|ACAMPROCAL|acamprosate calcium | 
|----------|---------------------| 
|BUPROPION |bupropion   | 
|----------|---------------------| 
|1   |Other    | 
|----------|---------------------| 
|4   |Expired    | 
|----------|---------------------| 
|3   |Dschg    | 
|----------|---------------------| 
|AWOL  |Absence without Leave| 
================================== 

Hier ist die Abfrage, die ich versucht habe, sondern auch auf Kommentar:

SELECT 
    CASE_NUM, LAST_NAME, FIRST_NAME, MI, '' AS NA, 
    DOB, SEX, [ADDRESS], '' AS NA, CITY, STATE, ZIP 
    --,CONVERT(SMALLINT, CONVERT(VARCHAR(55), CDTBL1.[DESC])) 
    --,CASE WHEN CDTBL1.ID BETWEEN 1 AND 99999 THEN CDTBL1.[DESC] 
    --END AS COUNTY 
FROM 
    CDCLIENT 
INNER JOIN 
    CDTBL1 ON CDCLIENT.ADDR_COUNTY_ID = CDTBL1.ID 
+0

Können Sie eine '' werfen als varchar'' auf beiden Seiten der Verbindung? – abhi

Antwort

1

ändern

'ON CDCLIENT.ADDR_COUNTY_ID = ' 

zu

'ON CAST(CDCLIENT.ADDR_COUNTY_ID as varchar) = ' 

sollten Sie überprüfen die Datentypen der Spalten Sie sicher sein, schließen sich an, dass sie die dieselbe Art. Generell würde ich denken, eine ID-Spalte wäre eine Art von int, aber die Tabelle, die Sie oben zur Verfügung gestellt haben, enthält auch Varchar-Werte in der ID-Spalte.

Es gibt einen Vorrang für die Datentypen in SQL und smallint ist oberhalb von varchar. Es findet eine implizite Konvertierung statt, die den Fehler verursacht.

Mehr Infos hier: https://msdn.microsoft.com/en-us/library/ms190309.aspx

0

Wenn Sie nicht negative Ganzzahlen verwenden möchten, verwenden Sie eine solche Logik:

select (case when CDTBL1.[DESC] not like '%[^0-9]%' 
      then convert(smallint, CDTBL1.[DESC]) 
     end) 

Beachten Sie, dass Sie möglicherweise auch die Länge und die Werte des Felds überprüfen möchten, um sicherzustellen, dass kein Fehler auftritt.

In SQL Server 2012+, können Sie diese try_convert() mit vereinfachen:

select try_convert(smallint, CDTBL1.[DESC]) 

Dies gibt NULL, wenn ein Fehler auftritt. Aber es ist nicht verfügbar in SQL Server 2008

Verwandte Themen