这样做:
if (exists (select name 
from sysobjects
where (name = N'up_DeleteRepeat') and (type='P')))
drop procedure up_DeleteRepeat
go
CREATE PROCEDURE [dbo].up_DeleteRepeat
@tableName varchar (50)

AS
declare @sql varchar(500)
BEGIN
set @sql='select * from '+@tableName
        exec(@sql)

END

解决方案 »

  1.   

    exec('select * from'+ @tableName)
      

  2.   

    CREATE PROCEDURE [dbo].up_DeleteRepeat
    @tableName varchar (50)

    AS
    BEGIN
        EXEC('select * from '+@tableName)
    END
    go
      

  3.   

    create proc up_DeleteRepeat
    {
    @tableName varchar(50),--表名
    @columnName varchar(50),--重复字段名
    @keyColumn varchar(50),--关键字
    @orderColumn varchar(50),--排序字段
    @orderMethod int --0:升序;1:降序
    }
    AS
    BEGIN
       declare @orderMethodName varchar(10)--排序方式
       declare @sql varchar(8000)
       case when  @orderMethod ='0' then
          @orderMethodName='asc'
       else
          @orderMethodName='desc'
       end   set @s = 'select * into #temp
                 from '+@tableName+' as a
                 where a.@keyColumn = 
                       (select top 1 '+@keyColumn'+ 
                               from '+@tableName+' 
                               where '+@columnName+' = a.'+@columnName+' 
                               order by '+@orderColumn+' '+@orderMethodName+' )
                 order by a.'+@orderColumn+'  '+@orderMethodName
       set @s = @s + '     drop table '+@tableName
       set @s = @s + '     select * into '+@tableName+' from #temp'
       set @s = @s + '     drop table #temp'
       exec(@s)
    END
    go
      

  4.   

    谢谢答复可为什么这里不需要用EXEC呢,?CREATE PROCEDURE dbo.addemployee
    (
           @intepid int,
           @txtemname varchar(20),
           @txtemmobile varchar(20),
    @tracetimestart varchar (50),
    @traceduration varchar(50),
    @tracesolt varchar(50),
    @isShishi int
    )
    AS
         begin 
             insert into employeetb (intepid,txtemname,txtemmobile,txtempwd) values (@intepid,@txtemname,@txtemmobile,'123456')
             insert into trace_timer (corpid,mobileid,starttime,traceslot,traceduration,mutesms,weekend_trace) values (@intepid,@txtemmobile,@tracetimestart,@tracesolt,@traceduration,@isshishi,'1')
         endGO
      

  5.   

    if (exists (select name 
    from sysobjects
    where (name = N'up_DeleteRepeat') and (type='P')))
    drop procedure up_DeleteRepeat
    go
    CREATE PROCEDURE [dbo].up_DeleteRepeat
    @tableName varchar (50)

    AS
    declare @sql varchar(500)
    BEGIN
    set @sql='select * from '+@tableName --修改之处,这里是不允许用变量
            exec(@sql)

    END
      

  6.   

    同意楼上的,只能组成字符串,再EXEC
      

  7.   

    我还问为什么有的地方需要拼凑SQL语句后执行,为什么有的地方不行呢?如何判断呢?
    下面的为啥不需要拼凑SQL语句后执行
    CREATE PROCEDURE dbo.addemployee
    (
           @intepid int,
           @txtemname varchar(20),
           @txtemmobile varchar(20),
    @tracetimestart varchar (50),
    @traceduration varchar(50),
    @tracesolt varchar(50),
    @isShishi int
    )
    AS
         begin 
             insert into employeetb (intepid,txtemname,txtemmobile,txtempwd) values (@intepid,@txtemname,@txtemmobile,'123456')
             insert into trace_timer (corpid,mobileid,starttime,traceslot,traceduration,mutesms,weekend_trace) values (@intepid,@txtemmobile,@tracetimestart,@tracesolt,@traceduration,@isshishi,'1')
         endGO
      

  8.   

    一般来说tablename ,field等不能作为变量。真要使用必须像楼上几位所用的方法,用Exec(sql)
      

  9.   

    谢谢各位解答!!!
    可现在还有一个问题--为什么不能使用临时表@aaa呢?不使用临时表而使用aaa是可以的
    请赐教.
    --**************************************************************************
    --up_DeleteRepeat
    --表中一个字段重复的记录只保留一条.
    --**************************************************************************
    if (exists (select name 
    from sysobjects
    where (name = N'up_DeleteRepeat') and (type='P')))
    drop procedure up_DeleteRepeat
    go
    create proc up_DeleteRepeat @tableName varchar(50),--表名
    @columnName varchar(50),--重复字段名
    @keyColumn varchar(50),--关键字
    @orderColumn varchar(50),--排序字段
    @orderMethod int --0:升序;1:降序ASBEGIN
    declare @strSql varchar(8000)
    declare @orderMethodName varchar(10)--排序方式
    if   @orderMethod =0  
    set @orderMethodName='asc'
    else if @orderMethod=1 
    set @orderMethodName='desc'
    else 
    set @orderMethodName='asc'

    set @strSql='select * into #aaa from '+@tableName+' as a where a.'+@keyColumn +'='
    set @strSql=@strSql+'(select top 1 '+@keyColumn+' from '+@tableName+' where 
     '+@columnName+'=a.'+@columnName+' order by '+@orderColumn+'  '+@orderMethodName+') order by '+@orderColumn +' '+@orderMethodName

    exec (@strSql)
    exec ('drop table '+@tableName)
    exec ('select * into '+@tableName+ ' from #aaa')
    exec ('drop table #aaa')
    END
    go
    --**************************************************************************
      

  10.   

    这里需要全局临时表##aaa才可以的吧???
      

  11.   

    同感,如果是表名非得要用变量的话,就得用exec,否则会出错的!我遇到过和楼主一样的问题,就是表名用了变量!