2015-01-16 3 views
1

На sql 2008, имеющем судороги мозга. Имеет стороннее приложение и db, имеет поле расширения телефона, определенное как varchar(5). Проблема в том, что у них есть отчет (не могу изменить), что ошибки из чего-либо, кроме числа, помещаются как значение, и, конечно же, с varchar(5) они могут помещать все, что сообщают об ошибках. Требуется установить ограничение для ограничения значений до 5 номеров, включая начальные нули или нулевые значения. Борьба с синтаксисом. Это то, что я делал до сих порограничение для varchar (5) поле

Запрос

ALTER TABLE dbo.person_test2 ADD CONSTRAINT CK_ext 
    CHECK (Pext like '[0-9][0-9][0-9][0-9][0-9]') 

который будет не все аннулирует и должен быть не менее 5 символов. В чем причина этого?

ответ

1

Что об этом:

ALTER TABLE dbo.person_test2 ADD CONSTRAINT CK_ext 
    CHECK (Pext like '[0-9]' OR 
      Pext like '[0-9][0-9]' OR 
      Pext like '[0-9][0-9][0-9]' OR 
      Pext like '[0-9][0-9][0-9][0-9]' OR 
      Pext like '[0-9][0-9][0-9][0-9][0-9]' 
      ) 

Это ограничение позволяет NULL значения и все числа любой длины между 1 и 5. Все остальное запрещено.

Отредактировано после принятия правильного замечания от Мартина Смита.

2
CHECK (Pext Not like '%[^0-9]%' collate latin1_general_bin) 

Все, что вам нужно.

Не нужно обращаться с NULL специально. Если условие оценивается неизвестным, ограничение не нарушается.

^ отрицает указанный диапазон, поэтому это условие имеет значение true для строк, которые не содержат числовой символ.

Возможно, вам необходимо будет добавить AND Pext <> '', если пустые строки также должны быть запрещены.

Обозначение двоичного выражения предотвращает такие символы, как ¼. Во многих сортировках они сортируются между 0 и 9 и поэтому будут включены в диапазон 0-9.

+0

Я создал таблицу с предложением, которое вы предлагаете, и это разрешено для вставки 'c1'. –

+1

@GiorgosBetsos Я пропустил конечный процент в первом редактировании (набрав на мобильном телефоне) –

Смежные вопросы