Как настроить ограничение, чтобы ограничить поле Char набором значений?

У меня сегодня пердит мозг. В SQL Server (в настоящее время используется 2008), как настроить поле char для приема только определенной серии символов (примерно восемь букв с учетом регистра)? И мне нужно повторно использовать это «настраиваемое поле» в нескольких таблицах.

Я знаю, что могу настроить другую таблицу и наложить на нее ограничение внешнего ключа. Это единственный способ?


person Josh Stodola    schedule 13.05.2011    source источник
comment
Нам нужно немного (хорошо, намного) больше подробностей о характере ограничения, которое вы пытаетесь определить. Только А-Я? Деликатный случай? Встроенные пространства? Конкретная серия символов?   -  person Philip Kelley    schedule 13.05.2011
comment
@Филипп Извини. Я только что обновил свой вопрос.   -  person Josh Stodola    schedule 13.05.2011


Ответы (2)


Если вы используете двойную отрицательную конструкцию, это позволяет использовать только символы от A до H.

ALTER TABLE MyTable WITH CHECK
   CONSTRAINT CK_MyTable_MyColChars CHECK (
     MyColChars COLLATE Latin1_General_BIN NOT LIKE '%[^ABCDEFGH]%'
     )

Для повторного использования используйте udf

CREATE FUNCTION dbo.CheckChars (@Value varchar(100))
RETURNS bit
AS
BEGIN
   RETURN (CASE WHEN @Value NOT LIKE '%[^ABCDEFGH]%' THEN 1 ELSE 0 END)
END
GO

... CHECK (
      dbo.CheckChars (MyColChars) = 1
     )

Если бы вы хотели A_F, точку с запятой и пробел, это было бы, например, '%[^ABCDEF; ]%'

person gbn    schedule 13.05.2011
comment
Хотел бы я дать вам еще +1 за картинку 80-х, кефаль и все такое! - person Josh Stodola; 13.05.2011

Вы, вероятно, захотите изучить создание контрольного ограничения. В этом посте есть шаблон соответствия, на основе которого вы можете построить:

Как заставить SQL Server 2008 проверить ограничение таблицы Разрешить только определенные символы?

Чтобы получить совпадение с учетом регистра, удалите «a-z» в шаблоне и создайте контрольное ограничение с сопоставлением с учетом регистра. Это обеспечивает сопоставление с учетом регистра, даже если сервер и база данных не чувствительны к регистру.

person Bryan    schedule 13.05.2011