检查货币约束
Check Constraint for Money
我需要在用于表示为 service/product 支付的美元的单个列上使用检查约束。
我希望检查此检查约束以确保没有前导空格(例如 LEFT(1)<>''),没有尾部空格(例如 RIGHT(1)<>''),并且有没有科学计数法,没有逗号,没有 NULL 值,小数点后不超过 4 位(例如 1234567890.0000)
大多数您想检查的事情,如果您将货币类型列设置为 money 类型而不是将其设置为 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]%')
可以通过在列前面创建 table 时简单地放置 "not null" 来防止空值。希望这能给你一个想法。您可以使用正则表达式来防止出现逗号和科学记数法。尽管如此,我还是希望使用正确的数据类型。
我需要在用于表示为 service/product 支付的美元的单个列上使用检查约束。
我希望检查此检查约束以确保没有前导空格(例如 LEFT(1)<>''),没有尾部空格(例如 RIGHT(1)<>''),并且有没有科学计数法,没有逗号,没有 NULL 值,小数点后不超过 4 位(例如 1234567890.0000)
大多数您想检查的事情,如果您将货币类型列设置为 money 类型而不是将其设置为 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]%')
可以通过在列前面创建 table 时简单地放置 "not null" 来防止空值。希望这能给你一个想法。您可以使用正则表达式来防止出现逗号和科学记数法。尽管如此,我还是希望使用正确的数据类型。