update t1.bb set t1.bb = replace(t1.bb,t2.ny,'') from sxl t1,xxy t2 where t1.aa = t2.wjh
是通过 aa , wjh 两个字段关联的 select @s2=bb FROM sxl WHERE aa=@s(@s就是wjh取出的数据) 如果用replace是不可行的 可能我没有说清楚,在sxl中 如果aa=1111111,bb字段值是,2004,200501,200502,200503,200601 而xxy表中wjh字段中也有1111111的记录,ny 字段是为200501;那么更新后 sxl 表中 应显示为: aa bb -------------------- 1111111 ,200401,200601 把aa=1111111 与之对应的2005年的记录全删除掉
如果这样的话,你的这个语句: if (SELECT count(*) FROM sxl WHERE and aa=@s )>0 and (SELECT count(*) FROM sxl WHERE bb like '%'+@s1+'%' )>0就不对。因为你的条件是like '%'+@s1+'%' 按你上面说的应该改为'%'+substring(@s1,2,4)+'%'还有set @len=CHARINDEX(',200601',@s2)-CHARINDEX(@s1,@s2)这句 应该写成set @len=CHARINDEX(',200601',@s2)-CHARINDEX(substring(@s1,2,4),@s2)还有',200601'在后面是死的吗?如果xxy中的数据是2006年的话,这个语句是不是就不对了阿
如果这样的话,你的这个语句: if (SELECT count(*) FROM sxl WHERE and aa=@s )>0 and (SELECT count(*) FROM sxl WHERE bb like '%'+@s1+'%' )>0就不对。因为你的条件是like '%'+@s1+'%' ________________________________________________ 我是有两个条件的,(1)xxy中的wjh的记录要对应sxl中的aa (2)xxy中的ny包含于sxl中的bb 还有set @len=CHARINDEX(',200601',@s2)-CHARINDEX(@s1,@s2)这句 应该写成set @len=CHARINDEX(',200601',@s2)-CHARINDEX(substring(@s1,2,4),@s2)还有',200601'在后面是死的吗?如果xxy中的数据是2006年的话,这个语句是不是就不对了阿 _________________________________________________________ 这一点我还没处理好,我的想法是如果xxy中ny字段中的值是,200501 __________________________________________________________________________ 你的substring(@s1,2,4)只是取的年,我是以,年月(,200501)去查询的 还有,200401,200501,200601是在sxl字段bb内的数据值,如果xxy中的ny值为,200501而sxl字段bb内的数据值为,200401,200501,200502,200503,200601更新后要将,200501,200502,200503删除掉。也就是说xxy中的ny值为,200503必须要将,200503之后所有2005年(,200503,200504,200505,200506,200507,200508,200509,200510,200511,200512)的数据删除
sxl 中有aa,bb字段; aa bb ___________________________ 1111111 ,200401,200501,200601 2222222 ,200401,200505,200601 3333333 ,200401,200501,200601 xxy中有wjh,ny 字段; wjh ny ___________________________ 1111111 ,200501 2222222 ,200505 3333333 ,200501其实主要是以下问题: use DSTrans DECLARE @len int DECLARE @len3 int DECLARE @s varchar(8000) DECLARE @s1 varchar(8000) DECLARE @s2 varchar(8000) DECLARE Customer_cursor2 cursor for select wjh,ny from xxy open Customer_cursor2 Fetch Next from Customer_cursor2 into @s,@s1 while @@Fetch_status=0 Begin select @s2=bb FROM sxl WHERE aa=@s set @len=CHARINDEX(',200601',@s2)-CHARINDEX(@s1,@s2) select @len Fetch Next From Customer_cursor2 into @s,@s1 end close Customer_cursor2 Deallocate Customer_cursor2 执行后 @len=15但是执行以下找码DECLARE @len int DECLARE @s varchar(8000) DECLARE @s1 varchar(8000) set @s=',200501' set @s1=',200401,200501,200601' set @len=CHARINDEX(',200601',@s1)-CHARINDEX(@s,@s1) select @len 执行后:@len=7这是为什么???????????????????????????????
set t1.bb = replace(t1.bb,t2.ny,'')
from sxl t1,xxy t2
where t1.aa = t2.wjh
select @s2=bb FROM sxl WHERE aa=@s(@s就是wjh取出的数据)
如果用replace是不可行的
可能我没有说清楚,在sxl中 如果aa=1111111,bb字段值是,2004,200501,200502,200503,200601
而xxy表中wjh字段中也有1111111的记录,ny 字段是为200501;那么更新后
sxl 表中 应显示为: aa bb
--------------------
1111111 ,200401,200601
把aa=1111111 与之对应的2005年的记录全删除掉
if (SELECT count(*) FROM sxl WHERE and aa=@s )>0 and (SELECT count(*) FROM sxl WHERE bb like '%'+@s1+'%' )>0就不对。因为你的条件是like '%'+@s1+'%'
按你上面说的应该改为'%'+substring(@s1,2,4)+'%'还有set @len=CHARINDEX(',200601',@s2)-CHARINDEX(@s1,@s2)这句
应该写成set @len=CHARINDEX(',200601',@s2)-CHARINDEX(substring(@s1,2,4),@s2)还有',200601'在后面是死的吗?如果xxy中的数据是2006年的话,这个语句是不是就不对了阿
--因为你的年份的格式很确定,所以可以这样写
update t1.bb
set t1.bb =
replace(
replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(t1.bb,left(t2.ny,5) + '01',''),left(t2.ny,5) + '02',''),left(t2.ny,5) + '03',''),left(t2.ny,5) + '04',''),left(t2.ny,5) + '05',''),left(t2.ny,5) + '06',''),left(t2.ny,5) + '07',''),left(t2.ny,5) + '08',''),left(t2.ny,5) + '09',''),left(t2.ny,5) + '10',''),left(t2.ny,5) + '11',''),left(t2.ny,5) + '12','')
from sxl t1,xxy t2
where t1.aa = t2.wjh就是把所对应年份的12个月都替换出来!嘿嘿
这样写的语句不受你查询的年份的限制。
if (SELECT count(*) FROM sxl WHERE and aa=@s )>0 and (SELECT count(*) FROM sxl WHERE bb like '%'+@s1+'%' )>0就不对。因为你的条件是like '%'+@s1+'%'
________________________________________________
我是有两个条件的,(1)xxy中的wjh的记录要对应sxl中的aa
(2)xxy中的ny包含于sxl中的bb
还有set @len=CHARINDEX(',200601',@s2)-CHARINDEX(@s1,@s2)这句
应该写成set @len=CHARINDEX(',200601',@s2)-CHARINDEX(substring(@s1,2,4),@s2)还有',200601'在后面是死的吗?如果xxy中的数据是2006年的话,这个语句是不是就不对了阿
_________________________________________________________
这一点我还没处理好,我的想法是如果xxy中ny字段中的值是,200501
__________________________________________________________________________
你的substring(@s1,2,4)只是取的年,我是以,年月(,200501)去查询的
还有,200401,200501,200601是在sxl字段bb内的数据值,如果xxy中的ny值为,200501而sxl字段bb内的数据值为,200401,200501,200502,200503,200601更新后要将,200501,200502,200503删除掉。也就是说xxy中的ny值为,200503必须要将,200503之后所有2005年(,200503,200504,200505,200506,200507,200508,200509,200510,200511,200512)的数据删除
expression1 , expression2两个值是否都可以为变量
aa bb
___________________________
1111111 ,200401,200501,200601
2222222 ,200401,200505,200601
3333333 ,200401,200501,200601
xxy中有wjh,ny 字段;
wjh ny
___________________________
1111111 ,200501
2222222 ,200505
3333333 ,200501其实主要是以下问题:
use DSTrans
DECLARE @len int
DECLARE @len3 int
DECLARE @s varchar(8000)
DECLARE @s1 varchar(8000)
DECLARE @s2 varchar(8000)
DECLARE Customer_cursor2 cursor for
select wjh,ny from xxy
open Customer_cursor2
Fetch Next from Customer_cursor2
into @s,@s1
while @@Fetch_status=0
Begin
select @s2=bb FROM sxl WHERE aa=@s
set @len=CHARINDEX(',200601',@s2)-CHARINDEX(@s1,@s2)
select @len
Fetch Next From Customer_cursor2
into @s,@s1
end
close Customer_cursor2
Deallocate Customer_cursor2
执行后
@len=15但是执行以下找码DECLARE @len int
DECLARE @s varchar(8000)
DECLARE @s1 varchar(8000)
set @s=',200501'
set @s1=',200401,200501,200601'
set @len=CHARINDEX(',200601',@s1)-CHARINDEX(@s,@s1)
select @len
执行后:@len=7这是为什么???????????????????????????????
(2)xxy中的ny包含于sxl中的bb(1)要对应,就加上对应条件sxl.aa = xxy.wjh 我想这一点你自己清楚就不用我说了吧,所以我才没有提。
(2)要包含于,那肯定就要like "%...%",用like 是没有错的错误的地方在于:其实你还有一点没有表述清楚就是:“200503必须要将,200503之后所有2005年的数据”这一点。
请问CHARINDEX ( expression1 , expression2 [ , start_location ] ) 语法中
expression1 , expression2两个值是否都可以为变量
这个没有问题。