SQL Server检查约束的错误?

时间:2018-05-12 01:44:16

标签: sql-server check-constraints

我有3个表,其ID有不同的范围。例如,表a具有ID <1000000,表b具有ID(从10000001到2000000),表c具有ID&gt; 2000000。我根据每个表的范围在3个表上创建了检查约束。后来,我使用union all创建了一个引用三个表的视图。当我使用ID条件(= xxx)查询视图时,它将仅查询存储数据的表,并忽略查询其他2个表。它按照我的预期运行。

但是如果列类型是char(xx),并且我将检查约束设置为(例如&#39; a%&#39;表a,例如&#39; b%&#39;表b,类似于表c)中的c%&#39;然后使用name =&#39; bcd&#39;查询视图。在观察执行计划之后,它实际上将查询3个表。检查约束无助于忽略查询没有数据的2个表。

所以,我的问题是当检查约束引用了字符列时出了什么问题?

1 个答案:

答案 0 :(得分:2)

正如documentation所解释的那样:

  

表T1中定义的约束C1必须具有以下形式:

C1 ::= < simple_interval > [ OR < simple_interval > OR ...]  
< simple_interval > :: =   
< col > { < | > | \<= | >= | = < value >}   
| < col > BETWEEN < value1 > AND < value2 >  
| < col > IN ( value_list )  
| < col > { > | >= } < value1 > AND  
< col > { < | <= } < value2 >

LIKE不是允许的操作之一。

因此,将约束更改为:

  • tablea:col >= 'a' and col < 'b'
  • tableb:col >= 'b' and col < 'c'
  • tablec:col >= 'c' and col < 'd'