exec('select * from '+@tbname)

解决方案 »

  1.   

    动态sql语句基本语法  
    1   :普通SQL语句可以用Exec执行  eg:       Select   *   from   tableName  
                      Exec( 'select   *   from   tableName ')  
                      Exec   sp_executesql   N 'select   *   from   tableName '         --   请注意字符串前一定要加N  2:字段名,表名,数据库名之类作为变量时,必须用动态SQL  eg:      
    declare   @fname   varchar(20)  
    set   @fname   =   'FiledName '  
    Select   @fname   from   tableName                             --   错误,不会提示错误,但结果为固定值FiledName,并非所要。  
    Exec( 'select   '   +   @fname   +   '   from   tableName ')           --   请注意   加号前后的   单引号的边上加空格  当然将字符串改成变量的形式也可  
    declare   @fname   varchar(20)  
    set   @fname   =   'FiledName '   --设置字段名  declare   @s   varchar(1000)  
    set   @s   =   'select   '   +   @fname   +   '   from   tableName '  
    Exec(@s)                                 --   成功  
    exec   sp_executesql   @s       --   此句会报错  
    declare   @s   Nvarchar(1000)     --   注意此处改为nvarchar(1000)  
    set   @s   =   'select   '   +   @fname   +   '   from   tableName '  
    Exec(@s)                                 --   成功          
    exec   sp_executesql   @s       --   此句正确  3.   输出参数  
    declare   @num   int,   @sql   nvarchar(4000)  
    set   @sql= 'select   count(*)   from   tableName '  
    exec(@sql)  
    --如何将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.   

    在SQL语句中表名是否能为可变?  
    可以使用动态sqlselect count(*) from [交易+str(year(getdate())) + str(month(getdate()))] 该为declare @tbname varchar(20)
    set @tbname='交易'+str(year(getdate())) + str(month(getdate()))exec ('select * from'+@tbname)
      

  3.   

    也可在程序中调用动态表名,<C#>使用方法与数值型变量调用同
      

  4.   


    declare @sql='select count(*) from [交易'+str(year(getdate())) + str(month(getdate()))+']'
    exec(@sql) 
      

  5.   


    /*
    标题:日期分表查询(version 1.0)
    作者:张权
    网名:悬崖边的舞者
    时间:2008-07-14
    地点:天津
    说明:以日期或月份分表进行多日、多月查询连表查询的有关写法
    */Create Procedure  Search
    @date1 datetime, --起始时间
    @date2 datetime  --终止时间
    as
    declare @date1New datetime,  
     @rq varchar(6),
     @i int , --记录循环次数
     @s varchar(5000) --根据表多少 可以扩大它
    set @rq=convert(varchar,@date1,12) --把时间格式化 比如2008-06-20 变成了080620
    --set @rq=select convert(varchar,@date1,12)是完全错误的
    --select的作用的显示 不是传值set @s='select * from sensor'+@rq --初始化 @s='select * from sensor080620' 这样第一个表就有了 
     
    set @i=datediff(d,@date1,@date2) --日期相减while @i>0
    begin
     --如果是非常重要的系统可以在这里加上该物理表是否存在的语句
    --if   exists(select   *   from   dbo.sysobjects   where   
    --id   =   object_id(N'c')   and   OBJECTPROPERTY(id,N'IsUserTable')=1) 
    --begin     
    --SELECT '存在 '  
    --end
       
     set @date1New= dateadd(day,@i,@date1)
     set @rq=convert(varchar,@date1New,12) 
     --如果是按月进行查询 就修改上面 
     set @s= @s+' union all select * from sensor'+@rq
     set @i=@i-1 --累加
    end--忘了加返回值了 
    select @s
    go
    exec Search '2008-06-20 00:11:11.000','2008-07-25 00:11:11.000'
      drop Procedure  Search
      

  6.   

    这个变量用作字段的好象可以,但用作表名好象不成功.
    我对存储过程不熟,对SQL还熟的.
    我在网上查找from @
    好象也找不到.
    是不是表名不能用这个@型的变量的?
    这个变量的定义我看都与字段是一样的.
    是不是它只能用作字段类型的啊?!
      

  7.   

    总之,你要使表名可变,
    那么就将所有的查询语句,拼接为字符串,然后EXEC执行它,也就是执行动态SQL的意思.
    那么这时候你的表名就可以声明为1个字符变量,不知道这样说,你明白没有.
      

  8.   


    表名可以用@
    declared @a table
      

  9.   


    你这个是定义一个表,而不是一个表名变量.表名可以用字符串,然后EXEC(语句)