Próbuję utworzyć widok, w którym chcę, aby kolumna była tylko prawdą lub fałszem. Jednak wydaje się, że niezależnie od tego, co robię, SQL Server (2008) uważa, że moja kolumna bitowa może być w jakiś sposób zerowa.
Mam tabelę o nazwie „Produkt” z kolumną „Status”, czyli INT, NULL
. W widoku chcę zwrócić wiersz dla każdego wiersza w produkcie, z kolumną BIT ustawioną na wartość true, jeśli kolumna Product.Status jest równa 3, w przeciwnym razie pole bitu powinno mieć wartość false.
Przykład SQL
SELECT CAST( CASE ISNULL(Status, 0)
WHEN 3 THEN 1
ELSE 0
END AS bit) AS HasStatus
FROM dbo.Product
Jeśli zapiszę to zapytanie jako widok i spojrzę na kolumny w Eksploratorze obiektów, kolumna HasStatus jest ustawiona na BIT, NULL
. Ale nigdy nie powinno być NULL. Czy jest jakaś magiczna sztuczka SQL, której mogę użyć, aby wymusić istnienie tej kolumny NOT NULL
.
Zauważ, że jeśli usunę CAST()
otaczającą CASE
kolumnę, kolumna jest poprawnie ustawiona jako NOT NULL
, ale wtedy typ kolumny jest ustawiony na INT
, co nie jest tym, czego chcę. Chcę, żeby tak było BIT
. :-)
COALESCE()
nie działa, faktycznie musisz użyćISNULL()
FYI, dla ludzi, którzy natkną się na tę wiadomość, dodanie ISNULL () wokół zewnętrznej strony rzutowania / konwersji może zepsuć optymalizator w twoim widoku.
Mieliśmy 2 tabele używające tej samej wartości co klucz indeksu, ale z typami o różnej dokładności numerycznej (zła, wiem) i naszym zdaniem łączyliśmy je, aby uzyskać ostateczny wynik. Ale nasz kod oprogramowania pośredniego szukał określonego typu danych, a widok miał CONVERT () wokół zwróconej kolumny
Zauważyłem, podobnie jak OP, że deskryptory kolumn wyniku widoku definiują go jako dopuszczalny wartość null i myślałem, że jest to klucz podstawowy / obcy w 2 tabelach; dlaczego mielibyśmy chcieć, aby wynik był określony jako dopuszczalny wartości null?
Znalazłem ten post, rzuciłem ISNULL () wokół kolumny i voila - już nie dopuszcza wartości null.
Problem polegał na tym, że widok szedł prosto do toalety, gdy zapytanie przefiltrowało tę kolumnę.
Z jakiegoś powodu jawne CONVERT () w kolumnie wyników widoku nie zepsuło optymalizatora (i tak musiałby to zrobić z powodu różnych dokładności), ale dodanie nadmiarowego opakowania ISNULL () zrobiło to w dużym sposób.
źródło
CONVERT()
w przykładzie, proszę?Wszystko, co możesz zrobić w instrukcji Select, to kontrolować dane wysyłane przez silnik bazy danych do Ciebie jako klienta. Instrukcja select nie ma wpływu na strukturę tabeli bazowej. Aby zmodyfikować strukturę tabeli, należy wykonać instrukcję Alter Table.
Alter Table dbo.Product Alter column status bit not null
Jeśli jedyne, co próbujesz zrobić, to kontrolować wyświetlanie widoku, to to, co robisz, jest wystarczające. Twoja składnia gwarantuje, że dane wyjściowe kolumny HasStatus w zestawie wyników widoków w rzeczywistości nigdy nie będą miały wartości NULL. Będzie ona zawsze być wartość bit = 1 lub nieco wartość = 0. Nie martw się, co mówi badacz obiekt ...
źródło