Ответ 1
Вы можете добавить ограничение проверки, которое гарантирует, что строка не пуста.
CREATE TABLE [dbo].[Foo](
[bar] [nvarchar](50) NOT NULL
)
ALTER TABLE [dbo].[Foo] WITH CHECK
ADD CONSTRAINT [CK_Foo] CHECK (([bar]<>N''))
Я добавляю ограничение NOT NULL
в мой столбец NVARCHAR
, поэтому он не может допускать пустые значения. но, к сожалению, SQL Server имеет дело с NULL
и пустые значения как два отдельных значения!
Итак, как мне заставить сервер выдавать исключение, не вставляя ничего в столбец?
Я думаю использовать ограничение CHECK, но я не нашел никаких образцов при использовании с столбцами NVARCHAR
!
Вы можете добавить ограничение проверки, которое гарантирует, что строка не пуста.
CREATE TABLE [dbo].[Foo](
[bar] [nvarchar](50) NOT NULL
)
ALTER TABLE [dbo].[Foo] WITH CHECK
ADD CONSTRAINT [CK_Foo] CHECK (([bar]<>N''))
Используйте контрольное ограничение:
CREATE TABLE SomeTable(
SomeColumn VARCHAR(50) NOT NULL CHECK (SomeColumn <> '')
)
Это звучит как работа для триггера. В принципе, вам нужен триггер для вставки, чтобы он проверял новое значение, и если он пуст, вы вызываете сбой триггера.
Было бы неплохо, если бы MSSQL предоставил чистый способ настроить пустые строки для сопоставления с NULL, когда это значение в контексте. Но база данных не является лучшим местом для ее захвата, поскольку нет обработки ошибок, не поднимая ошибку на другой уровень абстракции, где она должна была обрабатываться в первую очередь.
Как насчет ограничения проверки, что значение столбца не равно пустой строке? Немного чище, чем триггер, и он может быть смоделирован в коде с использованием многих ORM, включая NHibernate, поэтому вам может потребоваться ваш уровень приложения.
В противном случае при назначении поля вы никогда не захотите быть пустым в своем прикладном уровне, попробуйте использовать метод расширения NullIfBlank():
public static string NullIfBlank(this string input)
{
return String.IsNullOrWhitespace(input) ? null : input;
}
Нулевые строки, пустые строки и строки, содержащие только пробелы, новые строки, табуляции и т.д., возвращаются как нулевые. Теперь вам потребуется убедиться, что вы не делаете никаких простых конкатенаций с этим полем, что вы также не хотите возвращаться null: null + "any string" == null.