SQL Server: ISNULL auf uniqueidentifier
Ich bin versucht, zu vergleichen eine Spalte col1
und eine variable @myvar
im WHERE
- Klausel. Beide enthalten in der Regel GUIDs, kann aber auch NULL-Werte.
Ich dachte, ich könnte um die Tatsache, dass NULL=NULL
zu FALSE ausgewertet wird mithilfe WHERE ISNULL(col1, '')=ISNULL(@myvar, '')
. Das wäre zu vergleichen mit zwei leeren Saiten statt, und zu TRUE ausgewertet werden.
Diese wird jedoch folgende Fehlermeldung:
Msg 8169, Ebene 16, Status 2, Zeile 3 Fehler bei der Konvertierung bei der Konvertierung
aus einer Zeichenfolge vom Datentyp uniqueidentifier.
Versuchte ich
DECLARE @myvar uniqueidentifier = NULL
SELECT ISNULL(@myvar,'') as col1
Gleiche Fehlermeldung.
Zwei Fragen:
Erstens bin ich versucht zu konvertieren, die eine uniqueidentifier-variable - obwohl es ein NULL-Wert in eine (leere!) string, nicht die andere Weise herum, wie die Fehlermeldung schon sagt. Was gibt?
Zweitens, gibt es einen besseren Weg, um word -, WHERE-Klausel, die ich brauche, um es zu ermöglichen, für den Vergleich uniqueidentifiers, kann NULL sein?
shawnt00, für die die WHERE-Klausel der nicht-NULL-uniqueidentifiers nicht brauchen, um in Zeichenfolgen konvertiert werden. Vergleichen Sie einfach nur zu TRUE ausgewertet, so dass ich nur Datensätze abrufen, wo Sie gleich sind.
InformationsquelleAutor TVogt | 2015-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit dem ersten argument übergeben Sie
isnull
ist nicht ein wörtlichenull
, bestimmt den Rückgabetyp, die aufrufen, eineuniqueidentifier
in Ihrem Fall. Das zweite argument,''
, nicht gegossen werden zu dieser Art, daher der Fehler, die Sie bekommen.Ein Weg, um dieses ist, nur um explizit zu überprüfen, für
null
s:Shnugo, ich hatte nicht einmal berücksichtigt. Dieser könnte kommen, um einen wichtigen Unterschied, denn all dies ist Teil eines python-Programm, wird zum ausführen dieser Abfrage (oder sehr ähnliche) Tausende Male in einer Zeile (durch pyodbc), so dass jede Zeit, die Einsparungen seien diese noch so klein, kann zählen!
mit in diese sah weiter, bin ich Recht anzunehmen, dass dies für Benutzer-definierte Funktionen sowie built-in-Funktionen...?
ja, das größte Angebot mit einer Leistung, die ist, damit der optimizer seine Arbeit tun. Non-sargable Teile können Abfragen schrecklich langsam, aber Sie können sich nicht vorstellen, warum ...
InformationsquelleAutor Mureinik
Ich denke, unten Ausdruck kann verwendet werden, um zu prüfen, ob die GUID-Spalte ist leer
einige Sache wie
InformationsquelleAutor NidhinSPradeep
Den Grund
ISNULL
nicht für Sie arbeiten, ist, dass der Wiederbeschaffungswert (der Wert, der verwendet wird, wenn der check-Ausdruck wirklich null ist) müssen implizit Cabrio Typ der check-Ausdruck.Ihre
WHERE
- Klausel verwenden können, einecol IS NULL AND @var IS NULL
zu überprüfen Zustand.InformationsquelleAutor Amit
Wie andere haben darauf hingewiesen, ausschließen der NULL-Werte von die Ergebnisse und führen Sie DANN den Vergleich. Sie können VERSCHMELZEN, um auszuschließen, werden NULL-Werte aus dem Vergleich.
Was besser gewesen wäre ist ein Beispiel zeigt, wie konvertieren von einem nicht-sargable where-Klausel in eine sargable select-Anweisung, die beide mit COALESCE oder ISNULL um das problem zu lösen.
VERSCHMELZEN zu lösen wäre das problem mit dem Fehler bekomme ich schön. Ich werde die zusätzlichen möglichen performance-bonus, wenn. :o) ich brauche nur diese für die WHERE-Klausel jedoch nicht das SELECT-Anweisung.
wenn Sie Folgen Sie den link, den ich postet in meinem Kommentar unten Mureinik die Antwort finden Sie jede Menge Beispiele.
Vielleicht ich verstehe dich nicht richtig, aber es ist falsch zu hoffen, dass sich etwas in der WO die nicht beeinflussen würde die Abfrage selbst. Es ist genau Umgekehrt! Stell dir vor, dein "WO" filtern einer Tabelle mit Millionen von Zeilen nach unten, um nur ein paar Beispiele. Dies sollte wohl der erste Schritt sein. Wenn die Optimierung nicht "in", dieser filter angewendet wird nach dem wählen Sie. Millionen von Zeilen abgerufen werden - und weggeworfen, am Ende...
InformationsquelleAutor Emacs User
Versuchen Sie den folgenden code:
Dieser hat immer noch das problem zu behandeln, werden zwei null-Werte als nicht einander gleich, da NEWID() gibt eine zufällige GUID, nicht eine leere GUID.
InformationsquelleAutor Sanjeev Gaur
Hier ist ein weiterer Weg, um dieses Problem zu beheben:
Diese beheben Ihre Fehler. Fehler bei der Konvertierung bei der Konvertierung von einer Zeichenfolge in
uniqueidentifier
.InformationsquelleAutor dasarghya