Ограничения SQL Server

Я хочу создать контрольное ограничение в SQL Server, которое позволит убедиться, что вставки в столбец соответствуют этим правилам.

  • Запись должна состоять из 10 или 11 символов.
  • Символы с 1 по 9 включительно должны быть цифрами
  • Символ 10 должен быть буквой
  • Символ 11, если он используется, должен быть Z.

Любая помощь приветствуется.


person sungsam    schedule 01.04.2015    source источник


Ответы (2)


Попробуйте что-то вроде этого...

ALTER TABLE TableName 
ADD CONSTRAINT ck_Const CHECK
                        ( 
                             LEFT(ColumnName ,9) NOT LIKE '%[^0-9]%'
                         AND SUBSTRING(ColumnName , 10, 1) NOT LIKE '%[^a-Z]%'
                         AND ( (LEN (ColumnName) = 10)
                               OR 
                               (LEN (ColumnName) = 11 AND RIGHT(ColumnName,1) = 'Z')
                              ) 
                        )

Тест

CREATE TABLE TableName (ColumnName VARCHAR(11))
GO

INSERT INTO TableName (ColumnName)  VALUES ('123193123AZ')   -- PASS
INSERT INTO TableName (ColumnName)  VALUES ('123193123A')    -- PASS
INSERT INTO TableName (ColumnName)  VALUES ('123A93123A')    -- FAIL
INSERT INTO TableName (ColumnName)  VALUES ('123793123')     -- FAIL
INSERT INTO TableName (ColumnName)  VALUES ('123093123AJ')   -- FAIL
person M.Ali    schedule 01.04.2015
comment
Я думаю, что AND LEN (ColumnName) IN (10,11) избыточен - person Giorgos Betsos; 01.04.2015
comment
Правда перебирал длинный список если и но и потерял след :) - person M.Ali; 01.04.2015

Моя попытка:

CREATE TABLE TableName (col VARCHAR(11))
GO

ALTER TABLE dbo.tablename ADD CONSTRAINT CK_tablename_columnname
    CHECK ((len(col)=10 or len(col)=11) AND (len(col)>=10 AND PATINDEX('%[^0-9]%',col)=10) AND ((len(col)=11 AND substring(col,11,1)='Z') OR len(col)=10))


INSERT INTO TableName (col)  VALUES ('123193123AZ')   -- PASS
INSERT INTO TableName (col)  VALUES ('123193123A')    -- PASS
INSERT INTO TableName (col)  VALUES ('123A93123A')    -- FAIL
INSERT INTO TableName (col)  VALUES ('123793123')     -- FAIL
INSERT INTO TableName (col)  VALUES ('123093123AJ')   -- Fail

1) Запись должна состоять из 10 или 11 символов (len(col)=10 или len(col)=11)

2) Символ 10 должен быть буквой
PATINDEX('%[^0-9]%',col)=10
PATINDEX дает вам позицию первого нечислового символа.

Если ваша 10-я позиция содержит char, то указанное выше условие будет выполнено.
Во всех остальных случаях ввод неверен (т. е. char находится перед 10-м символом в вашем вводе).

3) Символ 11, если он используется, должен быть Z.
len(col)=11 AND substring(col1,11,1)='Z'

person knkarthick24    schedule 01.04.2015
comment
Кто бы ни поставил отрицательный голос, пожалуйста, предложите, где я ошибся, что поможет мне исправить, и это даст несколько решений тому, кто поднял вопрос здесь. Пожалуйста, смотрите мою отредактированную часть с вводом и выводом. - person knkarthick24; 02.04.2015