如何约束NVARCHAR列上没有空字符串

时间:2011-03-30 17:09:27

标签: sql sql-server

我在NOT NULL列上添加了NVARCHAR约束,因此无法允许任何空值。但不幸的是,SQL Server处理NULL和空值作为两个单独的值!

那么如何在不向列中插入任何内容时使服务器抛出异常?

我在考虑使用约束CHECK,但在与NVARCHAR列一起使用时,我没有找到任何样本!

6 个答案:

答案 0 :(得分:33)

您可以添加一个检查约束,以确保该字符串不为空。

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

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

答案 1 :(得分:6)

使用检查约束:

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

答案 2 :(得分:1)

这听起来像trigger的工作。基本上,您需要在插入时触发一个触发器,以便检查新值,如果它是空字符串,则会导致触发器失败。

答案 3 :(得分:1)

  • 如果为值分配了字符串属性,则可以在属性集方法中添加逻辑。
  • 如果您希望在SQL层强制执行此操作,那么tvanfosson的答案是好的。
  • 不幸的是,使用触发器不起作用,因为触发器不会影响正在插入的记录......

答案 4 :(得分:1)

如果MSSQL提供了一种干净的方法来配置空字符串以映射到NULL,那将是很好的,当这是上下文中的含义时。但是数据库并不是捕获它的最佳位置,因为没有错误处理而没有将错误引发到另一个抽象级别,它应该首先处理它。

答案 5 :(得分:0)

列值不等于空字符串的检查约束怎么样?比触发器更清晰,它可以使用包括NHibernate在内的许多ORM在代码中建模,因此可以告诉您的应用层期望它。

如果失败,在分配字段时,您永远不想在应用程序层中清空,请尝试使用NullIfBlank()扩展方法:

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

空字符串,空字符串和仅包含空格,换行符,制表符空格等的字符串都将返回null。现在,这将要求您确保您没有与此字段进行任何简单的连接,而您也不想返回null:null +“any string”== null。