Я пытаюсь создать представление, в котором я хочу, чтобы столбец был только истинным или ложным. Однако кажется, что что бы я ни делал, SQL Server (2008) считает, что мой битовый столбец каким-то образом может быть нулевым.
У меня есть таблица под названием «Продукт» со столбцом «Статус», который есть INT, NULL
. В представлении я хочу вернуть строку для каждой строки в продукте, для столбца BIT установлено значение true, если столбец Product.Status равен 3, в противном случае битовое поле должно иметь значение false.
Пример SQL
SELECT CAST( CASE ISNULL(Status, 0)
WHEN 3 THEN 1
ELSE 0
END AS bit) AS HasStatus
FROM dbo.Product
Если я сохраню этот запрос как представление и посмотрю на столбцы в обозревателе объектов, для столбца HasStatus будет установлено значение BIT, NULL
. Но он никогда не должен быть NULL. Есть ли какой-нибудь волшебный трюк SQL, который я могу использовать, чтобы заставить этот столбец быть NOT NULL
.
Обратите внимание, что если я удалю CAST()
вокруг CASE
, столбец будет правильно установлен как NOT NULL
, но тогда будет установлен тип столбца INT
, что не то, что я хочу. Я хочу, чтобы это было BIT
. :-)
COALESCE()
это не работает, вам действительно нужно использоватьISNULL()
К вашему сведению, для людей, сталкивающихся с этим сообщением, добавление ISNULL () снаружи приведения / преобразования может испортить оптимизатор в вашем представлении.
У нас было 2 таблицы, использующие то же значение, что и ключ индекса, но с типами разной числовой точности (плохо, я знаю), и наше представление объединяло их для получения окончательного результата. Но наш код промежуточного программного обеспечения искал определенный тип данных, и в представлении было CONVERT () вокруг возвращаемого столбца.
Я заметил, как и OP, что дескрипторы столбцов результата просмотра определили его как допускающий значение NULL, и я думал, что это первичный / внешний ключ для двух таблиц; зачем нам определять результат как допускающий значение NULL?
Я нашел этот пост, бросил ISNULL () вокруг столбца и вуаля - больше не допускает значения NULL.
Проблема заключалась в том, что производительность представления упала прямо в унитаз, когда запрос был отфильтрован по этому столбцу.
По какой-то причине явный CONVERT () в столбце результатов представления не испортил оптимизатор (он все равно должен был это сделать из-за разной точности), но добавление избыточной оболочки ISNULL () сделало это в большом путь.
источник
CONVERT()
в примере, пожалуйста?Все, что вы можете делать с помощью оператора Select, - это управлять данными, которые ядро базы данных отправляет вам как клиенту. Оператор select не влияет на структуру базовой таблицы. Чтобы изменить структуру таблицы, вам необходимо выполнить оператор Alter Table.
Alter Table dbo.Product Alter column status bit not null
Если, otoh, все, что вы пытаетесь сделать, это контролировать вывод представления, то того, что вы делаете, достаточно. Ваш синтаксис гарантирует, что вывод столбца HasStatus в наборе результатов представлений на самом деле никогда не будет нулевым. Он всегда будет либо значение бита = 1 или значение бита = 0. Не волнуйтесь , что говорит объект исследователь ...
источник