我有一个标量函数,它返回列名VARCHAR
。
我想使用此结果基于选择查询,所以:
SELECT dbo.udf_GetColName('Val1', ColumnFromThisTable, etc) AS myCol
FROM tbl_ThisTable WHERE ...
目前,这正确列出了每个值的UDF的实际输出,即列名。
我想要的是select语句返回从函数返回的值值,所以:
SET @sql = 'SELECT ' + dbo.udf_GetColName('Val1', ColumnFromThisTable, etc) + ' AS myCol
FROM tbl_ThisTable WHERE ... '
并运行EXEC sp_executesql
有没有比动态SQL路由更好的方法? SQL可以通过某种方式查询该列作为UDF的输出吗?
编辑添加
这是业务需要管理选择输出的规则的地方,因此它们需要位于可更新的表中。如果它们被硬编码到表值函数的SELECT
中,那么它就不再是控制它们的业务。
所以是的,查询是非常可定制的,但在这种情况下“是一件好事”。
此外,udf_GetColName
中的参数数量有限。它接收源列名称,源列值,在规则表中进行查找。如果规则找到该列与该值的匹配项,则会选择output column
并返回,否则将使用默认output column
。这是需要选择的列,因此可能与输入或输入值完全不同。
如上所述,我很高兴听到任何其他想法,当然如果这是愚蠢的,应该选择另一条路线!
我回家前的最后一天编辑
我正在寻找一种方法,根据tbl_ThisTable
中的其他列值,从tbl_ThisTable
中选择要使用的列。
这些关于使用哪一列的规则需要在表中轻松更新 - 主要限制是数据库的接口/前端 - 我们只能返回直接数据集,所以不能使用前端来实现这一点决定/连接多个数据集等...
如果有一个很好的方法来部署这些规则,可以在数据库中更新而无需重写代码,我很乐意听到它们。我现在只是测试它,所以设计很灵活。
答案 0 :(得分:3)
我能想到的另一种方法是使用案例陈述:
select (case when udf_GetColName('Val1', . . .) = 'Col1' then Col1
when udf_GetColName('Val1', . . .) = 'Col2' then Col2
. . .
) as MyCol
from tbl_ThisTable . . .
动态SQL似乎更简单。但在这两种情况下,都要注意类型。使用case
,这将返回第一个then
的类型。使用动态SQL,返回值的类型取决于基础列的类型。
答案 1 :(得分:1)
倒带,
而不是
SET @sql =
'SELECT ' + dbo.udf_GetColName('Val1', ColumnFromThisTable, etc) +
' AS myCol FROM tbl_ThisTable WHERE ... '
为什么不做呢
SELECT Val1 [myCol] FROM tbl_ThisTable WHERE ...
首先?
让来电者进行分支。
我的意思是,使用您选择的ORM在客户端生成SQL。
修改强>
使用sp_executesql
并阅读Sommarskog
更一般地说,我相信您的数据可以通过以下方式进行规范化:您可以通过连接条件而不是动态列选择来实现您想要的效果。如果没有实际的架构和示例数据,我无法完全看清答案。