2009-09-11 44 views
0

我在其中一个存储数据的SQL表中有一个销售税列。“如果条件”作为列字段的约束之一?

我想知道是否有可能放在桌子本身约束的销售税

柱说:“如果> 2008年6月税是2%”否则“税是4%”?

应该来自与该表相关的存储特效?

回答

1

如果你想确保列“税”是依赖于本月2或4(例如,本月9 = 9月),那么你可以这样做:

ALTER TABLE SomeTable 
    ADD CONSTRAINT CK_SalesTax 
    CHECK ((MONTH(GETDATE()) = 9 AND SalesTax = 2) OR (MONTH(GETDATE()) != 9 AND SalesTax = 4)) 

显然会发生变化你的条件。例如测试2008年6月之后的日期,这有点简单。

(GETDATE() >= '1 June 2008' AND SalesTax = 2) 

你应该能够建成使用类似的机制,当我在第一个例子已经下降的CHECK约束这一点。

注意这只会检查放入表中的值。它不会自动填充。正如其他人所指出的,如果你想要自动填充,你需要一个触发器。

1

您想让税款自动填充吗?

约束只执行验证,而不是数据的数量,这可以通过存储的特效或触发完成。

+0

我不希望它是自动填充一个简单的方法,我想完成验证。 – vas 2009-09-11 15:23:37

1

您可能需要使用触发器而不是约束。一个AFTER INSERT触发器应该做的伎俩。

+0

由于它看起来可以写一个约束,所以最好把它放在一个约束中。联机丛书甚至指出,如果您可以使用触发器或约束,则最好使用约束。在BOL中搜索以查看我的意思 约束[SQL Server]与DML触发器 – HLGEM 2009-09-11 20:25:12

1

你可以使用约束来实现这个效果......

伪SQL ...

(YourDate >= '6/1/08' and YourTaxData = 0.02) or (YourTaxData = 0.04) 

你可能会考虑,而不是使用一个表来举办税收值,并使用您的查询为给定的日期/地点拉取适当的税额。这比限制更具可扩展性。

+0

不知道他在哪个国家,我会避免使用纯数字日期 - 这是6月1日还是6月1日?改为命名月份会更安全。 – 2009-09-11 15:04:16

+0

我在美国so mm/dd/y – vas 2009-09-11 15:07:56

+0

@rangerchris - 我完全同意你,只是抛出伪代码来说明约束概念。如果它是我使用过的实际代码,那么... :) – Mayo 2009-09-11 15:12:31

0

这里是你可以改变或创建新表

create table #test (
Date datetime, 
amount money, 
tax as case when date > '06/01/08' then convert(decimal(10,2),4.00) else convert(decimal(10,2),2.00) end, 
) 

insert into #test 
select '05/01/08', 10.00 

insert into #test 
select '07/01/08', 10.00 

select * from #test