2012-08-09 73 views
0

复杂的SQL约束基本上我想在我的约束逻辑是这样的......依赖于FK

IF([AssetTypeId] = 1) 
THEN 
    [FileId] IS NOT NULL AND [Url] IS NULL 
END 

IF([AssetTypeId] = 0) 
THEN 
    [FileId] IS NULL AND [Url] IS NOT NULL) 
END 

AssetTypeId是对当前表FK参考/约束。 我得到的错误提示语法错误没有母校如何我这个字有一个例外,当我做到这一点...

([AssetTypeId] = 1) AND [FileId] IS NOT NULL AND [Url] IS NULL 
OR 
([AssetTypeId] = 0) AND [FileId] IS NULL AND [Url] IS NOT NULL 

它给我这个错误:

'Asset (dbo)' table 
- Unable to add constraint 'CK_Asset_FileIdOrUrlRequiredNotBoth'. 
The ALTER TABLE statement conflicted with the CHECK constraint "CK_Asset_FileIdOrUrlRequiredNotBoth". The conflict occurred in database "MyDb", table 

“dbo.Asset” 。

我似乎无法弄清楚为什么SQL不会让我这样做。 任何想法家伙?

+0

你能广告你的表的'CREATE语句TABLE'? – 2012-08-09 14:51:20

回答

2

当消息,创建约束时,表明该相同约束被侵犯:

'Asset (dbo)' table 
- Unable to add constraint 'CK_Asset_FileIdOrUrlRequiredNotBoth'. 
The ALTER TABLE statement conflicted with the CHECK constraint "CK_Asset_FileIdOrUrlRequiredNotBoth". The conflict occurred in database "MyDb", table 

这意味着,在该表中现有的数据不符合您的期望约束。约束在语法上是有效的,或者它不会得到这么多。

您需要查找不良数据并在您执行约束之前对其进行更正。

E.g.

SELECT * from Asset where 
([AssetTypeId] = 1) AND ([FileId] IS NULL OR [Url] IS NOT NULL) 
OR 
([AssetTypeId] = 0) AND ([FileId] IS NOT NULL OR [Url] IS NULL) 

应该找到坏的数据

+0

当'FileID'和'Url'都为空或两者都为空时,坏数据也可能是。或者当'AssetTypeID'既不是0也不是0。 – 2012-08-09 14:58:20

+0

呃...我怎么没发现 – War 2012-08-09 14:58:50