2015-03-18 49 views
0

下午所有,檢查約束爲錢

我需要一個單一列上的檢查約束,用於表示美元支付服務/產品。 (1)<>''),沒有尾部空格(例如RIGHT(1)<>''),沒有空格科學記數法,沒有逗號,沒有NULL值,並且在小數點後不超過4位數(例如1234567890.0000)

任何和所有幫助將不勝感激!

謝謝 Hukd

回答

0

大部分要檢查,可代替如果你把錢列類型有它爲varchar,並允許用戶輸入的所有排序的,而不是隻是阻止事情奇怪的數據。您可以使用以下來更改列:

Alter table tablename alter column columnname money; -- you can only do this if there is no constraint on it already and there is not data (or the data follows the money type rules) 

如果您決定保留它varchar,那麼檢查約束將非常複雜。到小數點後檢查左,右空間和位數,可以使用以下約束:

CONSTRAINT chk CHECK(LEFT([paid], 1) != ' ' AND RIGHT([paid], 1) != ' ' AND LEN(SUBSTRING([paid], CHARINDEX('.', [paid])+1, LEN([paid]))) !> 4 AND paid like '%[^0-9]%') 

空值可以通過簡單地投入,「不空」在列前創建表時被阻止。希望這給你一個想法。您可以使用正則表達式來防止逗號和科學記號。不過,我更喜歡使用正確的數據類型。

+0

感謝您的快速響應!我同意,使該列成爲適當的數據類型是最佳實踐。然而,長話短說,我從客戶端接收數據,通常採用.txt格式。然後我有一個自動化進程,將數據拉入,並將其作爲源數據加載到特定數據庫。然後我有另一個自動化的過程,對上述數據進行一些分析。我不想將每個列手動格式化回正確的數據類型,而只想運行快速檢查以確保所有值都可接受。你能詳細說明這個正則表達式嗎? – Hukd 2015-03-19 14:01:15

+0

因此,如果我考慮數字(0-9)以外的任何特殊符號,我可以使用「like」來檢查這些符號。看到我上面的編輯。這意味着任何不是數字0-9的東西都會被檢查。它會檢查所有內容,包括逗號,空格,$,&等等。你也可以改變它。例如。如果您認爲不需要檢查字符,只需將它設爲'%[0-9A-za-z]%「即可。 – sanmis 2015-03-20 00:23:34