我希望在我的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]
任何帮助?
答案 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);