“如果条件”作为列字段的约束之一?

时间:2009-09-11 14:29:22

标签: sql sql-server sql-server-2005 tsql

我的SQL表中有一个销售税栏,其中存储了数据。

我想知道是否可以在销售税

的表格上设置约束

专栏说“如果> 2008年6月税是2%”否则“税收是4%”?

是否应该来自与该表相关的存储过程?

5 个答案:

答案 0 :(得分:1)

您是否希望自动填充税?

约束只执行验证,而不是数据填充,这可以通过存储过程或触发器来完成。

答案 1 :(得分:1)

您可能需要使用触发器而不是约束。 AFTER INSERT触发器应该可以解决问题。

答案 2 :(得分: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约束。

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

答案 3 :(得分:1)

您可以使用约束来实现此效果......

伪SQL ...

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

您可以考虑使用表来托管税收值,并使用您的查询为特定日期/位置提取相应的税额。这比约束更具可扩展性。

答案 4 :(得分: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