2012-08-09 168 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