需求:表名是动态的,必须用exec来执行,然后在exec里边还得给变量动态赋值 这时候exec 就搞不定了
exec(‘select @count=count(empid) from ‘+@tableName+‘ where proid=‘+@proid+‘ and id<‘+@id+‘ and state!=4‘)
下边这个代码如果去掉where后边的东东就是可以的
一:正确
set @sql=N‘select @count=count(empid) from ‘+@tableName
exec sp_executesql @sql,N‘@count int output ‘,@count output
select @count
二:错误
set @sql=N‘select @count=count(empid) from ‘+@tableName+‘ where proid=‘+@proid+‘ and id<‘+@id+‘ and state!=4‘
exec sp_executesql @sql,N‘@count int output ‘,@count output
select @count
三:正确(我的例子包含表名,表名不可以直接和proid1一样 表名必须要用 ‘+表名+’ ,不加的我试过了报错)
declare @count int,@tableName nvarchar(50),@SQLString nvarchar(max),@proid int,@id int,@ParmDefinition nvarchar(max);
set @tableName=‘table27‘;
set @proid=433;
set @id=159;
--set @sql=N‘select @count=count(empid) from table27‘
set @SQLString=N‘select @countOUT=count(empid) from ‘+@tableName+‘ where proid=@proid1 and id<@id1 and state!=4‘;
set @ParmDefinition=N‘@proid1 int,@id1 int,@countOUT int output‘;
exec sp_executesql @SQLString,@ParmDefinition,@proid1=@proid,@id1=@id,@countOUT=@count output;
select @count;
官方的例子:
原文:http://www.cnblogs.com/sensenwang/p/7738176.html