数据库有三个字段型别 零件号 工序号LL      ss0     5/6/8/4GE     ss2     0/2/25/30RR     ss3       5假如输入LL ss0  2/5/3  应该提示有重复 因为5在第一条数据里面已经出现过了前两个字段和第三个字段的某个进行判断是否有重复的情况 能不能做啊?使用sql 2005处理如果数据量比较大的话,这个是不是很浪费时间啊?

解决方案 »

  1.   

    --建立测试环境
    declare @tb TABLE 
    (
    型别 varchar(2), 
    零件号 varchar(4),
    工序号 varchar(40)
    )INSERT @tb
     select 'LL', 'ss0', '5/6/8/4' union all
     select 'GE', 'ss2', '0/2/25/30' union all
     select 'RR', 'ss3', '5' 
    --查询
    declare @型别 varchar(10), @零件号 varchar(10),@工序号 varchar(50)
    set @型别='LL'
    set  @零件号='ss0'
    set  @工序号='2/5/3'if exists(select 1 from @tb where 
    型别=@型别 and  零件号=@零件号 
    and exists(select 1 
    from f_splitstr(工序号,'/')a,f_splitstr(@工序号,'/')b
    where a.col=b.col) 
    )
    print '已有'
    else
    print '没有'
    --结果
    /**/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_splitSTR]
    GO--3.2.1 循环截取法
    CREATE FUNCTION f_splitSTR(
    @s   varchar(8000),   --待分拆的字符串
    @split varchar(10)     --数据分隔符
    )RETURNS @re TABLE(col varchar(100))
    AS
    BEGIN
        DECLARE @splitlen int
        SET @splitlen=LEN(@split+'a')-2
        WHILE CHARINDEX(@split,@s)>0
        BEGIN
            INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
            SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
        END
        INSERT @re VALUES(@s)
        RETURN
    END
    GO
      

  2.   

    -- 性判断问题应该不复杂:只有 男、女,两种情况,用 case when 就 OK 啦..... 
      

  3.   

    假如输入LL ss0 2/5/3 应该提示有重复 因为5在第一条数据里面已经出现过了
    ====
    那2/3是不是应该插进去呢?是另插一条,还是附加在第一条数据里面呢?这样的表不符合第一范式,处理麻烦,而且容易出问题。
      

  4.   

    create table tt
    (
    a varchar(20),
    b varchar(20),
    c varchar(20)
    )insert into tt
    select 'LL', 'ss0', '5/6/8/4'
    union select 'GE', 'ss2', '0/2/25/30'
    union select 'RR', 'ss3', '5'select * from ttcreate trigger trig_insert
    on tt
    for insert
    as
      declare @a varchar(20), @b varchar(20), @c varchar(20),@d varchar(20)
      select @a=a,@b=b,@c=c from inserted
      
      if exists (select 1 from #tt where a=@a and b=@b)
      begin
    select @d=c from #tt where a=@a and b=@b

    if exists (select 1 from (select * from split(@c,'/')) a 
    left join (select * from split(@d,'/')) b on a.textstr=b.textstr where b.id is not null)
    begin
    print '有重复,插入失败!'
    rollback tran
    return
    end
    else
    print '插入成功!'
      end
    go--测试
    -------------------------------------------------
    insert into tt values('LL', 'ss0', '2/5/3')
    -------------------------
    有重复,插入失败!
    消息 3609,级别 16,状态 1,第 1 行
    事务在触发器中结束。批处理已中止。insert into tt values('LL', 'ss0', '2/9/3')
    ------------------------
    插入成功!(1 行受影响)select * from tt
    -----------------------
    a b c
    GE ss2 0/2/25/30
    LL ss0 5/6/8/4
    RR ss3 5
    LL ss0 2/9/3
    -------------------------------------------------
      

  5.   

    6楼用到的那个拆分函数
    /*
    返回用@spl拆分@str后的列表
    */
    IF OBJECT_ID('split', 'tf') IS NOT NULL 
        Drop function split
    GO
    create function split
    (
    @str varchar(2000),
    @spl varchar(2)=','
    )
    returns @table table
    (
    id int identity(1,1),
    textstr varchar(200)
    )
    as
    begin
    declare @dang int
    declare @next int
    declare @text varchar(200)
    set @dang=1
    while @dang<=len(@str)
    begin
    set @next=charindex(@spl,@str,@dang)
    if @next=0 or @next is null
    set @next=len(@str)+1
    set @text=substring(@str,@dang,@next-@dang)
    insert into @table values(@text)
    set @dang=@next+1
    end
    return
    end
    goselect * from split('cxn,fdwer,wercv,sdf,345,h,fgfg,5,fg',',')
      

  6.   


    不好意思,是我写错了,所有表都应该是tt的,因为我开始建的是临时表,后面忘记改了...tt是一个测试的表