我在NOT NULL
列上添加了NVARCHAR
约束,因此无法允许任何空值。但不幸的是,SQL Server处理NULL
和空值作为两个单独的值!
那么如何在不向列中插入任何内容时使服务器抛出异常?
我在考虑使用约束CHECK,但在与NVARCHAR
列一起使用时,我没有找到任何样本!
答案 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)
答案 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。