declare @s2 varchar(4000),@s3 varchar(4000)
set @s2=''
set @s3=''
set @s3='select @S2=@S2+RTRIM(ItemName)
         FROM (select Distinct ItemName from TAB1) B
          GROUP BY ItemName'exec(@s3)执行提示错误:
Server: Msg 137, Level 15, State 1, Line 3
必须声明变量 '@s2'。其实目的就是动态生成一条命令@S3,执行这条命令. 应该怎么解决这个错误?(不要看我语句是否合理,我是简化了。)

解决方案 »

  1.   


    --如何将exec执行结果放入变量中?  declare   @num   int,   @sql   nvarchar(4000)  
    set   @sql= 'select   @a=count(*)   from   tableName   '  
    exec   sp_executesql   @sql,N '@a   int   output ',@num   output  
    select   @num  大概这样,楼主的语句有很多问题
      

  2.   


    declare @s2 varchar(4000),@s3 nvarchar(4000) 
    set @s2='' 
    set @s3='' 
    set @s3='select 'S2'='''+@S2+'''+RTRIM(ItemName) 
             FROM (select Distinct ItemName from TAB1) B 
              GROUP BY ItemName' exec(@s3) 
      

  3.   


    declare @s2 varchar(4000),@s3 nvarchar(4000) 
    set @s2='' 
    set @s3='' 
    set @s3='select @S2=isnull(@S2,'''')+RTRIM(ItemName) 
             FROM (select Distinct ItemName from TAB1) B 
              GROUP BY ItemName' exec @s3,N'@s2 varchar(4000) output' ,@s2 outputselect @s2
      

  4.   


    -----不要用Execdeclare @s2 varchar(4000)
    set @s2='' select @S2=@S2+RTRIM(ItemName) 
             FROM (select Distinct ItemName from TAB1) B 
              GROUP BY ItemNameselect @s2 
      

  5.   

    搂住你的语句有问题exec(@s3) 其实是在执行
    select @S2=@S2+RTRIM(ItemName) 
             FROM (select Distinct ItemName from TAB1) B 
              GROUP BY ItemName
    你当然没声明 
    你看来要写循环的!
      

  6.   

    1.错误的是你把变量放在字符窜里,exec是认不到这个@s2的
    2.使用sp_executesql来执行,并声明变量,同时需要将@s3定义为nvarchar,因为sp_executesql只对nvarchar有效
    参照:
    declare @s2 varchar(400),@s3 nvarchar(4000) 
    set @s2='' 
    set @s3='' 
    set @s3='select @S2=@S2+RTRIM(name)  
             FROM (select Distinct name from sys.objects) B 
              GROUP BY name  ' 
    print @s3
    exec sp_executesql @s3
    ,N'@S2 varchar(400)'
    ,@s2
    3.要查看信息,那么需要select出来
    参照:
    declare @s2 varchar(400),@s3 nvarchar(4000) 
    set @s2='' 
    set @s3='' 
    set @s3='select @S2=@S2+RTRIM(name)  
             FROM (select Distinct name from sys.objects) B 
              GROUP BY name  select @s2' 
    print @s3
    exec sp_executesql @s3
    ,N'@S2 varchar(400)'
    ,@s2问题已经解决!
      

  7.   

    动态语句传入参数举例:use northwind
    declare @Tmp nvarchar(110),@id int,@sd int
    set @sd=3
    set @Tmp = 'select @id2=Employeeid from Employees where Employeeid='+ cast(@sd as varchar)
    print @tmp
    exec sp_executesql @Tmp,N'@id2 int output', @id output
      
    if isnull(@id,0) <> 0
    select @id
    else
    select '没有找到' 
      

  8.   

    感谢各位帮助。经各位提点和测试,下述语句可以实现:
    declare @s2 varchar(4000),@s3 nvarchar(4000),@curzt char(10)
    set @curzt='200708'
    set @s2=''
    set @s3=''
    set @s3='select @S2=isnull(@S2,'''')+'''+',['+'''+RTRIM(ItemName)+'''+']=max(CASE ItemName WHEN '''+'+RTRIM(ItemName)+'''+' THEN ItemValue ELSE space(10) END)'''+ 
            ' FROM (select Distinct ItemName from StaffExtendInfo'+@CurZT+') B
              GROUP BY ItemName'exec sp_executesql @s3,N'@S2 Varchar(4000) output',@s2  outputselect @s2只是上面的‘号太多,有没办法简化?
    马上结贴。