2016-08-04 52 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。