请问:这样的约束条件怎么写?要求某个字段的数据中的字母必须为大写(该字段还可以有中文,下划线等。)。用存储过程也可以。

解决方案 »

  1.   

    declare @t table([Name] varchar(100))
    insert @t select upper('好的abcde啊')
    select * from @t 
    Name                                                                                                 
    ---------------------------------------------------------------------------------------------------- 
    好的ABCDE啊(所影响的行数为 1 行)
      

  2.   

    通过字母来判断是不准确的,因为这个和你的排序规则有关系,一般情况下,是不区分大小写的
    所以只能通过ASC码来判断.
      

  3.   

    不知道你看了我的回复没有,如果说你要在约束层面上去做,那么除非你的排序规则是区分大小写的.
    可以这样建约束ALTER TABLE 你的表名
    ADD CONSTRAINT CK_Test
    CHECK(你要约束的列 like '[^a-z]')
      

  4.   

    如果不这样做,那么你就只能在业务里去判断
    循环遍历字符串,如果发现有小写的a-z(可通过ASC码和大写的区分),则抛出异常.
      

  5.   

    --1. 按拼音排序
    DECLARE @t TABLE(col varchar(2))
    INSERT @t SELECT '中'
    UNION ALL SELECT '国'
    UNION ALL SELECT '人'SELECT * FROM @t ORDER BY col COLLATE Chinese_PRC_CS_AS_KS_WS
    /*--结果
    col  
    ---- 



    --*/
    GO
      

  6.   


    create table t1(id int,val varchar(10))
    go
    create trigger trig1
    on t1 
    for insert
    as
    update t1 set val = upper(val)
    goinsert t1 select 2,'abC怎么写'
     select * from t1
    /*
    id          val        
    ----------- ---------- 
    2           ABC怎么写(所影响的行数为 1 行)
    */
      

  7.   

    DECLARE @t TABLE(v VARCHAR(100))
    INSERT @t SELECT 'a'
    UNION ALL SELECT 'A'
    SELECT * FROM @t WHERE v COLLATE Chinese_PRC_CS_AS_KS_WS = 'A'
    IF object_id('tb','u') IS NOT NULL
    DROP TABLE tb
    GOCREATE TABLE tb(v VARCHAR(100) COLLATE Chinese_PRC_CS_AS_KS_WS CHECK(v = UPPER(v)))
    GOINSERT tb SELECT 'a'
    GO
    /*
    服务器: 消息 547,级别 16,状态 1,行 1
    INSERT 语句与 COLUMN CHECK 约束 'CK__tb__v__6518A21F' 冲突。该冲突发生于数据库 'tst',表 'tb', column 'v'。
    语句已终止。*/
    --新开一窗口执行
    INSERT tb SELECT 'A'
    SELECT * FROM tb
    /*
    A
    */
      

  8.   

    若不想在 v 列上指定排序规则,即不把排序规则Chinese_PRC_CS_AS_KS_WS定义到表结构上,那么稍做调整 :
    DECLARE @t TABLE(v VARCHAR(100))
    INSERT @t SELECT 'a'
    UNION ALL SELECT 'A'
    SELECT * FROM @t WHERE v COLLATE Chinese_PRC_CS_AS_KS_WS = 'A'
    IF object_id('tb','u') IS NOT NULL
        DROP TABLE tb
    GOCREATE TABLE tb(v VARCHAR(100) CHECK(v COLLATE Chinese_PRC_CS_AS_KS_WS = UPPER(v COLLATE Chinese_PRC_CS_AS_KS_WS)))
    GOINSERT tb SELECT 'a'
    GO
    /*
    服务器: 消息 547,级别 16,状态 1,行 1
    INSERT 语句与 COLUMN CHECK 约束 'CK__tb__v__6518A21F' 冲突。该冲突发生于数据库 'tst',表 'tb', column 'v'。
    语句已终止。*/
    --新开一窗口执行
    INSERT tb SELECT 'A'
    SELECT * FROM tb
    /*
    A
    */
      

  9.   

    create table tb(v varchar(50) check(ascii(left(v,1)) between 65 and 90))
    --失败
    insert into tb select 'abc'
    --成功
    insert into tb select 'Abc'ascii码
      

  10.   

    楼主没有说首字母,所以如果以ascii来处理的话,应该是在check中调用函数,逐个字符去识别ascii,但不是between and,而是 not between and a-z所在的ascii码段。仅供参考,呵
      

  11.   

    Oracle 已经实现SQL 与正则表达式的方式,SQL Server 不太清楚。以为Oracle Script 代供你参考。
    ALTER TABLE EMP ADD CONSTRAINT REGEX01
        CHECK (REGEXP_LIKE(ENAME,'^[[:alpha:]]+$'));