declare @Row nvarchar(255)
declare @i int
select @i=COUNT(*)from SRV_Row
while(@i>0)
begin
select @Row=name from SRV_Row where SRV_RowID=@i
update SRV_SUB set @Row='yes'
where
SRV_PART_NO in (select distinct w.SRV_PART_NO from SRV_SUB s inner join ['WINDOWS 7 32$'] w on s.SRV_PART_NO=w.SRV_PART_NO where SUB_PH_NUMBER_AND_DESCRIPTION=@Row)
select @Row
set @i=@i-1
end在这里,我在update的使用,使用了set与@row变量,我的本意是将列名为@row的列的值改为yes.但是在这里,则变成了每循环一次,将@row的值变成了yes.
求解决方法

解决方案 »

  1.   

    exec('update SRV_SUB set'+ @Row_'='yes''
      

  2.   

    exec('update SRV_SUB set'+ @Row_+'='+quotename('yes',''''))
      

  3.   

    这个我使用过,将会提示我没有yes这个列名.
      

  4.   

    用动态执行函数exec()
    declare @Row nvarchar(255)
    declare @sql text(8000)
    declare @i int
    select @i=COUNT(*)from SRV_Row
    while(@i>0)
    begin
    select @Row=name from SRV_Row where SRV_RowID=@i
    @sql ='update SRV_SUB set @Row='yes'
    where
    SRV_PART_NO in (select distinct w.SRV_PART_NO from SRV_SUB s inner join ['WINDOWS 7 32$'] w on s.SRV_PART_NO=w.SRV_PART_NO where SUB_PH_NUMBER_AND_DESCRIPTION=@Row)'
    exec(@sql)
    select @Row
    set @i=@i-1
    end
      

  5.   

    --更新列值为yes是 
    update tb set 列明 = 'yes' where ....
    --设置@Rows = 'yes' 是
    set @Rows = 'yes'
    update tb set 列名 = @Rows where ....
      

  6.   

    设置一个字符串变量,拼接SQL执行语句,然后动态执行,exec  OR  sp_executesql
      

  7.   

    declare @Row nvarchar(255)
    declare @sql text(8000)
    declare @i int
    select @i=COUNT(*)from SRV_Row
    while(@i>0)
    begin
    select @Row=name from SRV_Row where SRV_RowID=@i
    @sql ='update SRV_SUB set'+ @Row +' ='yes'
    where
    SRV_PART_NO in (select distinct w.SRV_PART_NO from SRV_SUB s inner join ['WINDOWS 7 32$'] w on s.SRV_PART_NO=w.SRV_PART_NO where SUB_PH_NUMBER_AND_DESCRIPTION=@Row)'
    exec(@sql)
    select @Row
    set @i=@i-1
    end
      

  8.   

    declare @Row nvarchar(255)
    declare @sql text(8000)
    declare @i int
    select @i=COUNT(*)from SRV_Row
    while(@i>0)
    begin
    select @Row=name from SRV_Row where SRV_RowID=@i
    @sql ='update SRV_SUB set'+ @Row +' =''yes''
    where
    SRV_PART_NO in (select distinct w.SRV_PART_NO from SRV_SUB s inner join [''WINDOWS 7 32$''] w on s.SRV_PART_NO=w.SRV_PART_NO where SUB_PH_NUMBER_AND_DESCRIPTION=@Row)'
    exec(@sql)
    select @Row
    set @i=@i-1
    end
      

  9.   


    这个问题主要就是字符串跟变量连接的问题,你的把语句用引号引起来,作为字符串去跟变量连接,然后再用exec(@sql)
      

  10.   


    exec('update SRV_SUB set'+ @Row+'='+quotename('yes','''')+
    'where
    SRV_PART_NO in (select distinct w.SRV_PART_NO from SRV_SUB s 
    inner join ['+quotename('WINDOWS 7 32$','''')+'] w on s.SRV_PART_NO=w.SRV_PART_NO where SUB_PH_NUMBER_AND_DESCRIPTION='+@Row+')'
      

  11.   

    这个是 quotename的几种用法,但是我按照你的语句写,.会报错quotename附近有语法错误
     quotename('aa') 生成的有效的标识符为 [aa] 
      quotename('aa','') 生成的有效的标识符为 [aa] 
      quotename('aa','''') 生成的有效的标识符为 'aa'
      

  12.   


    'update SRV_SUB set '+ @Row+'='+quotename('yes','''')+
    ' where '+'
    SRV_PART_NO in (select distinct w.SRV_PART_NO from SRV_SUB s 
    inner join ['+quotename('WINDOWS 7 32$','''')+'] w on s.SRV_PART_NO=w.SRV_PART_NO 
    where SUB_PH_NUMBER_AND_DESCRIPTION='+@Row+')'
    你注意一下有的地方应该加空格,特别是在连接的地方,你把这条语句打印出来看看或者复制过去试试,我刚刚发现附近有地方没加空格
      

  13.   

    空格呢,我一开始贴过去我就有加上了,.我估计是quotename有什么使用限制吧,但是也没有找到相关的资料
      

  14.   

    谢谢大家的关注,现在问题已经解决了,其实只要加上exec,然后将一些特殊字段加上转义字符串就好了.declare @Row nvarchar(255)
    declare @i int
    select @i=COUNT(*)from SRV_Row
    while(@i>0)
    begin
    select @Row=name from SRV_Row where SRV_RowID=@i
    exec('update SRV_SUB set ['+@Row+']=''yes''
    where
    SRV_PART_NO in (select distinct w.SRV_PART_NO from SRV_SUB s inner join [''WINDOWS 7 32$''] w on s.SRV_PART_NO=w.SRV_PART_NO where SUB_PH_NUMBER_AND_DESCRIPTION='''+@Row+''')')
    set @i=@i-1
    end