2016-07-13 16 views
1

Ich versuche, relationalen Speicher abzufragen, um Objekte mit einem anderen in einem Paket (broadcast.FirmwareVersionReported) angegebenen Wert zurückzugeben, als der zuletzt gemeldete Wert (device.firmwareid).T-SQL Vergleichen von varchar alphanumerischem Wert mit int-Wert

  • Spalte broadcast.FirmwareVersionReported ist vom Typ varchar
  • Wert Beispiel 001 ist.

  • Die Säule device.firmwareid ist vom Typ int.

  • Wertbeispiel ist 0001XX.

Testing

ich versucht, das Spielfeld Ebene von LEFT mit den letzten beiden Zeichen aus der Säule firmware.softwareid und verwendet CAST ändern beide auf einen VARCHAR entfernen Sie den Vergleich zu ermöglichen. Es ist klar, dieser Ansatz ist jedoch nicht korrekt.

select 
    LEFT(CAST(firmware.softwareid as VARCHAR),4) AS softwareid, 
    CAST(broadcast.[FirmwareVersionReported] as VARCHAR) 
from 
    device 
inner join 
    broadcast on broadcast.deviceid = device.deviceid 
inner join 
    firmware on firmware.firmwareid = device.firmwareid 
where 
    softwareid <> [FirmwareVersionReported] 

Ergebnis

Msg 468, Ebene 16, Status 9, Zeile 7
Kann Sortierungskonflikt zwischen "SQL_Latin1_General_CP1_CI_AS" und "Latin1_General_CI_AS" in der nicht gleich den Betrieb nicht lösen.

Tables

Sendungs ​​

[DeviceId] [int], 
[FirmwareVersionReported] [varchar](10), 

Firmware

[FirmwareID] [int] IDENTITY(1,1), 
[SoftwareID] [varchar](10), 
[PacketSoftwareID] [varchar](10), 

Geräte

[DeviceID] [int] IDENTITY(1,1), 
[FirmwareID] [int], 

Frage

Auf der Suche nach Ratschlägen zur bestmöglichen Lösung dieses Problems bitte.

+0

Sie müssen Collate vor – Alex

+0

Vergleich Ich denke, Sie sollten alle Sortierungen machen gleich sein immer zu vermeiden Sortierungen für keine Umwandlung Grund. –

Antwort

1

statt verkohlen umzuwandeln, konvertieren zum Vergleich in int:

select 
    LEFT(CAST(firmware.softwareid as VARCHAR),4) AS softwareid, 
    CAST(broadcast.[FirmwareVersionReported] as VARCHAR) 
from device 
    inner join broadcast on broadcast.deviceid = device.deviceid 
    inner join firmware on firmware.firmwareid = device.firmwareid 
WHERE floor(cast(softwareid as int)/100) <> cast([FirmwareVersionReported] as int) 
+0

Vielen Dank für die Antwort Cetin. Bei dieser Vorgehensweise habe ich folgende Meldung erhalten: "Die Konvertierung ist fehlgeschlagen, als der Varchar-Wert '0009XX' in den Datentyp int konvertiert wurde." Das könnte daran liegen, dass ich etwas falsch erklärt habe, sorry. –

+0

Oh ich habe XX als 2 verschiedene Ziffern, dann können Sie es machen: Besetzung (links (SoftwareID, 4) als int) <> Besetzung (...) –

+0

Ah Entschuldigung, das war meine Schuld. Ich hätte erklären sollen, dass XX Teil nur Buchstaben war. –

0
enter code here 
select 
    LEFT(CAST(firmware.softwareid as VARCHAR),4) AS softwareid_mod, 
    CAST(broadcast.[FirmwareVersionReported] as VARCHAR) 
from device 
    inner join broadcast on broadcast.deviceid = device.deviceid 
    inner join firmware on firmware.firmwareid = device.firmwareid 
WHERE LEFT(CAST(firmware.softwareid as VARCHAR),4) COLLATE DATABASE_DEFAULT <> [FirmwareVersionReported] COLLATE DATABASE_DEFAULT 
+0

Vielen Dank für den Beitrag Andrew. Mit diesem Ansatz sind die Ergebnisse: 0090 090 als Fehltreffer. Tatsächlich ist dies kein Fehltreffer, da das Fallenlassen der führenden NULL auf 0090 mit den Werten übereinstimmt. –

Verwandte Themen