我有一个包含2列的表
CREATE TABLE mytable
(
x int
y char(1)
)
我想对x的值强制执行约束。
例如,当x = 5时,我希望y ='a',当x = 12 y ='b'时依此类推。 是否可以在SQL Server 2008中执行此操作?像
这样的东西case when x = 5 then y='a' end
后一种说法不起作用,因此,我要求模拟。
答案 0 :(得分:1)
CREATE TABLE mytable
(
x int not null,
y char(1) not null,
constraint CK_mytable_myrules CHECK (
1 = CASE
WHEN x=5 AND y='a' THEN 1
WHEN x=12 AND y='b' THEN 1
/* More rules here */
ELSE 0 END
)
CASE 表达式始终必须返回值。布尔值不是SQL的一部分。
或者,如果一般规则是“如果我们没有匹配任何这些规则,那就让它通过”,那么你有两个选择 - 嵌套CASE,或“后备”规则(我自己的,刚刚发明的术语):
嵌套CASE:
1 = CASE
WHEN x=5 THEN
CASE WHEN y='a' THEN 1
ELSE 0 END
WHEN x=12 THEN
CASE WHEN y='b' THEN 1
ELSE 0 END
/* More rules here */
ELSE 1 END
或其他方式:
1 = CASE
WHEN x=5 AND y='a' THEN 1
WHEN x=5 THEN 0
WHEN x=12 AND y='b' THEN 1
WHEN x=12 THEN 0
/* More rules here */
ELSE 1 END
答案 1 :(得分:1)
您可以将表达式设置为:
( x = 5 AND y = 'a' ) OR ( x = 12 AND y = 'b' )
如果您愿意,可以添加更多规则......
使用此SQL将约束添加到表中:
ALTER TABLE dbo.myTable WITH NOCHECK
ADD CONSTRAINT CK_myTable
CHECK (( x = 5 AND y = 'a' ) OR ( x = 12 AND y = 'b' ));
查看此参考以获取更多示例:
答案 2 :(得分:0)
可以设置这样的约束。参看link text 您需要定义合适的UDF。
啊,似乎还有其他可能性。