限制除大写之外的特殊字符,数字和字母的正则表达式

时间:2014-08-21 05:47:44

标签: sql sql-server regex sql-server-2008

我想使用正则表达式来限制用户在创建表格时添加约束来输入除大写之外的特殊字符,数字和字母。用户只能输入大写字母。我尝试了以下内容。

CONSTRAINT chk_spl_chars_model CHECK (Model LIKE '%[A-Z]+%')

这没有用。它不允许输入任何值。任何帮助表示赞赏。

以下是用于创建表格的查询

CREATE TABLE Cars(
        Model VARCHAR(10) NOT NULL
        ,CONSTRAINT chk_spl_chars_model CHECK (Model LIKE '%^[A-Z]+$%')

);  

这是接受任何要插入的值,即使是小写和特殊字符

2 个答案:

答案 0 :(得分:1)

您必须在约束中使用排序规则:

CONSTRAINT chk_spl_chars_model CHECK (not (Model COLLATE Latin1_General_100_CS_AI LIKE '%[a-z]%'))

您也可以使用以下格式(更改模型列的排序规则):

CREATE TABLE Cars(
        Model VARCHAR(10) COLLATE Latin1_General_100_CS_AI NOT NULL
        ,CONSTRAINT chk_spl_chars_model CHECK (NOT Model LIKE '%[a-z]%')

);

答案 1 :(得分:1)

您需要使用区分大小写的排序规则,如mehdi's answer所示,但您还需要更改所需内容:

CREATE TABLE Cars(
    Model VARCHAR(10) collate Latin1_General_CS_AI NOT NULL
    ,CONSTRAINT chk_spl_chars_model CHECK (
          Model
            NOT LIKE '%[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]%')
);  

你想:

  • NOT LIKE,因为我们想要搜索想要出现的字符
  • %匹配“任何字符”,因此我们希望匹配任意数量的字符
  • 然后^ <{em} []块表示匹配
  • 中包含的任何字符
  • ABCDEFGHIJKLMNOPQRSTUVWXYZ因为即使在大多数情况下都是敏感的排序规则,如果使用范围表达式A-Z,小写字母也会出现在大写字母之间。

所以完整的模式说“匹配任意数量的字符,然后一个字符不是大写字符,然后是任意数量的字符” - 换句话说,它匹配任何包含至少一个字符的字符串非大写字符 - 如果我们匹配,则我们拒绝该值(因为NOT LIKE)。

^[]之外),$+LIKE模式没有特殊含义。