数据库有三个字段型别 零件号 工序号LL ss0 5/6/8/4GE ss2 0/2/25/30RR ss3 5假如输入LL ss0 2/5/3 应该提示有重复 因为5在第一条数据里面已经出现过了前两个字段和第三个字段的某个进行判断是否有重复的情况 能不能做啊?使用sql 2005处理如果数据量比较大的话,这个是不是很浪费时间啊?
调试欢乐多
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/3是不是应该插进去呢?是另插一条,还是附加在第一条数据里面呢?这样的表不符合第一范式,处理麻烦,而且容易出问题。
(
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
-------------------------------------------------
/*
返回用@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',',')
不好意思,是我写错了,所有表都应该是tt的,因为我开始建的是临时表,后面忘记改了...tt是一个测试的表