declare @sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000)
select @sql1=' declare @0 varchar(100)',
       @sql2=' select @0=name from tea_base where id=50',
       @sql3=' exec(''select * from tea_base where name=@0'')'
exec(@sql1+@sql2+@sql3)
出现错误变量@0未定义,帮忙改改 
急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!

解决方案 »

  1.   

    标识符
    http://technet.microsoft.com/zh-cn/library/ms175874.aspx常规标识符格式规则取决于数据库兼容级别。该级别可以使用 sp_dbcmptlevel 设置。当兼容级别为 90 时,下列规则适用: 第一个字符必须是下列字符之一: Unicode 标准 3.2 所定义的字母。Unicode 中定义的字母包括拉丁字符 a-z 和 A-Z,以及来自其他语言的字母字符。下划线 (_)、at 符号 (@) 或数字符号 (#)。 
    在 SQL Server 中,某些位于标识符开头位置的符号具有特殊意义。以 at 符号开头的常规标识符始终表示局部变量或参数,并且不能用作任何其他类型的对象的名称。以一个数字符号开头的标识符表示临时表或过程。以两个数字符号 (##) 开头的标识符表示全局临时对象。虽然数字符号或两个数字符号字符可用作其他类型对象名的开头,但是我们建议不要这样做。
    某些 Transact-SQL 函数的名称以两个 at 符号 (@@) 开头。为了避免与这些函数混淆,不应使用以 @@ 开头的名称。 
    后续字符可以包括: 如 Unicode 标准 3.2 中所定义的字母。基本拉丁字符或其他国家/地区字符中的十进制数字。at 符号、美元符号 ($)、数字符号或下划线。标识符一定不能是 Transact-SQL 保留字。SQL Server 可以保留大写形式和小写形式的保留字。不允许嵌入空格或其他特殊字符。不允许使用增补字符。在 Transact-SQL 语句中使用标识符时,不符合这些规则的标识符必须由双引号或括号分隔
      

  2.   

    变量开头必须以字母等命名,如 
    declare @A0 varchar(10)
    试试
    declare @sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000) 
    select @sql1=' declare @A0 varchar(100)', 
          @sql2=' select @A0=name from tea_base where id=50', 
          @sql3=' exec(''select * from tea_base where name=@A0'')' 
    exec(@sql1+@sql2+@sql3) 
      

  3.   

    改:
    declare @sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000) 
    select @sql1=' declare @0 varchar(100)', 
          @sql2=' select @0=name from tea_base where id=50', 
          @sql3=' select * from tea_base where name=@0' 
    exec(@sql1+@sql2+@sql3) 
      

  4.   


    没有这说法吧..
    他的错是在sql串里面用了exec
      

  5.   

    to hery2002 arrow_gx 
      变量开头并不是必须用字母to perfectaction 
      我主要是要用最后一句,实际上用exec()是可以的,不过我不太明白格式如何弄正确罢了 给大家一个正确的例子 帮我看看
      --生成数据处理语句   
      SELECT     
      @sqlhead=N''''   
      +REPLACE(N'SELECT   [xtype]',N'''',N'''''')   
      +'''',   
      @sqlend=N''''   
      +REPLACE(N'   FROM   [syscolumns]   GROUP   BY   [xtype]',N'''',N'''''')   
      +N'''',   
      @sql1=N'',@sql2=N'',@sql3=N'',@sql4=N''   
      WHILE   @ic>=0   
      SELECT     
      @sql1=N',@'+@ic+N'   nvarchar(4000)'+@sql1,   
      @sql2=N',@'+@ic+N'=N'''''+@sql2,   
      @sql3=N',@'+@ic   
      +N'=CASE   g   WHEN   '+@ic   
      +N'   THEN   @'+@ic+N'+a   ELSE   @'+@ic   
      +N'   END'+@sql3,   
      @sql4=N'+@'+@ic+@sql4,   
      @ic=@ic-1   
      SELECT     
      @sql1=STUFF(@sql1,1,1,N''),   
      @sql2=STUFF(@sql2,1,1,N''),   
      @sql3=STUFF(@sql3,1,1,N''),   
      @sql4=STUFF(@sql4,1,1,N'')   
        
    print @sql1
    print @sql2
    print @sql3
    print @sql4
    print @sqlhead+N'+'+@sql4+N'+N'+@sqlend
      --执行   
      EXEC(N'DECLARE   '+@sql1+N'   
      SELECT   '+@sql2+N'   
      SELECT   '+@sql3+N'   FROM   #   
      EXEC(N'+@sqlhead+N'+'+@sql4+N'+N'+@sqlend+N')')   
      --删除临时表   
      DROP   TABLE   #   我看不懂  EXEC(N'DECLARE   '+@sql1+N'   
      SELECT   '+@sql2+N'   
      SELECT   '+@sql3+N'   FROM   #   
      EXEC(N'+@sqlhead+N'+'+@sql4+N'+N'+@sqlend+N')')   
    我写出来总是出错
      

  6.   


    干脆写你自己要写的sql吧
      

  7.   

    declare @sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000) 
    select @sql1=' declare @0 varchar(100)', 
    @sql2=' select @0=name from tea_base where id=50', 
    @sql3=' exec(''select * from tea_base where name=@0'')' 
    exec(@sql1+@sql2+@sql3) 
    -------------
    动态变量里面不是使用外部的定义的局部变量,
    变量的作用域问题.PS:
    测试了一下,变量可以使用@+数字.
    只是感觉怪怪的而已.
    收回2楼的话,declare @0 varchar(10)
    select @0 ='aaaa'
    select @0 as col
    /*
    col
    ----------
    aaaa
    (1 row(s) affected)*/
      

  8.   

    --try
    declare @sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000) 
    select @sql1=' declare @0 varchar(100)', 
    @sql2=' select @0=name from tea_base where id=50', 
    @sql3=' exec(''select * from tea_base where name=''+@0)' 
    exec(@sql1+@sql2+@sql3) 
      

  9.   

    declare @sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000) 
    select @sql1=' declare @0 varchar(100)', 
          @sql2=' select @0=name from tea_base where id=50', 
          @sql3=' select * from tea_base where name=@0' 
    exec(@sql1+@sql2+@sql3) 
    改成这样就成了吧?为什么要@sql3=' exec(''select * from tea_base where name=@A0'这样呢???
      

  10.   

    报错?什么错?
    自己print出来看看有什么问题.
    declare @sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000) 
    select @sql1=' declare @0 varchar(100)', 
    @sql2=' select @0=name from tea_base where id=50', 
    @sql3=' exec(''select * from tea_base where name=''+@0)' 
    --exec(@sql1+@sql2+@sql3) 
    print @sql1+@sql2+@sql3
      

  11.   

    declare @sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000) 
    select @sql1=' declare @0 varchar(100)', 
          @sql2=' select @0=name from tea_base where id=50', 
          @sql3=' exec(''select * from tea_base where name=''''''+@0+'''''''')' 
    select @sql1+@sql2+@sql3
      

  12.   


     --@sql3中为执行动态语句,不能直接引用外边的变量,必须将变量@0转为字段串
    declare @sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000) 
    select @sql1=' declare @0 varchar(100)', 
          @sql2=' select @0=name from tea_base where id=50', 
          @sql3=' exec(''select * from tea_base where name=''''''+@0+'''''''')' 
    exec(@sql1+@sql2+@sql3)
      

  13.   

    动态语句一次完全组合,各语句间用 ";" (分号)隔开,然后用 exec(sqlstr) 一次执行
      

  14.   

    declare @sqlstr varchar(8000)
    @sqlstr='declare @tmp_name varchar(100);'
    @sqlstr=@sqlstr+'select @tmp_name=name from tea_base where id=50;'
    @sqlstr=@sqlstr+'select * from tea_base where name=@0' 
    exec(@sqlstr)
      

  15.   

    错了一点点,改一下declare @sqlstr varchar(8000)
    @sqlstr='declare @tmp_name varchar(100);'
    @sqlstr=@sqlstr+'select @tmp_name=name from tea_base where id=50;'
    @sqlstr=@sqlstr+'select * from tea_base where name=@tmp_name'
    exec(@sqlstr)