ALTER proc [dbo].[getguest] 
 as 
declare @sql nvarchar(200)
 begin
 set @sql='select * from guest'
end
go
exec(@sql)错误提示:必须声明变量 '@sql'。
我就奇怪,我都声明了呀,怎么还会出错,请大虾指点

解决方案 »

  1.   


    ALTER proc [dbo].[getguest]  
    as  
    begin
      declare @sql nvarchar(200)
      set @sql='select * from guest'
    exec(@sql)
    end
    go
      

  2.   


    --出错问题:变量声明在存储过程里,而EXEC调用的@sql是在存储过程外部,所以编译时会提示没有声明变量。--在外部运用EXEC可以:
    declare @sql varchar(8000)
    set @sql = 'select * from guest'
    exec(@sql)
    --或直接
    exec('select * from guest')
      

  3.   


    ALTER proc [dbo].[getguest]  
     as  
    declare @sql nvarchar(200)
     begin
     set @sql='select * from guest'
     exec (@sql)
    end
    goexec getguest--exec 存储过程名称 
      

  4.   

    ALTER proc [dbo].[getguest]  
     @id int,
     @sql nvarchar(200)as 
     begin
    set @id=4
    set @sql='select * from guest where id='+cast(@id as char(10))
     exec (@sql)
    end
    goexec getguest--exec 存储过程名称 错误提示:过程 'getguest' 需要参数 '@id',但未提供该参数。
    我把变量声明提到最上边就不行了!
      

  5.   


    ALTER proc [dbo].[getguest]  
    as  
    begin
     declare @sql nvarchar(200)
     set @sql='select * from guest'
     exec(@sql)
    end
    go
      

  6.   

    ALTER proc [dbo].[getguest]   
    @id int
    as  
    begin
    @sql nvarchar(4000)
        set @sql = N'select * from guest where id = ' + cast(@id as varchar(10))
    exec (@sql)
    end
    goexec getguest '4'
      

  7.   


    ALTER proc [dbo].[getguest]   
    @id int
    as  
    begin
    declare @sql nvarchar(4000)
        set @sql = N'select * from guest where id = ' + cast(@id as varchar(10))
    exec (@sql)
    end
    goexec getguest '4'
      

  8.   

    没有必要提到参数的位置上,如果是参数的话,你要把整个select语句传过来而不是只传id,而你已经定义传id了,因此,只需要在过程内部定义一个变量,并赋为查询语句字符串,并执行动态查询就行了.
      

  9.   

    ALTER proc [dbo].[getguest]   
     @id int,
     @sql nvarchar(200)as  
     begin
    set @id=4
    set @sql='select * from guest where id='+cast(@id as char(10))
     exec (@sql)
    end
    goexec getguest--exec 存储过程名称@id int,
     @sql nvarchar(200)
    这两个变量不能这样声明么?
      

  10.   

    在MSSQL里,是很少用全局变量的,全局变量大都是系统级的变量.