一个函数老是出错。。。。

tulip_hui 2002-12-26 08:10:43
function dbo.fn_GetBZC_aa(@iYear smallint,@sSchool varchar(8000))
returns numeric(9,5)
as
begin
declare @nValue numeric(9,5)

if @sSchool='' or @sSchool is null
select @nValue=stdevp(tjxx.sg)
from jk_xstj_tjxx as tjxx inner join jk_xstj_xsjkk as xsjkk on tjxx.sfzh=xsjkk.sfzh
inner join jk_xstj_bjxx bjxx on tjxx.bjxx_id=bjxx.bjxx_id
where tjxx.tjnf=@iYear
else
select @nValue=stdevp(tjxx.sg)
from jk_xstj_tjxx as tjxx inner join jk_xstj_xsjkk as xsjkk on tjxx.sfzh=xsjkk.sfzh
inner join jk_xstj_bjxx bjxx on tjxx.bjxx_id=bjxx.bjxx_id
where tjxx.tjnf=@iYear and (bjxx.xxjbxx_id in (@sSchool))

return(@nValue)
END



在asp页面里调用,若@sSchool里有不只一个的学校就出错了。
传过来的学校用都号隔开:'222','3456','56777'
提示错误:函数参数不对
想用replace转换一下,去掉逗号,变成‘222’‘3456’‘56777’
然后在dbo.fn_GetBZC_aa函数里转换成:'222','3456','56777'
请问该如何实现???
期盼您!!!!!!
...全文
29 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluepower2008 2002-12-28
  • 打赏
  • 举报
回复
动态sql就是:
@str = 'select * from a where id in(' + @sInput + ')'
exec(@str)

不过这个问题使用动态sql可能也有问题,因为你不是返回结果集,而是要返回一个标量值。

所以,我能想到的办法是使用sqlserver的字符函数,将传入的参数拆分,插入一个临时表,然后再进行表连接,得到结果值。

如果其他人有关于动态sql取得返回值的办法,多多指教。

bluepower2008 2002-12-28
  • 打赏
  • 举报
回复
set @nValue=replace(@nValue,'+',',')
以上这句是做什么用的??

错误原因在于@sSchool是varchar型,不能只能使用in(@sSchool)的方式,sql编译器会把@sSchool强制转换成int型,当只有一个id时,是没有问题;如果出现123,456的形式就会出错。
必须通过动态sql语句来解决这个问题。
nityly 2002-12-28
  • 打赏
  • 举报
回复
'222','3456','56777'
变成
'222,3456,56777'
tulip_hui 2002-12-28
  • 打赏
  • 举报
回复
请问楼上的什么叫动态sql?????
能详细解说解说???
CoolAbu 2002-12-27
  • 打赏
  • 举报
回复
把单引号改成两个单引号试试

Nodding...


Studying...
CrazyFor 2002-12-27
  • 打赏
  • 举报
回复
赞同:tj_dns(愉快的登山者) 的方法
pengdali 2002-12-27
  • 打赏
  • 举报
回复
function dbo.fn_GetBZC_aa(@iYear smallint,@sSchool varchar(8000))
returns numeric(9,5)
as
begin
declare @nValue numeric(9,5)

if @sSchool='' or @sSchool is null
select @nValue=stdevp(tjxx.sg)
from jk_xstj_tjxx as tjxx inner join jk_xstj_xsjkk as xsjkk on tjxx.sfzh=xsjkk.sfzh
inner join jk_xstj_bjxx bjxx on tjxx.bjxx_id=bjxx.bjxx_id
where tjxx.tjnf=@iYear
else
set @nValue=replace(@nValue,'+',',')
select @nValue=stdevp(tjxx.sg)
from jk_xstj_tjxx as tjxx inner join jk_xstj_xsjkk as xsjkk on tjxx.sfzh=xsjkk.sfzh
inner join jk_xstj_bjxx bjxx on tjxx.bjxx_id=bjxx.bjxx_id
where tjxx.tjnf=@iYear and (bjxx.xxjbxx_id in (@sSchool))

return(@nValue)
END
tulip_hui 2002-12-27
  • 打赏
  • 举报
回复
很感谢各位的参与
也许是我讲的不够清楚!!!!
我的问题是在sql函数里将其转换成逗号‘,’
试了:@nValue=replace(@nValue,'+',',')
可在sql里编译不通过

function dbo.fn_GetBZC_aa(@iYear smallint,@sSchool varchar(8000))
returns numeric(9,5)
as
begin
declare @nValue numeric(9,5)

if @sSchool='' or @sSchool is null
select @nValue=stdevp(tjxx.sg)
from jk_xstj_tjxx as tjxx inner join jk_xstj_xsjkk as xsjkk on tjxx.sfzh=xsjkk.sfzh
inner join jk_xstj_bjxx bjxx on tjxx.bjxx_id=bjxx.bjxx_id
where tjxx.tjnf=@iYear
else
--@nValue=replace(@nValue,'+',',')
select @nValue=stdevp(tjxx.sg)
from jk_xstj_tjxx as tjxx inner join jk_xstj_xsjkk as xsjkk on tjxx.sfzh=xsjkk.sfzh
inner join jk_xstj_bjxx bjxx on tjxx.bjxx_id=bjxx.bjxx_id
where tjxx.tjnf=@iYear and (bjxx.xxjbxx_id in (@sSchool))

return(@nValue)
END
pengdali 2002-12-26
  • 打赏
  • 举报
回复
用"代替'试试!
tulip_hui 2002-12-26
  • 打赏
  • 举报
回复
问题是我不清楚怎么变回来,sql中的replace(),是否是用单引号???
愉快的登山者 2002-12-26
  • 打赏
  • 举报
回复
提供一个思路:
先将逗号变成一个用不到的字母,如:'a'.成为'222'a'3456'a'56777';出来后,再将'a'变成逗号.
hjhing 2002-12-26
  • 打赏
  • 举报
回复


ASP
yourstr = replace(yourstr,",","")

SQL:
set @str = replace(@str,'''''',''',''')

or:
set @str = replace(@str,char(39)+char(39),char(39)+','+char(39))

22,199

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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