基于变量/查询结果选择列的优雅方法?

时间:2013-04-16 15:46:40

标签: sql sql-server sql-server-2008

我有一个标量函数,它返回列名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中选择要使用的列。

这些关于使用哪一列的规则需要在表中轻松更新 - 主要限制是数据库的接口/前端 - 我们只能返回直接数据集,所以不能使用前端来实现这一点决定/连接多个数据集等...

如果有一个很好的方法来部署这些规则,可以在数据库中更新而无需重写代码,我很乐意听到它们。我现在只是测试它,所以设计很灵活。

2 个答案:

答案 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

更一般地说,我相信您的数据可以通过以下方式进行规范化:您可以通过连接条件而不是动态列选择来实现您想要的效果。如果没有实际的架构和示例数据,我无法完全看清答案。