Подтвердить что ты не робот

Как запретить пустые строки в столбце NVARCHAR

Я добавляю ограничение NOT NULL в мой столбец NVARCHAR, поэтому он не может допускать пустые значения. но, к сожалению, SQL Server имеет дело с NULL и пустые значения как два отдельных значения!

Итак, как мне заставить сервер выдавать исключение, не вставляя ничего в столбец?

Я думаю использовать ограничение CHECK, но я не нашел никаких образцов при использовании с столбцами NVARCHAR!

4b9b3361

Ответ 1

Вы можете добавить ограничение проверки, которое гарантирует, что строка не пуста.

CREATE TABLE [dbo].[Foo](
    [bar] [nvarchar](50) NOT NULL
)

ALTER TABLE [dbo].[Foo] WITH CHECK 
ADD  CONSTRAINT [CK_Foo] CHECK  (([bar]<>N''))

Ответ 2

Используйте контрольное ограничение:

CREATE TABLE SomeTable( 
    SomeColumn VARCHAR(50) NOT NULL CHECK (SomeColumn <> '')
)

Ответ 3

Это звучит как работа для триггера. В принципе, вам нужен триггер для вставки, чтобы он проверял новое значение, и если он пуст, вы вызываете сбой триггера.

Ответ 4

  • Если присваивается значение свойства string, вы можете добавить логику в метод набора свойств.
  • Если вы предпочитаете применять это на уровне SQL, тогда ответ tvanfosson хорош.
  • К сожалению, использование триггера не будет работать, потому что триггер не может повлиять на вставленную запись...

Ответ 5

Было бы неплохо, если бы MSSQL предоставил чистый способ настроить пустые строки для сопоставления с NULL, когда это значение в контексте. Но база данных не является лучшим местом для ее захвата, поскольку нет обработки ошибок, не поднимая ошибку на другой уровень абстракции, где она должна была обрабатываться в первую очередь.

Ответ 6

Как насчет ограничения проверки, что значение столбца не равно пустой строке? Немного чище, чем триггер, и он может быть смоделирован в коде с использованием многих ORM, включая NHibernate, поэтому вам может потребоваться ваш уровень приложения.

В противном случае при назначении поля вы никогда не захотите быть пустым в своем прикладном уровне, попробуйте использовать метод расширения NullIfBlank():

public static string NullIfBlank(this string input)
{
   return String.IsNullOrWhitespace(input) ? null : input;
}

Нулевые строки, пустые строки и строки, содержащие только пробелы, новые строки, табуляции и т.д., возвращаются как нулевые. Теперь вам потребуется убедиться, что вы не делаете никаких простых конкатенаций с этим полем, что вы также не хотите возвращаться null: null + "any string" == null.