因为有子集,估计无法通过规则实现。
还是在插入,更新等的sql语句或者sp中控制好了。虽然约束性低了点。

解决方案 »

  1.   

    可以的, 不过,不明白你为什么用rule而不用constraint.
      

  2.   

    --测试数据
    create table BookInfo(id int,ISBN varchar(30))
    --添加constraint
    alter table BookInfo
      add constraint CISBN
      check ( patindex('%[^0-9/-]%', ISBN)=0)
    insert BookInfo select 1, '1-3'
    --清除
    drop table BookInfo
      

  3.   

    为什么上面的模式匹配表达式中字符'9'后面的两个字符 '/'和'-'颠倒一下顺序就不行了呢?
    比如颠倒顺序以后,如果执行  insert into BookInfo values('34224/-')不能插入了呢,或者说只要是带有 '-' 的字符串都不能插入表中呢?
      

  4.   

    我的意思是说:把你写的:check ( patindex('%[^0-9/-]%', ISBN)=0)改成
                            check ( patindex('%[^0-9-/]%', ISBN)=0)就不行了,就不能插入带有
    '-'的字符串了,这是为什么呢?
      

  5.   

    '-'是一个特殊的字符
    0-9代表从0, 1, 2, ...9之中的一个
    9-/是没有意义的,因为/的ASCII码比9的要小.例如说:
    select  patindex('%[3-1]%', '-')
    select  patindex('%[3-1]%', '3')
    select  patindex('%[3-1]%', '2')
    select  patindex('%[3-1]%', '1')这些都返回0.如果你将'-'放在末尾的话,它就只表示一个破折号了.如果你再问深一层的话,我也就说不清楚了。
      

  6.   

    CREATE TABLE tb1 (ISBN varchar(30) 
                       CHECK( ISBN IN('0','1','2','3','4','5','6','7','8','9','/','-') )
    );INSERT INTO tb1 VALUES('34');