1

我正在使用以下代码检查列是否存在,如果不存在则创建它。

<cfquery name="qSelect" datasource="#dbname#">
    select Top 0 * from Elements
</cfquery>

<cfif not ListFindNoCase(qSelect.columnlist,"idLang")>
   <cfquery name="qAlterTable" datasource="#dbname#" dbtype="ODBC">
      ALTER TABLE Elements ADD idLang varchar(200) NULL
   </cfquery>
</cfif>

有人可以建议是否有更好的方法来做到这一点?

4

5 回答 5

3

我会information_schema直接查询。

SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName' 
AND COLUMN_NAME = 'idLang'

如果您正在检查多个列名,您可以将 更改=为 anIN然后执行您现在正在执行的相同检查 ( listFindNoCASE)。我不知道任何一种方式都更快/更好,但这就是我的做法。

您没有指定 DBMS,但这适用于 SQL Server 和 MySQL

于 2013-05-13T13:16:13.030 回答
3

如果您有 ColdFusion 8+,最好的方法是使用 <cfdbinfo>。然后您可以将它与任何数据库一起使用。

<cfdbinfo datasource="votethisway.com" name="myColumns" type="columns" table="tblPoll" pattern="idLang">
<cfdump var="#myColumns#" label="myColumns">

<cfdbinfo> 返回一个查询对象,其中包含有关表中每一列的所有信息。模式属性可用作过滤器,以将结果减少到您正在测试的列。

这是一个 <cffunction> 将其包装在一个不错的包中:

<cffunction access="public" name="tableColumnExists" output="no" returntype="boolean" description="returns true if a table column exists" verifyclient="no" securejson="false">
    <cfargument name="datasource" type="string" required="yes" hint="name of the datasource">
    <cfargument name="table" type="string" required="yes" hint="name of the table">
    <cfargument name="column" type="string" required="yes" hint="name of the column">

    <!---initialize private variables--->
    <cfset var local = StructNew()>

    <cftry>
        <cfdbinfo datasource="#arguments.datasource#" name="local.qryColumns" type="columns" table="#arguments.table#" pattern="#arguments.column#">
        <cfcatch type="Database">
            <cfreturn false>
        </cfcatch>
    </cftry>

    <cfif local.qryColumns.RecordCount>
        <cfreturn true>
    </cfif>
    <cfreturn false>
</cffunction>
于 2013-05-13T18:38:09.013 回答
1

马特的回答是最好的。

如果您不想先进行测试,或者您正在使用像 JET 这样很棒的数据库,您也可以将查询包装在<cftry>标签中

<cftry>
    <cfquery name="qAlterTable" datasource="#dbname#" dbtype="ODBC">
        ALTER TABLE 
            Elements 
        ADD idLang varchar(200) NULL
    </cfquery>
    <cfcatch type = "database">
        <cfoutput>#cfcatch.message# - #cfcatch.details#</cfoutput>
    </cfcatch>
</try>
于 2013-05-13T13:37:05.390 回答
0

所以,我遵循了这个对话中的每一个建议,每个建议都是另一个需要解决的问题。然后我在互联网上又花了 3 个小时,仍然没有想出一个简单的解决方案来解决这个问题。

知道coldfusion是一种简单的服务器端语言,我知道某处有一些答案,所以我尝试了“columnList”功能。令人惊讶的是,这奏效了:


<cfquery name="my_Recordset" datasource="my_Datasource">
   SELECT * FROM my_Table
</cfquery>

<CFIF NOT ISDEFINED('my_Recordset.my_Column')>
   <!--- create column because it doesnt exist --->
<cfelse>
   <!--- drop or update column because it exist --->
</cfif>

此外,您可能希望将表中的所有列放在可以使用列表函数 ListContains 搜索的列表中,如下所示:


<cfquery name="my_Recordset" datasource="my_Datasource">
   SELECT * FROM my_Table
</cfquery>

<cfset myList = #my_Recordset.columnList#>

<cfset mySearchResult = #ListContains(myList, "my_Column")#>

<CFIF mySearchResult is 0>
   <!--- create column because it doesnt exist --->
<cfelse>
   <!--- drop or update column because it exist --->
</cfif>

于 2016-04-08T17:07:52.317 回答
0

我知道帖子很旧,但以防有人会寻找它。

这将返回一个布尔值

QueryKeyExists(qSelect, "idLang")
于 2020-11-10T22:14:19.800 回答