关于select的问题

xiaojshjari 2004-10-30 09:15:47
查询一个字段用select @a= 姓名 from Table where 学号 = 1
但我要将表名设为可变的,故我写成下面
set @SqlStr = 'select @a= 姓名 from ''' + @Class+''' where 学号 = '+convert(varchar,@StudentNo)
但没成功,我想可能是@a错了,请问应如何写
...全文
124 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaojshjari 2004-10-31
  • 打赏
  • 举报
回复
funsuzhou(羡米奇)(努力ing,成为专家中
我按你的写了函数,
CREATE function dbo.fun1(@tbname varchar(30),@studentNo int)
returns varchar(100)
as
begin
declare @re varchar(100)
declare @sql varchar(500)
set @sql='select @re=姓名 from '+@tbname+' where 学号='+convert(varchar,@StudentNo)
exec(@sql)
return (@re)
end
可进行语法检测出现了'错误443:在函数内不正确的使用了'EXECUTE'请问为什么?
funsuzhou 2004-10-31
  • 打赏
  • 举报
回复
--编一个自定义函数:
CREATE function dbo.fun1(@tbname varchar(30))
returns varchar(100)
as
begin
declare @re varchar(100)
declare @sql varchar(8000)
set @sql='select @re=姓名 from '+@tbname+' where 学号=convert(varchar,@StudentNo)'
exec(@sql)
return @re
end

--调用 dbo.fun1(表名)就可以了
nmgtaozi 2004-10-31
  • 打赏
  • 举报
回复
--hdhai9451(※★開拓者...准備去長安☆※):
declare @a varchar(10)
declare @sqlstr nvarchar(1000),@class varchar(50),@StudentNo varchar(20)
set @class='AAA'
set @StudentNo='20036'
set @a='字段名'
set @sqlstr = 'select '+ @a+'= 姓名 from ' + @Class+' where 学号 ='+ convert(varchar,+@StudentNo)
exec(@sqlstr)
ttuuhhuuii 2004-10-31
  • 打赏
  • 举报
回复
declare @a varchar(10)
declare @sqlstr nvarchar(1000),@class varchar(50),@StudentNo varchar(20)
set @class='表名'
set @StudentNo='1'
set @a='字段名'
set @sqlstr = 'select '+ @a+'= 姓名 from ' + @Class+' where 学号 ='+ convert(varchar,@StudentNo)
exec(@sqlstr)

结果:
字段名
姓名
如果没有 set @a='字段名' 这句,则没有结果显示
hyhongyong 2004-10-31
  • 打赏
  • 举报
回复
找到一个直接的办法
declare @aaa varchar(10)
set @SqlStr = 'select @a= 姓名 from ' + @Class+' where 学号 = '+convert(varchar,@StudentNo)
exec sp_executesql @sqlstr,N'@a varchar(10) output',@a=@@aaa output

就可以了
hyhongyong 2004-10-31
  • 打赏
  • 举报
回复
原因很简单,就是Exec()函数执行的Sql命令字符串中不能含有本串外部定义的变量.
所以应该这样写
set @SqlStr = 'declare @a nvarchar(10)
select @a= 姓名 from ' + @Class+' where 学号 = '+convert(varchar,@StudentNo)

但是这样你会发现没有什么实际用途,因为sql命令字符串中的变量也没有办法传给外部。函数或存储过程还是不能获得@a的值。

目前我认为没有有效的直接方法。不过间接的方法倒是有两个:
1、定义一个永久表的永久对象(如一列的值,直接在sql命令字符串中将@a的值写给这个永久对象.

2、定义一个存储过程,执行 set @sqlstr='select 姓名 from ' + @Class+' where 学号 = '+convert(varchar,@StudentNo)'
Exec(@sqlstr)
这样存储过程的返回值(单个记录集)就是你需要的值.

xiaojshjari 2004-10-31
  • 打赏
  • 举报
回复
楼上superdinosaur520(恐龙):
你这样也不行,语法检测通过,但执行时出现必须声明变量 '@a'的错误,但前面我declare @a nvarchar(10)了呀,请问为什么?要实现这个功能还有其它方法吗?没法,急呀.望大家讨论讨论
superdinosaur520 2004-10-31
  • 打赏
  • 举报
回复
set @SqlStr = 'select @a= 姓名 from ' + @Class+' where 学号 = '+convert(varchar,@StudentNo)
应该是这样的把:set @SqlStr = 'select @a= 姓名 from ' + @Class+' where 学号 = '+convert(varchar(n),@StudentNo)
xiaojshjari 2004-10-30
  • 打赏
  • 举报
回复
楼上老兄,不行呀,你能不能自己试一下.我试了,什么也没显示
xiaojshjari 2004-10-30
  • 打赏
  • 举报
回复
楼上老兄,我将你的代码拷到SQL查询分析器中,并在exec(@sqlstr)下一行加了print '查询结果:'+@a
请问执行时在哪里可看到显示结果
Andy__Huang 2004-10-30
  • 打赏
  • 举报
回复
上面我錯了﹐你那樣寫也不對

declare @a varchar(10)
declare @sqlstr nvarchar(1000),@class varchar(50),@StudentNo varchar(20)
set @class='AAA'
set @StudentNo='20036'
set @sqlstr = 'select '+ @a+'= 姓名 from ' + @Class+' where 学号 = convert(varchar,'+@StudentNo+')'

exec(@sqlstr)
xiaojshjari 2004-10-30
  • 打赏
  • 举报
回复
楼上老兄,你的最后多一个'号,且用你的,我调试看到@SqlStr 是空.
我修改了自己的语句
declare @a nvarchar(10)
set @SqlStr = 'select @a= 姓名 from ' + @Class+' where 学号 = '+convert(varchar,@StudentNo)
但当执行完exec(@SqlStr)时出现了必须声明变量 '@a'的错误.请问为什么
Andy__Huang 2004-10-30
  • 打赏
  • 举报
回复
那樣寫肯定不行的

declare @sqlstr varchar(100),@a...

set @SqlStr='select '+@a+'= 姓名 from ' + @Class+' where 学号 = '+convert(varchar,'+@StudentNo+')'

exec(@sqlstr)

select @a

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧