如何在SQL视图中使用表值函数?多字段调用异常问题咨询
问题原因
你遇到的报错本质是SQL语法规则限制:SELECT列表中的每个表达式只能返回单个值(或单列),而你尝试用一个子查询返回多列(yyyy、mm、dd),数据库引擎无法将多列结果适配到单个SELECT字段位置,因此抛出异常。
最优解决方案:使用CROSS APPLY调用表值函数
这是效率最高的写法,只需要对每一行调用一次表值函数,就能同时获取三个字段,完美适配你的视图需求:
SELECT dbo.Health_Komak2.CDate AS HK2CreatedDateMiladi, -- 直接从表值函数的结果集中取三个字段 shamsi.yyyy AS HK2CreatedDateShamsiYear, shamsi.mm AS HK2CreatedDateShamsiMonth, shamsi.dd AS HK2CreatedDateShamsiDay, Ain74ID, dbo.Health_Komak2_Paymnets.Price AS HK2Pprice FROM dbo.Health_Komak2 -- 记得补充你的表连接条件,比如 Health_Komak2 和 Health_Komak2_Paymnets 的关联字段 JOIN dbo.Health_Komak2_Paymnets ON dbo.Health_Komak2.ID = dbo.Health_Komak2_Paymnets.HK2ID -- 用CROSS APPLY关联表值函数,将函数结果作为临时表使用 CROSS APPLY dbo.[DateToShamsiSepratePart](dbo.Health_Komak2.CDate) AS shamsi
备选方案:分别调用三次函数(不推荐)
如果你暂时不想调整查询结构,也可以对每个字段单独调用一次函数,但这种方法会对每一行执行三次函数调用,当数据量较大时性能会明显下降,仅作为临时应急方案:
SELECT dbo.Health_Komak2.CDate AS HK2CreatedDateMiladi, (SELECT yyyy FROM dbo.[DateToShamsiSepratePart](dbo.Health_Komak2.CDate)) AS HK2CreatedDateShamsiYear, (SELECT mm FROM dbo.[DateToShamsiSepratePart](dbo.Health_Komak2.CDate)) AS HK2CreatedDateShamsiMonth, (SELECT dd FROM dbo.[DateToShamsiSepratePart](dbo.Health_Komak2.CDate)) AS HK2CreatedDateShamsiDay, Ain74ID, dbo.Health_Komak2_Paymnets.Price AS HK2Pprice FROM dbo.Health_Komak2 JOIN dbo.Health_Komak2_Paymnets ON dbo.Health_Komak2.ID = dbo.Health_Komak2_Paymnets.HK2ID
关键提醒
优先选择CROSS APPLY的写法,不仅性能更优,代码可读性也更强,尤其适合在视图中复用表值函数的多列结果。
内容的提问来源于stack exchange,提问作者穆罕默德 - Moh
相关产品推荐
相关产品推荐

