Ich habe eine Abfrage, die ich gerade in der Datenbank gefunden habe, die fehlschlägt, einen Bericht zu stürzen. Die Grundgedanken der Abfrage:Wie kann ich 'zwischen' numerischen Daten in einem nicht numerischen Feld abfragen?
Select *
From table
Where IsNull(myField, '') <> ''
And IsNumeric(myField) = 1
And Convert(int, myField) Between @StartRange And @EndRange
Nun myField enthält keine numerische Daten in allen Zeilen [es ist von nvarchar type] ... aber diese Abfrage wurde offensichtlich so ausgelegt, dass es sich nur um Reihen interessiert wo die Daten in diesem Feld numerisch sind.
Das Problem dabei ist, dass T-SQL (nahe wie ich sie verstehe) nicht die nicht kurzzuschließen Where-Klausel wodurch es auf Aufzeichnungen zu Graben, wo die Daten nicht numerisch mit der Ausnahme ist:
Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the nvarchar value '/A' to data type int.
Kurz vor dem Dumping aller Zeilen, wo MyField numerisch ist in eine temporäre Tabelle und dann Abfrage für Zeilen, wo das Feld in dem angegebenen Bereich ist, was kann ich tun, das optimal ist?
Mein erstes Parsen rein um zu versuchen, die zurückgegebenen Daten zu analysieren und sehen, was los war:
Select *
From (
Select *
From table
Where IsNull(myField, '') <> ''
And IsNumeric(myField) = 1
) t0
Where Convert(int, myField) Between @StartRange And @EndRange
Aber ich bekomme die gleichen Fehler, den ich für die erste Abfrage tat, was ich bin nicht sicher, ich verstehe weil ich keine Daten umwandele, die zu diesem Zeitpunkt nicht numerisch sein sollten. Die Unterabfrage sollte nur Zeilen enthalten, in denen myField numerische Daten enthält.
Vielleicht brauche ich meinen Morgentee, aber macht das für jeden Sinn? Ein anderer Satz Augen würde helfen.
Vielen Dank im Voraus
Die abgeleitete Tabelle zuerst erhält nicht materialisiert dann 'die WHERE' Klausel angewendet. Es wird eher wie eine Ansicht behandelt, bei der der Optimierer das zweite wie das erste umschreiben wird, da es von einer relationalen Algebra POV identisch ist. –
Laut [dieser Seite] (http://msdn.microsoft.com/en-us/library/aa226054 (SQL.80% 29.aspx)) muss "nvchar" nicht explizit in "int" konvertiert werden. – NullUserException