我有一个标量函数,它返回列名的VARCHAR
。
我想使用此结果作为select查询的基础,因此:
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
。它接收一个源列名,一个源列值,它在rules表中进行查找。如果规则发现该列与该值匹配,则选择并返回一个output column
,否则将使用默认的output column
。这是需要选择的列,因此可能与输入或输入值有很大不同。
如前所述,我很高兴听到任何其他的想法,当然,如果这是愚蠢的,应该选择另一条路线!
最后编辑我回家前一天,
我正在寻找一种方法,根据tbl_ThisTable
中的其他列值,从tbl_ThisTable
中选择要使用的列。
关于使用哪一列需要在表中易于更新的规则--主要限制是数据库的接口/前端--我们只能返回直数据集,因此不能使用前端来做出这个决定/连接多个数据集等等。
如果有一种很好的方法来部署这些规则,这些规则可以在数据库中更新而不需要重写代码,我很想听听它们。我现在只是在测试这个,所以设计是灵活的。
发布于 2013-04-16 08:04:48
倒带,
而不是
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
和读取索马斯科格
更广泛地说,我相信您的数据可以标准化,这样您就可以通过连接条件而不是动态列选择来实现您想要的结果。如果没有实际的模式和示例数据,我就无法很好地可视化答案。
发布于 2013-04-16 07:51:04
我唯一能想到的其他方法是使用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,返回值的类型取决于基础列的类型。
https://stackoverflow.com/questions/16041423
复制相似问题