2015-11-03 93 views
2

我想创建一个函数,它将遍历任意查询并根据任意列名执行插入另一个表的操作。在Coldfusion中使用来自动态命名变量的列名

例如,这里的想法是将输出

(data, data, data...) 
(data, data, data...) 

最终,我会做一个插入查询。现在,我只想输出行。

编辑:我不能只是做一个INSERT/SELECT,因为prod数据和dev数据在不同的服务器上。因此,我必须首先将prod服务器上的表中的数据收集到CF查询对象中,然后遍历它并插入到dev服务器上的表中。

代码:

<cffunction name="copyProdToDev"> 

    <cfargument name="devDatasource" > 
    <cfargument name="prodDataSource" type="string"> 
    <cfargument name="devTableName" type="string"> 
    <cfargument name="prodTableName" type="string"> 
    <cfargument name="dateColumnName" default="none"> 

    <cfquery name="ProdData" datasource="#prodDatasource#" timeout="60"> 
     SELECT * 
     FROM #prodTableName# 
    </cfquery> 

    <cfset columnNames = ProdData.getColumnNames()> 
    <cfset numColumns = ArrayLen(columnNames)> 

    <cfloop query="#ProdData#"> 
     (
     <cfloop index="colNumber" from="1" to="#ArrayLen(columnNames)-1#"> 
      <cfoutput><dynamic column name for colNumber>,</cfoutput> 
     </cfloop> 
     <cfoutput><dynamic column name for numColumns></cfoutput> 
     )<br /> 
    </cfloop> 

</cffunction> 
+0

虽然这是可能的,你能不能直接用INSERT/SELECT插入数据...?目标表结构是否相同?有 – Leigh

+0

有。这是因为生产数据和开发数据位于不同的服务器上。所以,我不能只从'b'插入select *。我会更新我的问题以反映这一点。 – abalter

+0

您使用的是什么RDBMS? SQL Server将允许你链接服务器,所以你可以在一个将检索另一个数据的查询上运行查询。 –

回答

3

数组符号是你的朋友。

<cfoutput> 
<cfloop query = "ProdData"> 
<cfloop array = "#ProdData.getColumnList()#" index = columnName> 
#prodData[columnName][currentrow]# 
closing tags and formatting stuff 
+0

宾果!不知道'cfloop'有'currentrow'。 – abalter

+0

从技术上讲,它是'cfquery'具有currentrow。 –

+0

这就是我的想法。但是,我能够在' abalter

0

你可以从这个变量

ProdData.columnList 

获取列表但要注意的是,列的顺序并不完全尊重, 这篇文章可能会有所帮助: http://www.bennadel.com/blog/644-query-columnlist-does-not-return-true-column-ordering.htm

+0

你可以像我在我的代码中那样使用'getColumnNames'来按正确的顺序获取它们。我相信那是因为CF 8左右。 HTTP:// WWW。richarddavies.us/archives/2009/07/cf_columnlist.php – abalter

+0

好吧,我很抱歉。所以你的难处在于获得专栏的价值,是吗?如果是这样,您可以使用评估函数:http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f4e.html并执行诸如Evaluate(“ProdData。#columnNames [colNumber]#”)之类的操作 –

+0

评估确实有效,但是ID广泛警告。 – abalter