Как сделать столбец NOT NULL представления

Я пытаюсь создать представление, где я хочу, чтобы столбец был только TRUE или FALSE. Однако кажется, что независимо от того, что я делаю, SQL Server (2008) полагает, что мой разрядный столбец может так или иначе быть пустым.

У меня есть таблица, названная "продуктом" со столбцом "Status", который является INT, NULL. В представлении я хочу возвратить строку для каждой строки в продукте с НЕБОЛЬШИМ набором столбца к истинному если продукт. Столбец состояния равен 3, иначе битовое поле должно быть ложью.

SQL в качестве примера

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

Если я сохраняю этот запрос как представление и смотрю на столбцы в Обозревателе объектов, столбец HasStatus установлен на BIT, NULL. Но это никогда не должно быть ПУСТЫМ. Есть ли некоторый волшебный прием SQL, который я могу использовать, чтобы вынудить этот столбец быть NOT NULL.

Заметьте это, если я удаляю CAST() вокруг CASE, столбец правильно установлен как NOT NULL, но тогда тип столбца установлен на INT, который не является тем, что я хочу. Я хочу, чтобы это было BIT. :-)

77
задан Peter Lang 24 February 2010 в 14:51
поделиться

2 ответа

Вы можете добиться желаемого, немного изменив порядок запроса.Уловка заключается в том, что ISNULL должен быть снаружи, прежде чем SQL Server поймет, что результирующее значение никогда не может быть NULL .

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

Одна из причин, по которой я считаю это полезным, - это использование ORM и нежелание отображать результирующее значение в тип, допускающий значение NULL. Это может упростить задачу, если ваше приложение увидит, что значение никогда не может быть нулевым. Тогда вам не нужно писать код для обработки нулевых исключений и т. Д.

140
ответ дан 24 November 2019 в 10:56
поделиться

Все, что вы можете делать с помощью оператора Select, - это управлять данными, которые ядро ​​базы данных отправляет вам как клиенту. Оператор select не влияет на структуру базовой таблицы. Чтобы изменить структуру таблицы, вам необходимо выполнить оператор Alter Table.

  1. Сначала убедитесь, что в этом битовом поле таблицы в настоящий момент нет нулей.
  2. Затем выполните следующий оператор ddl: Alter Table dbo.Product Изменить бит состояния столбца не равен нулю

Если, otoh, все, что вы пытаетесь сделать, это контролировать вывод представления, то того, что вы делаете, достаточно. Ваш синтаксис гарантирует, что вывод столбца HasStatus в наборе результатов представлений на самом деле никогда никогда не будет нулевым. Это будет всегда либо битовое значение = 1, либо битовое значение = 0. Не беспокойтесь о том, что говорит обозреватель объектов ...

-3
ответ дан 24 November 2019 в 10:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: