如何在子查询中使用函数

时间:2013-06-08 14:15:57

标签: sql stored-procedures

我有一个名为MemberCheque的表,其中的字段是:

MemberName, Amount

我希望在将整数金额与小数分开后,以数字和单词显示名称和相应的金额。所以我的查询就像:

 SELECT MemName, Amount, (SELECT (Amount)%1*100 AS lefAmn, dbo.fnNumberToWords(lefAmn)+     

'Hundred ', (Amount) - (Amount)%1 AS righAmnt,  dbo.fnNumberToWords (righAmnt)+' Cents'     

from MemberCheque) AS AmountInWords FROM MemberCheque

但是我的商店程序只能将整数值改为单词。所以,我正在将Amount分成前后两部分,但是当我试图运行这个查询时,它给出了lefAmn和righAmnt无法识别的错误。因为我试图从同一个查询中发送参数。

2 个答案:

答案 0 :(得分:2)

第一个问题是你有一个子查询返回多个值,select子句中的子查询不允许这样做。

您对特定问题的回答是使用cast()(或convert())来使数字整数:

select leftAmt, rightAmt,
       (dbo.fnNumberToWords(cast(leftAmt as int))+'Hundred ' +
        dbo.fnNumberToWords(cast(rightAmt as int))+' Cents'
       ) as AmountInWords
from (SELECT (Amount%1)*100 AS leftAmt,
             (Amount) - (Amount)%1 AS rightAmt
      from MemberCheque
     ) mc

答案 1 :(得分:1)

如果无法改变功能,则将左/右值CAST为INT:

CAST((Amount)%1*100 AS INT) AS lefAmn
CAST((Amount) - (Amount)%1 AS INT) AS righAmnt

您无法传递在与函数参数相同的语句中创建的别名,您需要:

dbo.fnNumberToWords (CAST((Amount)%1*100 AS INT))
dbo.fnNumberToWords (CAST((Amount) - (Amount)%1 AS INT))