2016-07-08 3 views
1

Ich habe ein Szenario, in dem ich Daten zwischen zwei Systemen aggregiere. Leider verwende ich einen Tabellenadapter in Visual Studio.Wenn ich eine Umwandlung in eine WHERE-Klausel habe, bevor ich ein anderes Feld überprüfe, wird es dann fehlschlagen?

Select * from prsnpsht where Cast(snp_check as bigint) > 10 and sourcereference Is Null 
Union ALL 
    Select * from prsnpsht where sourcereference is not null 

Im obigen Fall wird die snp_check von dem ersten System all numerisch sein, die mit der snp_check richtig bigint gegossen werden, und wir wissen, dass die Daten aus dem ersten System sind, weil die sourcereference null ist. Das zweite System kann andere Zeichen im Feld "snp_check" enthalten. Wenn es versucht hat, in bigint zu konvertieren, schlägt es fehl.

Wenn ich die Struktur der Abfrage so behalte, wie sie ist, wird sie versuchen, alle Prüfungen auf big int zu setzen, bevor sie die Quellenreferenzbedingung analysiert, oder SQL Server ist intelligent genug, um zu wissen, dass er die Daten begrenzen sollte bevor es versucht, das snp_check Feld zu werfen?

Ich entschuldige mich im Voraus, wenn dies eine doppelte Frage ist, aber ich konnte es nicht finden, wenn es zuvor beantwortet wurde.

+0

Ich sehe nicht "zwei Systeme" in Ihrer Abfrage verwiesen. –

+0

@GordonLinoff Ich vermute, dass die Frage über Logik Kurzschluss ist, obwohl die Abfrage neu geschrieben werden könnte, um diese Bedenken zu vermeiden. – DavidG

+0

Wir haben zwei Systeme, die in dieselbe Tabelle schreiben. Das Feld snp_check ist ein nvarchar (25), das beides erlaubt. Die Abfrage bezieht sich auf einen Bericht. –

Antwort

0

ich spekulieren, dass für diese Abfrage:

Select * 
from prsnpsht 
where Cast(snp_check as bigint) > 10 and sourcereference Is Null; 

Sie einen Konvertierungsfehler bekommen.

In SQL Server 2012+ ist die Lösung try_convert() zu verwenden:

Select * 
from prsnpsht 
where try_convert(bigint, snp_check) > 10 and sourcereference Is Null; 

In früheren Versionen verwenden eine case:

Select * 
from prsnpsht 
where (case when snp_check not like '%[^0-9]%' 
      then convert(bigint, snp_check) 
     end) > 10 and 
     sourcereference Is Null; 
+0

Wenn ich die Quellenreferenz von dieser Abfrage ausschließe und ich die 'try_convert (bigint, snp_check)> 10 - gibt es auch die Ergebnisse der snp_check, die Buchstaben haben? –

+0

try_convert gibt null zurück, wenn keine Konvertierung möglich ist: null> 10 = false – MWillemse

+0

@JohnJanssen. . . Nein. 'Try_convert()' gibt in diesem Fall 'NULL' zurück und der Vergleich mit '> 10' schlägt fehl. –

0

Wenn der SQL Server Version 2012 oder höher ist versuchen die folgende Abfrage

Select * from prsnpsht where try_convert(bigint,snp_check) > 10 and sourcereference Is Null 
Union ALL 
    Select * from prsnpsht where sourcereference is not null 

Try_Convert() gibtzurückWert, wenn snp_check eine ungültige Bigint-Daten ist

Verwandte Themen