Wie man eine Ansichtspalte NOT NULL macht
Ich versuche, eine Ansicht zu erstellen, wo ich möchte eine Spalte, die nur true oder false. Jedoch, es scheint, dass, egal was ich mache, SQL Server (2008) glaubt, dass mein bit-Spalte kann irgendwie null sein.
Ich habe eine Tabelle namens "Produkt" mit der Spalte "Status" die INT, NULL
. In einem view möchte ich, um wieder eine Zeile für jede Zeile in der Produkt -, mit einer BIT-Spalte auf true gesetzt, wenn das Produkt.Status-Spalte gleich 3 ist, andernfalls ist das bit-Feld false sein sollte.
Beispiel SQL
SELECT CAST( CASE ISNULL(Status, 0)
WHEN 3 THEN 1
ELSE 0
END AS bit) AS HasStatus
FROM dbo.Product
Wenn ich speichern Sie diese Abfrage als Ansicht und betrachten Sie die Spalten im Objekt-Explorer die Spalte HasStatus eingestellt ist BIT, NULL
. Aber es sollte niemals NULL sein. Gibt es etwas Magie SQL trick, den ich verwenden können, um die Kraft dieser Spalte NOT NULL
.
Beachten Sie, dass, wenn ich entfernen Sie die CAST()
rund um die CASE
, die Spalte ist richtig eingestellt, wie NOT NULL
, aber dann die Spalte Typ INT
, das ist nicht das, was ich will. Ich will, dass es BIT
. 🙂
InformationsquelleAutor der Frage René | 2010-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erreichen, was Sie wollen, indem Sie re-arrangieren Sie Ihre Abfrage ein bisschen. Der trick ist, dass die
ISNULL
hat, auf der Außenseite, bevor Sie SQL Server wird verstehen, dass der resultierende Wert kann nieNULL
.Einem Grund finde ich das nützlich ist, wenn ein ORM und Sie nicht möchten, dass der resultierende Wert zugeordnet werden, um eine nullable-Typ. Es kann die Dinge einfacher, um, wenn Ihre Anwendung sieht den Wert als möglicherweise niemals null. Dann müssen Sie nicht haben, um schreiben von code zum behandeln von null-Ausnahmen, etc.
InformationsquelleAutor der Antwort RedFilter
FYI, für Menschen, die in dieser Meldung hinzufügen die ISNULL() um die Außenseite des cast/convert versauen kann der Optimierer auf Ihrer Ansicht.
Hatten wir 2 Tabellen mit dem gleichen Wert als ein index-Schlüssel, aber mit dem Typen der verschiedene numerische Präzision (schlecht, ich weiß) und unsere Sicht war der Beitritt auf, Sie zu produzieren das Endergebnis. Aber unsere middleware-code war auf der Suche nach einem bestimmten Datentyp, und der Blick hatte ein CONVERT() um die Spalte zurückgegeben
Bemerkte ich, wie die OP gemacht, dass die Spalte Deskriptoren für die "Ergebnis anzeigen", definiert es als null und ich dachte, Es ist eine primär - /Fremdschlüssel, die auf 2 Tabellen; warum würden wir wollen, das Ergebnis definiert als null?
Fand ich diesen Beitrag, warf ISNULL() um die Säule herum und voila - keine null-Werte mehr.
Problem war die Leistung der Ausblick ging direkt auf die Toilette, wenn eine Abfrage gefiltert auf die Spalte.
Aus irgendeinem Grund, eine explizite CONVERT() in der Ansicht die Spalte Ergebnis nicht hochschrauben, die der Optimierer (war es zu tun haben, dass da eh die unterschiedliche Genauigkeiten) aber das hinzufügen einer redundanten ISNULL () - wrapper hat, in einem großen Weg.
InformationsquelleAutor der Antwort user1664043
Dies ist der code, den ich verwenden, es wird die ID-Spalte NICHT NULL ist und alle anderen NULL.
Sie haben das wirken des bit-oder varchar-Spalte, und vergleichen die int-Spalte auf NULL.
hth
InformationsquelleAutor der Antwort 40-Love
Alles, was Sie tun können in einer Select-Anweisung ist die Kontrolle der Daten, die die Datenbank-engine sendet, um Sie als Kunden. Die select-Anweisung hat keine Auswirkung auf die Struktur der zugrunde liegenden Tabelle. Zum ändern der Struktur einer Tabelle müssen Sie die Alter Table-Anweisung ausführen.
Alter Table dbo.Product Alter column status bit not null
Wenn otoh, alles, was Sie zu tun versuchen, ist die Kontrolle der Ausgabe der view, dann, was Sie tun, ist ausreichend. Ihre syntax wird garantiert, dass die Ausgabe der HasStatus Spalte in den Ansichten resultset wird in der Tat nie null sein. Es wird immer entweder bit-Wert = 1 oder bit-Wert = 0. Mach dir keine sorgen, was den Objekt-explorer sagt...
InformationsquelleAutor der Antwort Charles Bretana