Ошибка с проверкой ограничений SQL Server? - PullRequest
0 голосов
/ 12 мая 2018

У меня есть 3 таблицы, чей ID имеет другой диапазон.например, таблица a имеет идентификатор <1000000, таблица b имеет идентификатор (от 10000001 до 2000000), таблица c имеет идентификатор> 2000000.И я создал проверочное ограничение для 3 таблиц в соответствии с диапазоном каждой таблицы.Позже я создал одно представление, ссылающееся на три таблицы, используя union all.Когда я запрашиваю представление, используя условие идентификатора (= xxx), оно запрашивает только таблицу, в которой хранятся данные, и игнорирует запросы к двум другим таблицам.Это работает так, как я ожидал.

Но если тип столбца - char (xx), и я установил ограничение проверки как (например, 'a%' для таблицы a, как 'b%' для таблицы b, как 'c%' для таблицыс).Затем запросите представление, используя имя = 'bcd'.После просмотра плана выполнения он на самом деле запросит 3 таблицы.проверочное ограничение не помогает игнорировать запросы к двум таблицам, которые не содержат данных.

Итак, мой вопрос в том, что не так, когда проверочное ограничение ссылается на символьный столбец?

1 Ответ

0 голосов
/ 12 мая 2018

Как объясняет документация :

Ограничение C1, определенное в таблице T1, должно иметь следующую форму:

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 не является одной из разрешенных операций.

Итак, измените ограничения на:

  • Таблица: col >= 'a' and col < 'b'
  • таблица: col >= 'b' and col < 'c'
  • tablec: col >= 'c' and col < 'd'
...