sql server 存储过程 表变量名无法用在查询字符串中

--定义表变量并插入数据declare@userdepttable(....)insert....--直接查询,此查询语句可以成功select*from@userDept... --定义表变量并插入数据

declare @userdept table(....)
insert ....

--直接查询,此查询语句可以成功
select * from @userDept

--定义一个字符串,存放查询语句,执行该查询语句失败:Must declare the scalar variable "@UserDept".
declare @sSql varchar(max0
set @sSql='select * from @userDept'
exec (sSql)

因为要使用动态Sql,所以必须要把@userDept 放在字符串里,请教各位大神,该如何在查询语句中引用表变量的名字?
展开
 我来答
Andy_Sun321
2015-03-09 · TA获得超过1376个赞
知道小有建树答主
回答量:811
采纳率:89%
帮助的人:730万
展开全部

要注意一点: 用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语句,直接使用临时表会比较方便些。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式