要注意一点: 用execute执行的动态SQL中是无法直接使用外部所定义的变量的(就好像执行动态SQL内与外是两个不同的会话。用存储过程sp_executesql倒是可以传递其他标量类型的参数,但是也无法传递表变量)。而你要实现的功能是在执行动态SQL之前,已经把数据查询到一个表变量中了,然后要在动态SQL中再查询此表变量,目前来说是不能实现的。
可以使用临时表,或者游标,这两个可以在动态SQL中保持有效状态。
使用游标的示例如下:
declare @tb table (username nvarchar(20))
insert into @tb
select 'Andy'
union
select 'Jack'
declare cur cursor for
select top 10 username from @tb
declare @sql nvarchar(1000), @username nvarchar(20)
set @sql = 'open cur
fetch next from cur
into @v_user_name'
execute sp_executesql @sql, N'@v_user_name nvarchar(20) output', @username out
close cur
deallocate cur
select @username
而对于你的要在动态SQL中执行select语句,直接使用临时表会比较方便些。