求大神来帮忙看看我这个查询为什么会报错

liuziyi20070125 2018-09-10 05:17:34
菜鸟求问各位大神:
以下为一个function的一部分:

SELCET
(CASE WHEN A.SRC_DOCTYPE = 51 THEN D.FEENO WHEN A.SRC_DOCTYPE = 53 THEN E.NAME ELSE null END) as FEENAME
FROM A\B\C\D\E五个表

D.FEENO表里是varchar(60)格式,E.NAME表里是varchar(255)格式,都允许为空,但实际上没有空值。

现在报错 expecting:integer actual:string。
function删掉重建也还是报错,问题在哪?

谢谢啦!
...全文
192 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuziyi20070125 2018-09-10
  • 打赏
  • 举报
回复
发现FEENAME会返回一个以上的值,可能是这个原因

谢谢各位了!
liuziyi20070125 2018-09-10
  • 打赏
  • 举报
回复
引用 6 楼 sinat_28984567 的回复:
[quote=引用 5 楼 liuziyi20070125 的回复:]
[quote=引用 1 楼 yenange 的回复:]
SELCET
(
CASE
WHEN A.SRC_DOCTYPE = 51 THEN CAST(D.FEENO AS VARCHAR(255))
WHEN A.SRC_DOCTYPE = 53 THEN CAST(E.[NAME] AS VARCHAR(255))
ELSE NULL
END
) AS FEENAME
FROM A \ B \ C \ D \ E五个表


这样有没有问题?

另外, 你要的是表值函数还是标量函数?
返回的类型是否与最终要求的一致?



表值函数,这样改也不行,我试着在then后面加CONVERT也不行[/quote]
先确认一下问题在哪,改成这样看看还报错吗
'aaaa' AS FEENAME
[/quote]

先把这个值做成一个标量值函数?
liuziyi20070125 2018-09-10
  • 打赏
  • 举报
回复
贴个全码吧

ALTER FUNCTION [dbo].[funDZDDETAIL] (@BDAT datetime, @EDAT datetime, @NETID INT,@COMNO INT,@DPTNO INT)

RETURNS TABLE AS RETURN
(
SELECT A.*,
B.COMID,B.DAT,B.BDAT,B.EDAT,C.COMNO,C.NAME,LEFT(C.COMNO,1) AS DEPT,
(
CASE
WHEN A.SRC_DOCTYPE = 51 THEN CAST(D.FEENO AS VARCHAR(255))
WHEN A.SRC_DOCTYPE = 53 THEN CAST(E.[NAME] AS VARCHAR(255))
ELSE null END) as FEENAME

FROM DOC_DZD_DT A
left join DOC_DZD_BF B on A.DOCNO = B.DOCNO
LEFT JOIN BAS_COMPANY C on B.COMID = C.COMID
LEFT join DOC_HT_FYDT D on A.SRC_DOCNO = D.DOCNO
LEFT JOIN DOC_FY_DT E ON A.SRC_DOCNO = E.DOCNO

WHERE BLC_AMT < 0 AND SRC_DOCTYPE not in (10,14) AND A.IS_SELECT = 1 AND B.IS_VALID = 1
AND B.IS_BACK = 0 AND (@NETID = 0 or A.NETID = @NETID) and (B.DAT between @BDAT and @EDAT)
AND (@COMNO = 0 or C.COMNO = @COMNO) AND (@DPTNO = 0 or LEFT(C.COMNO,1) = @DPTNO) )
二月十六 版主 2018-09-10
  • 打赏
  • 举报
回复
引用 5 楼 liuziyi20070125 的回复:
[quote=引用 1 楼 yenange 的回复:]
SELCET
(
CASE
WHEN A.SRC_DOCTYPE = 51 THEN CAST(D.FEENO AS VARCHAR(255))
WHEN A.SRC_DOCTYPE = 53 THEN CAST(E.[NAME] AS VARCHAR(255))
ELSE NULL
END
) AS FEENAME
FROM A \ B \ C \ D \ E五个表


这样有没有问题?

另外, 你要的是表值函数还是标量函数?
返回的类型是否与最终要求的一致?



表值函数,这样改也不行,我试着在then后面加CONVERT也不行[/quote]
先确认一下问题在哪,改成这样看看还报错吗
'aaaa' AS FEENAME
liuziyi20070125 2018-09-10
  • 打赏
  • 举报
回复
引用 1 楼 yenange 的回复:
SELCET
(
CASE
WHEN A.SRC_DOCTYPE = 51 THEN CAST(D.FEENO AS VARCHAR(255))
WHEN A.SRC_DOCTYPE = 53 THEN CAST(E.[NAME] AS VARCHAR(255))
ELSE NULL
END
) AS FEENAME
FROM A \ B \ C \ D \ E五个表


这样有没有问题?

另外, 你要的是表值函数还是标量函数?
返回的类型是否与最终要求的一致?



表值函数,这样改也不行,我试着在then后面加CONVERT也不行
liuziyi20070125 2018-09-10
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
价格convert转换一下试试
CONVERT(VARCHAR(255),(CASE
WHEN a.SRC_DOCTYPE = 51
THEN D.FEENO
WHEN a.SRC_DOCTYPE = 53
THEN E.NAME
ELSE
NULL
END
)) AS FEENAME


不行哦,还是报错
RINK_1 2018-09-10
  • 打赏
  • 举报
回复
估计D.FEENO 这个字段里有数字,做隐式转换成int类型了,改成cast(D.FEENO as varchar(255))试试。
吉普赛的歌 版主 2018-09-10
  • 打赏
  • 举报
回复
SELCET
(
CASE
WHEN A.SRC_DOCTYPE = 51 THEN CAST(D.FEENO AS VARCHAR(255))
WHEN A.SRC_DOCTYPE = 53 THEN CAST(E.[NAME] AS VARCHAR(255))
ELSE NULL
END
) AS FEENAME
FROM A \ B \ C \ D \ E五个表


这样有没有问题?

另外, 你要的是表值函数还是标量函数?
返回的类型是否与最终要求的一致?

二月十六 版主 2018-09-10
  • 打赏
  • 举报
回复
价格convert转换一下试试
CONVERT(VARCHAR(255),(CASE
WHEN a.SRC_DOCTYPE = 51
THEN D.FEENO
WHEN a.SRC_DOCTYPE = 53
THEN E.NAME
ELSE
NULL
END
)) AS FEENAME

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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