Ich versuche, eine Ansicht zu erstellen, in der eine Spalte nur wahr oder falsch sein soll. Es scheint jedoch, dass SQL Server (2008), egal was ich tue, glaubt, dass meine Bitspalte irgendwie null sein kann.
Ich habe eine Tabelle namens "Produkt" mit der Spalte "Status" INT, NULL
. In einer Ansicht möchte ich für jede Zeile in Product eine Zeile zurückgeben, wobei eine BIT-Spalte auf true gesetzt ist, wenn die Product.Status-Spalte gleich 3 ist. Andernfalls sollte das Bitfeld false sein.
Beispiel SQL
SELECT CAST( CASE ISNULL(Status, 0)
WHEN 3 THEN 1
ELSE 0
END AS bit) AS HasStatus
FROM dbo.Product
Wenn ich diese Abfrage als Ansicht speichere und die Spalten im Objekt-Explorer betrachte, wird die Spalte HasStatus auf gesetzt BIT, NULL
. Aber es sollte niemals NULL sein. Gibt es einen magischen SQL Trick , den ich verwenden kann , um diese Spalte zu zwingen , zu sein NOT NULL
.
Beachten Sie, dass, wenn ich das um das CAST()
herum entferne CASE
, die Spalte korrekt als festgelegt ist NOT NULL
, aber dann der Spaltentyp auf festgelegt ist INT
, was nicht das ist, was ich will. Ich möchte, dass es so ist BIT
. :-)
COALESCE()
keine Arbeit haben, die Sie tatsächlich haben zu verwendenISNULL()
Zu Ihrer Information: Wenn Personen auf diese Nachricht stoßen, kann das Hinzufügen von ISNULL () an der Außenseite des Cast / Convert den Optimierer in Ihrer Ansicht durcheinander bringen.
Wir hatten 2 Tabellen mit demselben Wert wie ein Indexschlüssel, aber mit unterschiedlichen numerischen Genauigkeiten (schlecht, ich weiß), und unsere Ansicht verband sie, um das Endergebnis zu erzielen. Unser Middleware-Code suchte jedoch nach einem bestimmten Datentyp, und in der Ansicht wurde CONVERT () um die Spalte zurückgegeben
Ich bemerkte, wie das OP, dass die Spaltenbeschreibungen des Ansichtsergebnisses es als nullwert definierten und ich dachte, es ist ein Primär- / Fremdschlüssel für 2 Tabellen; Warum sollte das Ergebnis als nullwert definiert werden?
Ich habe diesen Beitrag gefunden, ISNULL () um die Spalte geworfen und voila - nicht mehr nullbar.
Das Problem war, dass die Leistung der Ansicht direkt auf die Toilette ging, als eine Abfrage in dieser Spalte gefiltert wurde.
Aus irgendeinem Grund hat ein explizites CONVERT () in der Ergebnisspalte der Ansicht den Optimierer nicht durcheinander gebracht (das musste es aufgrund der unterschiedlichen Präzisionen sowieso tun), aber das Hinzufügen eines redundanten ISNULL () - Wrappers hat es in einem großen Fall getan Weg.
quelle
CONVERT()
bitte in einem Beispiel die Lösung zeigen, wie Sie die Nicht-Nullfähigkeit sicherstellen / anzeigen können ?In einer Select-Anweisung können Sie lediglich die Daten steuern, die das Datenbankmodul als Client an Sie sendet. Die select-Anweisung hat keine Auswirkung auf die Struktur der zugrunde liegenden Tabelle. Um die Tabellenstruktur zu ändern, müssen Sie eine Alter Table-Anweisung ausführen.
Alter Table dbo.Product Alter column status bit not null
Wenn Sie nur versuchen, die Ausgabe der Ansicht zu steuern, ist das, was Sie tun, ausreichend. Ihre Syntax garantiert, dass die Ausgabe der HasStatus-Spalte in der Views-Ergebnismenge tatsächlich niemals null ist. Es wird immer entweder Bitwert = 1 oder Bitwert = 0 sein. Machen Sie sich keine Sorgen, was der Objekt-Explorer sagt ...
quelle