在表值函数中于SELECT外部使用CASE语句报错的解决方案咨询
解决表值函数中根据参数选择不同表查询的报错问题
你遇到的报错原因很明确:CASE表达式在SELECT列表中只能返回单个标量值,但你每个CASE分支里的子查询都返回了3列数据(ProductId、DataRevision、ProductName),这就触发了SQL Server的语法检查错误。
要实现根据@ruleset参数从不同表/视图查询相同结构列的需求,你可以改用UNION ALL结合条件判断的方式来重构你的表值函数,这样既能保持逻辑清晰,又符合SQL的语法规则。下面是修改后的代码:
CREATE FUNCTION app.fgProduct ( @ruleset nvarchar(50), @matno nvarchar(50), @datarevision int ) RETURNS TABLE AS RETURN ( -- 对应G1规则集的查询 SELECT @matno AS ProductId, @datarevision AS DataRevision, [ProductName] FROM [ruleset].[g1gxProduct] WHERE ProductId = @matno AND @ruleset = 'G1' UNION ALL -- 对应G2规则集的查询 SELECT @matno AS ProductId, @datarevision AS DataRevision, [ProductName] FROM [ruleset].[g2gxProduct] WHERE ProductId = @matno AND @ruleset = 'G2' -- 后续可以继续添加更多规则集的UNION ALL分支 -- UNION ALL -- SELECT ... FROM [ruleset].[g3gxProduct] WHERE ... AND @ruleset = 'G3' )
逻辑说明:
- 每个
SELECT块对应一个规则集的表/视图查询,并且通过AND @ruleset = 'XXX'的条件确保只有当参数匹配时,该分支才会返回数据,不匹配的分支会返回空结果集。 UNION ALL会将所有符合条件的结果集拼接在一起,最终返回结构统一的表数据,完全满足你的需求。- 这种写法扩展性极强,后续新增规则集时,只需要添加新的
UNION ALL + SELECT分支即可,不需要改动原有逻辑。
内容的提问来源于stack exchange,提问作者Arto K.
相关产品推荐
相关产品推荐

