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 --这句不行,为什么这样子?怎样才行?
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 --这句不行,为什么这样子?怎样才行?
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
*/
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
*/
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
----------- -----
*/
因为@tablename的作用域只在@sql变量内部
sp_executesql 批处理中的本地游标或变量对调用 sp_executesql 的批处理是不可见的。
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里,我不明白。但是问题应该就是这个啦。
请再指教
所以还是用拼接@sql的方式,exec(@sql)吧