就象你上面这样写,写 b+c 这样的就行了。运行时就要用动态SQL执行了。
declare @sql  varchar(8000)
select @sql=''
selelct @sql='update mytable set a='+d+' where d='''+d+'''
from mytableexec (@sql)

解决方案 »

  1.   

    写错了一点:
    selelct @sql=@sql+' update mytable set a='+d+' where d='''+d+''''
    from mytable
      

  2.   

    还是要改改:(这样会好一点避免重复执行:
    selelct @sql=@sql+' update mytable set a='+d+' where d='''+d+''''
    from (select distinct d from mytable) t0
      

  3.   

    不明白意思,where语句是起什么作用?
      

  4.   

    TO icevi(按钮工厂):
     师兄,好象不行啊。你那句from (select distinct d from mytable) t0 不在@sql里面吗? 麻烦能解释一下' where d='''+d+''''的意思吗?请赐教谢谢。
      

  5.   

    TO:按钮,如果记录老多,就不好了.
    (我没测试)
    还是用函数.在函数内调用openrowset或openquery
    create function comput(@b float,@c float,@d varchar(100))
    returns float
    as 
    begin
    declare @sql nvarchar(500),@result float
    set @sql='select '+@d+' from (select '+cast(@a as varchar(10))+'as b,'+cast(@b as varchar(10))+' as c) a'
    set @result=OPENROWSET(‘provider_name’,’datasource’;    ‘user_id’;’password’, @sql)
    return @result
    end语句:
    update table set a=dbo.comput(b,c,d)
      

  6.   

    declare @aa varchar(10)
    select @aa = d from aa where ???
    exec ("update aa set a = "+@aa)
      

  7.   

    j9988(j9988) 说得对,用我的方法因为字符型有长度限制,所以可能会有问题。我是提示一个方法,用 j9988(j9988) 的方法应该可以,但是对每条记录可能都要调用一次函数,可能也会增加些运算的开销。不过我没测试过,有时间再试一下。
    我用distinct 取出所有的公式,结果集一般情况下不会很多。如果有很多 ,可以一步步执行,不必一次全部执行完。newyu1127(825新生) :
    以b+c为例,生成的SQL语句应该是:
    update mytable set a=b+c where d='b+c'一定要加where ,因为d字段可能还有不是'b+c'的。
    如果表里面d字段的值有 b+c   b*c  两种(记录可能不止两条),用我的方法会生成两个update 语句:
    update mytable set a=b+c where d='b+c'
    update mytable set a=b*c where d='b*c'
    这就是为什么要用distinct 的原因。
      

  8.   

    不好意思,不行。
    openquery和openrowset 好象不接受变量参数。
    只有按钮的可以。
      

  9.   

    icevi(按钮工厂) ( ):如你如写的:
    declare @sql  varchar(8000)
    select @sql=''
    select @sql='update aaa set a='+d+' where d='''+d+''''  from 
    (select distinct d from aaa) t0
    exec (@sql)为什么只会更新一条记录。而另外的记录不会变呢(目前记录只有三条)?按你的意思应该是这样的:
    update aaa set a=b+c where d='b+c' from (select distinct d from aaa) t0为什么update后再加一个from呢?还有一个t0是什么意思??
      

  10.   

    找了帮且。不知道t0是什么意思?update后加from:FROM 子句中指定的表的别名不能作为 SET column_name 子句中的限定符使用。
      

  11.   

    我试过是好的呀。
    我说过了我的语句会是这样的:
    update mytable set a=b+c where d='b+c'
    update mytable set a=b*c where d='b*c'你用:
    declare @sql  varchar(8000)
    select @sql=''
    select @sql='update aaa set a='+d+' where d='''+d+''''  from 
    (select distinct d from aaa) t0
    print @sql   --加上这一句看生成的SQL语句
    exec (@sql)你看看结果就知道我生成的语句不是你写出来的那样的,上面的select @sql=....这句你再仔细看看。绝对不会成
    update aaa set a=b+c where d='b+c' from (select distinct d from aaa) t0
    这个样子的,你看你是不是把几个单引号搞错了。我测试的结果是都会更新的。
      

  12.   

    怪了,
    declare @sql  varchar(8000)
    select @sql=''
    select @sql='update aaa set a='+d+' where d='''+d+''''  from 
    (select distinct d from aaa) t0
    print @sql   --加上这一句看生成的SQL语句
    exec (@sql)
    更新的是b*c这一记录,如果将distinct去掉,更新的将是b-c。我再看看。
    记录是这样
    a b c d
    1 1 2 b+c
    1 2 3 b-c
    1 23 2 b*c
    按上面的sql按F5运行,就只更新一记录。
    再去查查。
      

  13.   

    给分,我知道,
    忘了看上面的select @sql=''
    select @sql=@sql+'update aaa set a='+d+' where d='''+d+''''  from 
    (select distinct d from aaa) t0一定要加入@sql=@sql.....不过不明白的是t0是什么??顺便帮我解答下好吗?呆会儿结帐。
      

  14.   

    t0是表的别名,嵌套SQL的语法要求加一个别名的。
      

  15.   

    必须构造动态 SQL, exec!