Frage

Ich versuche, eine Ansicht zu erstellen, wo ich eine Spalte will nur wahr oder falsch zu sein. Es scheint jedoch, dass, egal was ich tue, SQL Server (2008) glaubt, meine Bitspalte irgendwie null sein können.

Ich habe eine Tabelle „Product“ mit der Spalte „Status“ genannt, die INT, NULL ist. In einer Ansicht, mag ich für jede Zeile in dem Produkt eine Zeile zurück, mit einer BIT-Spalt auf true eingestellt, wenn die Product.Status Spalte gleich 3 ist, ansonsten sollte das Bit-Feld falsch 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 an den Spalten im Objekt-Explorer diese Abfrage als Sicht und das Aussehen zu speichern, die Spalte HasStatus auf BIT, NULL gesetzt. Aber es sollte niemals NULL sein. Gibt es einen magischen SQL Trick, den ich verwenden kann, um diese Spalte zu zwingen NOT NULL zu sein.

Beachten Sie, dass, wenn ich die CAST() um den CASE zu entfernen, wird die Säule korrekt als NOT NULL gesetzt, aber dann der Typ der Spalte wird INT gesetzt, das ist nicht das, was ich will. Ich will es BIT sein. : -)

War es hilfreich?

Lösung

können Sie erreichen, was Sie wollen durch Neuanordnung Ihrer Anfrage ein bisschen. Der Trick besteht darin, dass der ISNULL auf der Außenseite sein muss, bevor SQL Server wird verstehen, dass der resultierende Wert nie NULL sein kann.

SELECT ISNULL(CAST(
    CASE Status
        WHEN 3 THEN 1  
        ELSE 0  
    END AS bit), 0) AS HasStatus  
FROM dbo.Product  

Ein Grund, warum ich dies nützlich tatsächlich finden ist, wenn ein mit ORM und Sie dies nicht tun wollen den resultierenden Wert auf einen Nullable Types abgebildet. Es kann Dinge leichter machen alle um, wenn Ihre Anwendung den Wert als nie möglicherweise sein null sieht. Dann müssen Sie nicht zu schreiben Code Handle null Ausnahmen, etc.

Andere Tipps

Zu Ihrer Information, für die Menschen in dieser Nachricht läuft, Hinzufügen der ISNULL () um die Außenseite des gegossenen / umwandeln kann vermasseln den Optimierer auf Ihrer Ansicht.

Wir hatten zwei Tabellen den gleichen Wert wie ein Index Schlüssel aber mit Typen unterschiedlicher Rechengenauigkeit (schlecht, ich weiß) und unsere Sicht auf sich beitrete um das Endergebnis zu produzieren. Aber unsere Middleware-Code war auf der Suche nach einem bestimmten Datentyp und die Ansicht hatte eine CONVERT () um die Säule zurück

Ich habe bemerkt, wie die OP tat, dass die Spalte-Beschreibungen der Ansicht Ergebnis definiert als nullable und ich dachte, es ist ein Primär- / Fremdschlüssel auf 2 Tabellen; Deshalb möchten wir wollen das Ergebnis als nullable definiert?

fand ich diesen Beitrag, wirft ISNULL () um die Säule und voila -. Nicht mehr nullable

Das Problem war die Leistung des Blicks ging direkt in der Toilette, wenn eine Abfrage auf dieser Spalte gefiltert.

Aus irgendeinem Grund eine explizite CONVERT () auf der Ergebnisspalte Sicht nicht das Optimierungs vermasseln hat (es würde die ohnehin zu tun haben wegen der unterschiedlichen Genauigkeiten), aber das Hinzufügen einer redundanten ISNULL () Wrapper tat, in einem großen Weg.

Alles, was Sie in einer Select-Anweisung tun können, ist, die Daten steuern, dass der Datenbank-Engine als Client Sie sendet. Die Select-Anweisung hat keine Auswirkungen auf die Struktur des zugrunde liegenden Tabelle. Um die Tabellenstruktur ändern müssen Sie eine Tabelle ändern Anweisung auszuführen.

  1. Stellen Sie zunächst sicher, dass es derzeit keine NULL-Werte in diesem Bit-Feld in der Tabelle
  2. Führen Sie dann die folgende DDL-Anweisung:  Alter Table dbo.Product Alter column status bit not null

Wenn OTOH, alles, was Sie zu tun versuchen, ist die Ausgabe der Ansicht zu steuern, dann, was Sie tun ausreichend ist. Ihre Syntax wird sichergestellt, dass die Ausgabe der HasStatus Spalte in den Ansichten des Suchresultates wird in der Tat nie null sein. Es wird immer entweder Bit-Wert = 1 oder Bit-Wert = 0. Mach dir keine Sorgen, was das Objekt Explorer sagt ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top