declare @tablename nvarchar(10)
declare @sql nvarchar(200)
set @tablename='t1234'
set @sql= 'create table @tablename(id int identity(1,1),name nvarchar(5) default ''5'')'
set @sql='create table ' +@tablename+'(id int identity(1,1),name nvarchar(5) default ''5'')'
--print @sql
--exec @sql 这句可以建表
exec sp_executesql @sql,N'@tablename nvarchar(10)',@tablename --这句不行,为什么这样子?怎样才行?

解决方案 »

  1.   

    declare @tablename nvarchar(10) 
    declare @sql nvarchar(200) 
    set @tablename='t1234' 
    set @sql= 'create table @tablename(id int identity(1,1),name nvarchar(5) default ''5'')' 
    set @sql='create table ' +@tablename+'(id int identity(1,1),name nvarchar(5) default ''5'')' 
    --这样*************************************************
    exec sp_executesql @sql,N'@tablename nvarchar(10) output',@tablename  output
    select @tablename
    /*
    t1234
    */
      

  2.   

    declare @tablename nvarchar(10) 
    declare @sql nvarchar(200) 
    set @tablename='t1234' 
    set @sql= 'create table @tablename(id int identity(1,1),name nvarchar(5) default ''5'')' 
    set @sql='create table ' +@tablename+'(id int identity(1,1),name nvarchar(5) default ''5'')' 
    --这样*************************************************
    exec sp_executesql @sql,N'@tablename nvarchar(10) output',@tablename  output
    select @tablename
    /*
    t1234
    */
      

  3.   

    declare @tablename nvarchar(10) 
    declare @sql nvarchar(200) 
    set @tablename='t1234' 
    set @sql= 'create table @tablename(id int identity(1,1),name nvarchar(5) default ''5'')' 
    set @sql='create table ' +@tablename+'(id int identity(1,1),name nvarchar(5) default ''5'')' 
    --这样*************************************************
    exec sp_executesql @sql,N'@tablename nvarchar(10) output',@tablename  output
    select @tablename
    exec('select * from '+ @tablename)
    /*
    t1234
    */
    /*
    id          name  
    ----------- ----- 
    */
      

  4.   


    因为@tablename的作用域只在@sql变量内部
      

  5.   

    sp_executesql 批处理不能引用调用 sp_executesql 的批处理中声明的变量。
    sp_executesql 批处理中的本地游标或变量对调用 sp_executesql 的批处理是不可见的。
      

  6.   

    declare @tablename nvarchar(10) 
    declare @sql nvarchar(200) 
    set @tablename='t1234' 
    set @sql= 'create table @tablename(id int identity(1,1),name nvarchar(5) default ''5'')' 
    --set @sql='create table ' +@tablename+'(id int identity(1,1),name nvarchar(5) default ''5'')' 
    --这样*************************************************
    exec sp_executesql @sql,N'@tablename nvarchar(10) output',@tablename  output
    select @tablename
    exec('select * from '+ @tablename)
    这样子还是不行啊,如果用这句set @sql='create table ' +@tablename+'(id int identity(1,1),name nvarchar(5) default ''5'')'那么就跟我原来那个说可以执行的是一样的啦。如果我想用exec sp_executesql @sql,N'@tablename nvarchar(10) output',@tablename  output执行,而且@sql里的表面是@tablename而不是这个' +@tablename+'该怎样啊?sp_executesql 不是可以访问@sql里的变量的吗?
    还有就是有人说表名的作用域是@sql里,我不明白。但是问题应该就是这个啦。
    请再指教
      

  7.   

    表名不能作为参数传入sp_executesql
    所以还是用拼接@sql的方式,exec(@sql)吧