2016-08-04 17 views
2

我想获取名称中包含变量的查询的记录计数。ColdFusion:使用名称中的变量获取RecordCount

<cfloop query="Getteam"> 
    <cfquery name="GetJobs#teamstaffid#" datasource="#dataSource#" > 
     SELECT * 
     FROM Request, Hist_Req_Assign, Hist_Req_status 
     WHERE hist_req_assign.teamstaffid = '#teamstaffid#' AND 
       hist_req_assign.requestid = request.requestid AND 
       hist_req_status.requestid = request.requestid AND 
       hist_req_status.statusid = '3' 
    </cfquery> 
</cfloop> 

GetTeam吐出我团队中每个员工的ID。
GetJob#teamstaffid#获得他们的所有工作。

我的第一本能是要做到:<cfoutput>#GetJobs#teamstaffid#.RecordCount#</cfoutput>

这显然不会工作虽然。我如何获得每个团队成员的记录数?由于

+4

搜索coldfusion动态变量(或查询)。有一吨*的例子。话虽如此,这种类型的聚合更好用单个数据库查询完成。在循环内查询效率非常低。附注 - 总是在变量查询参数上使用cfqueryparam。它有助于提高查询性能并防止sql注入。 – Leigh

回答

-1

我可能会做一些沿着这些路线:

<cfscript> 
try { 
    sql = "select * from Request, Hist_Req_Assign, Hist_Req_status where hist_req_assign.requestid = request.requestid and hist_req_status.requestid = request.requestid and hist_req_status.statusid = '3'"; 
    principalQuery = new query(); 
    principalQuery.setDatasource(dataSource); 
    result = principalQuery.execute(sql=preserveSinglequotes(sql)); 
    getJobs = result.getResult(); 

    for(i=1;i<=listLen(teamstaffid);i++){ 
     sql = "select request, Hist_Req_Assign, Hist_Req_status from sourceQuery where hist_req_assign=#teamstaffid[i]#"; 
     local.queryService = new query(); 
     local.queryService.setName("employee"); 
     local.queryService.setDBType("query"); 
     local.queryService.setAttributes(sourceQuery=getJobs); 
     local.objQueryResult = local.queryService.execute(sql=sql); 
     local.queryResult = local.objQueryResult.getResult(); 
     writeOutput("Employee " & teamstaffid[i] & " has " & local.queryResult.recordcount & " records."); 
    } 
    } catch (any e){ 
     //whatever 
    } 
</cfscript> 
+2

对不起,但由于几个原因,这不是一个好方法。 A)在循环内查询效率非常低。通常可以通过构建适当的查询来避免。这意味着一个* single * db调用 - 而不是外部查询中的每个记录*(50,100,等等)。 B)不要使用'preserveSinglequotes()'。它反转了CF自动提供的最小保护,并将数据库暴露给SQL-I。相反,使用''或'addParam'。使用绑定变量不仅可以防止SQL-I,还可以提高执行多次查询的性能。 – Leigh

+0

这只是一个数据库调用。 第二个查询不是数据库调用。它是对第一个查询结果中创建的结构的查询。 我倾向于同意param的观点,但由于没有使用用户变量,在这种情况下会考虑风险相当小。用于指定结构部分的列表是代码的一部分,它不是输入。 –

+0

这并没有太大的区别。解析和构建查询结果仍然存在成本,[哪些企业数据库往往比QoQ优化得更好](http://stackoverflow.com/questions/13632246/cf-qoq-vs-query)。使用单个数据库查询时,成本只会发生一次*。循环播放时,这些成本会倍增:每条记录一次 - 每次请求。通常会导致比实际需要更多的时间和资源。因此,为什么循环往往是效率最低,速度最慢的方法,并且往往难以扩展。 – Leigh

4

name属性,为cfquery标签查询的输出变量。如果未指定,则变量的默认范围(如GetJobs#teamstaffid#)为VARIABLES。 ColdFusion中的变量作用域是结构体。

要访问动态变量,使用括号标记的结构:

<cfoutput>#VARIABLES["GetJobs#teamstaffid#"].RecordCount#</cfoutput>

注:如果你的代码是一个功能的一部分,而不是使用的VARIABLES范围LOCAL范围。

+1

这是为什么downvoted? –

-1

cfquery标记返回结构中的一些结果变量。所以,我们使用cfquery标签中的result属性来获得查询的一些细节。

例如: 1. resultname.sql 2. resultname.recordcount

<cfloop query="Getteam"> 
    <cfquery name="GetJobs#teamstaffid#" datasource="#dataSource#" result="resultname"> 
     SELECT * 
     FROM Request, Hist_Req_Assign, Hist_Req_status 
     WHERE hist_req_assign.teamstaffid = '#teamstaffid#' AND 
       hist_req_assign.requestid = request.requestid AND 
       hist_req_status.requestid = request.requestid AND 
       hist_req_status.statusid = '3' 
    </cfquery> 
</cfloop> 

<cfoutput>#resultname.recordcount#</cfoutput> 
-1

只需使用ColdFusion的功能评估

<cfoutput>#Evaluate("GetJobs#teamstaffid#").RecordCount#</cfoutput> 
<cfoutput>#Evaluate("GetJobs#teamstaffid#").column1#</cfoutput> 
<cfoutput>#Evaluate("GetJobs#teamstaffid#").column2#</cfoutput> 
..... 

虽然你可以访问来自任何列或字段使用Evaluate记录集合,最好将返回的查询对象首先存储在一个变量中(在循环中)作为短手访问,以便您可以轻松访问其他列/字段他查询记录集。

<cfloop query="Getteam"> 
    <cfquery name="GetJobs#Getteam.teamstaffid#" datasource="#dataSource#" > 
     SELECT * 
     FROM Request, Hist_Req_Assign, Hist_Req_status 
     WHERE hist_req_assign.teamstaffid = '#Getteam.teamstaffid#' AND 
      hist_req_assign.requestid = request.requestid AND 
      hist_req_status.requestid = request.requestid AND 
      hist_req_status.statusid = '3' 
    </cfquery> 

    <cfset QGetJob = #Evaluate("GetJobs#Getteam.teamstaffid#")# /> 

    <cfoutput>#QGetJob.RecordCount#</cfoutput> 
    <cfoutput>#QGetJob.column1#</cfoutput> 
    <cfoutput>#QGetJob.column2#</cfoutput> 
</cfloop> 
+0

为什么倒投了? – KAR

0

在直接回答这个问题;你可以在每个迭代中在上下文中提取数据名(GetJobs#teamstaffid#),并将其存储到全局列表/数组/结构中以供稍后使用,但是,如前所述,最好将查询结构化为一旦。

如果不知道模式,就很难提供特定的SQL。