在Visual Studio中具有多个NULL值的UNIQUE列

时间:2015-09-21 01:39:43

标签: c# sql-server winforms sql-server-ce

我希望在我的Barcode列上有一个可能包含空值的UNIQUE约束。

如何创建允许多个空值的约束?

我使用本地Database.sdf文件(Microsoft SQL Server Compact 4.0与Microsoft SQL Server Compact 4.0的.NET Framework数据提供程序)。

我尝试了this

SqlCeConnection con = null;
con = new SqlCeConnection(@"Data Source=|DataDirectory|\Database.sdf");
con.Open();

try
{
    SqlCeCommand cmd = con.CreateCommand();
    cmd.CommandText = "CREATE UNIQUE NONCLUSTERED INDEX Barcodex ON Products(Barcode) WHERE Barcode IS NOT NULL";
    cmd.ExecuteReader();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

但它不起作用。

我得到的错误:

  

解析查询时出错,[令牌行号= 1,令牌行偏移= 64,错误令牌= WHERE]

任何帮助?

2 个答案:

答案 0 :(得分:3)

更新 SQL Server Compact 4.0

中的不支持已过滤的索引

参考:Differences Between SQL Server Compact and SQL Server

TSQL语法是正确的。 (假设您有SQL Server 2008+。在SQL Server 2008中引入了过滤索引)

改变这个:

        cmd.ExecuteReader();

到这个

        cmd.ExecutNonQuery();

此外,您应该将您的连接包装在using块中。

答案 1 :(得分:0)

SQL Server 2008中引入了过滤的索引。在该版本之前,您将在此类语句中的where子句中收到错误。如果您使用的是更新版本,可能是您的兼容性设置导致了问题。

兼容级别是使给定版本的SQL Server的行为与早期版本相同的一种方法。级别80和90适用于2000和2005,因此不允许使用语法。 Here是一些文档。

如果每行都有唯一的ID,那么您可以使用计算列和唯一索引来获得相同的效果:

alter table product add barcode_productid as (case when barcode is null then productid end);

CREATE UNIQUE NONCLUSTERED INDEX Barcodex ON Products(Barcode, barcode_productid);