我在开发系统的时候,写了一个SQL代码,如下:
declare @CardID int,@pmember_login varchar(10),@pmember_pwd varchar(10)
declare @mycount int,@i int
select @i = 0
select @mycount = count(*) from [Job_p_pmember] where pmember_login ='7' 
myLoop:
select @CardID=pmember_CardID from [Job_p_pmember] where pmember_login ='7'
if @CardID>0 
begin
select @pmember_login= CardNo,@pmember_pwd = CardPwd from [Job_CardInfo] where CardID = @CardID
print @pmember_login  第一条结果:7079158
print @pmember_pwd    第一条结果:13038
--下面的语句将取到的值更新到pmember中
Update [pmember] Set pmember_login = @pmember_login,pmember_pwd =@pmember_pwd where pmember_CardID= @CardID(这里有问题)
select @i = @i+1
end
while (@i<@mycount)
goto myLoop更新后的数据库中的结果是pmember_login='7',为什么我已经将变量设置为字符型的了,更新的时候变成第一个数字了呢?

解决方案 »

  1.   

    while (@i<@mycount)
    goto myLoop
      

  2.   

    读取job_p_pmember表中的pmember_login为7的记录,取得对应的cardid,然后在循环读取card表中对应的卡号和密码,更新到member表中对应的cardid的卡号和密码
      

  3.   

    你这个循环就是遍历[Job_p_pmember]中 pmember_login=7的所有pmember_CardID?
    select @CardID=pmember_CardID from [Job_p_pmember] where pmember_login ='7'
      

  4.   

    对的,没有任何疑问。如果你想更新后的显示结果是pmember_login='7',这样:select @i = 0
    select @mycount = count(*) from [Job_p_pmember] where pmember_login ='''7'''
    myLoop:
    select @CardID=pmember_CardID from [Job_p_pmember] where pmember_login ='''7'''
    if @CardID>0
      

  5.   

    代码没有错,错在这里取到的值是这样的
    print @pmember_login  第一条结果:7079158
    print @pmember_pwd    第一条结果:13038
    更新到数据库中时变成这样的:
    7
    1
    只剩下了一个字符
      

  6.   

    Update aa Set pmember_login = bb.CardNo,pmember_pwd =bb.CardPwd 
    from [pmember] aa inner join 
    (select a.cardNo,a.CardPwd,a.CardID from [Job_CardInfo] a inner join [Job_p_pmember] b on a.CardID=b.pmember_CardID where pmember_login ='7' and pmember_cardid>0) bb
    on aa.pmember_CardID=bb.CardId
      

  7.   

    感谢chuifengde(树上的鸟儿) ,你写的代码解决了我要做的,但是我写的明明可以运行的,为什么会出现这种错误的呢?我看到有的资料用exec解决的,exec update语句,不知道是不是没有写成动态的语句的缘故。
      

  8.   

    循环没有问题的,我的循环是这样,首先取得所有满足条件的条数@mycount,然后按照顺序一条条处理每处理一条序数@i加1,直到处理完毕为止。我只想知道取出来的值为什么更新数据库中就出错了,我使用的是=,是不是不能直接等于,要将取出的数值加上引号呢?
      

  9.   

    我比较笨,假如select pmember_CardID from [Job_p_pmember] where pmember_login ='7'能取到3条pmember_CardID分别是1,2,3,你能用goto来遍历到1,2,3并分别赋到@CardID?
      

  10.   

    不是很清楚你要实现的目录,
    不过其中
    select @CardID=pmember_CardID from [Job_p_pmember] where pmember_login ='7'
    只能取得最后一条记录的pmember_cardid,也就是每次循环得到的@cardid的值是一样的
    如要取得各条记录的pmember_cardID值,应该建一游标如下
    declare job_p_pmember cursor for select pmember_cardid from job_p_pmember where pmember_login='7'
    open job_p_pmember
    fetch next from job_p_pmember into @cardid
    while @@fetch_status=0 
    begin
      对各个@cardid进行处理
       ........
      fetch next from job_p_pmember into @cardid
    end
      

  11.   

    事实上,小陈的问题我已经考虑到,其实我的这个SQL取得值以后,就更新了pmember_login,也就是pmember_login在赋值以后,不会在等于7了。因此@CardID就会发生改变的。这个 [pmember]其实就是【Job_p_pmember】,因此小陈的问题是不存在的。我发表了这么多天,发现大家都在讨论我的程序,而不是我想要解决的问题,我想要解决的是:
    select @pmember_login= CardNo,@pmember_pwd = CardPwd from [Job_CardInfo] where CardID = @CardID
    print @pmember_login  第一条结果:7079158
    print @pmember_pwd    第一条结果:13038
    这是我取到的值,下一步我更新到数据库中:
    Update [Job_p_pmember] Set pmember_login = @pmember_login,pmember_pwd =@pmember_pwd where pmember_CardID= @CardID(执行这条语句)然后我才读取pmember_login 和 pmember_pwd,结果是:
    pmember_login:7
    pmember_pwd:1
    数据发生了截断现象,我想知道这是怎么回事?诶,回答问题的人太多了,准备加分到50
      

  12.   

    select @CardID=pmember_CardID from [Job_p_pmember] where pmember_login ='7'这个@CardID值怎么可能变? 这个一定是指定顺序的pmember_CardID的最后一个数值啊
      

  13.   

    这个是会变的,因为如果开始有6条等于7的,更新以后就剩下5条等于7了,这个时候@CardID就发生了改变。每次循环是读取一条满足条件的记录,所以@CardID会不停的发生改变的
      

  14.   

    虽然这么说,但是觉得LZ写得肯定不怎么好。好的SQL不可能写成这个样子,而且LZ这个牵涉逻辑似乎太多了
      

  15.   

    就你上面的代码,@i没啥作用,所以
    select @i = 0
    select @mycount = count(*) from [Job_p_pmember] where pmember_login ='7' 
    select @i = @i+1
    while (@i<@mycount)
    这几句都没大用。光看以上的代码也看不清实质,你得给出表结构,数据,过程代码