如何在循环查询结果时动态引用列名?

How can I dynamically reference column names while looping through a query's results?

我已经成功编写了一个使用动态变量的 SELECT 语句。它使用页面中的变量来了解从大而杂乱的 table 到 select 的列。它看起来像这样。

<cfquery name="getCapabilityAndDescription" datasource="Stuff">
SELECT [EntryID],
<cfloop list="#JobLevelList#" index="JobLevelIndex">
   [#getJobDesc.Type##JobLevelIndex#Capability],
   [#getJobDesc.Type##JobLevelIndex#Description],
</cfloop>
[JobID]
FROM [JobCapabilityMatrix]
WHERE JobID = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#URL.JobID#">
AND SkillID = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#URL.SkillID#">
</cfquery>

例如,它动态 select 一个名为 Baker3Description 的列。

但是...我怎样才能动态输出它?我想总结一下,我需要创建一个动态变量,然后将其放入查询的范围内。

到目前为止,我已经尝试过这样设置和调用它:

<cfset DescriptionVariable = #JobTitle# & #JobLevelIndex# & 'Description'>
<cfoutput>
#getCapabilityAndDescription.DescriptionVariable#
</cfoutput>

但它没有按照我想要的方式评估,只是告诉我

Element DESCRIPTIONVARIABLE is undefined in GETCAPABILITYANDDESCRIPTION.

我知道有一种方法可以从查询中实际 return Baker3Description 的内容,也许使用数组语法?但是我太乱了,需要一点帮助。请感谢。

可以使用结构符号,但还需要查询行号。一般语法是

#queryName[ "columnName" ][ rowNum ]# 
<!--- 
.. or specifically 
--->
#getCapabilityAndDescription[ DescriptionVariable ][ 1 ]#

动态输出所有查询列。使用 GetMetaData() 检索查询列属性数组(按 select 顺序)。然后用name属性输出每一列的值:

<!--- Demo query --->
<cfset yourQuery = queryNew("EntryID,Baker3Description"
        , "integer,varchar"
        , [[1,"Descrip A"],[2,"Descrip B"]]
    )>

<cfset meta = getMetaData(yourQuery)>
<cfoutput query="yourQuery">
    <cfloop array="#meta#" index="props">
        #yourQuery[props.name][currentRow]#
    </cfloop>
    <br>
</cfoutput>

尽管要小心构建那种动态 sql。如果用于构建列名的任何值是用户提供的(例如 getJobDesc.Type),则查询将容易受到 second order sql injection.

的攻击