3

我有一个标量函数,它返回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

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

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

4

2 回答 2

3

我能想到的唯一其他方法是使用 case 语句:

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,返回值的类型取决于基础列的类型。

于 2013-04-16T15:51:04.523 回答
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

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

于 2013-04-16T16:04:48.390 回答