我使用以下代码检查列是否存在,何时不存在,然后创建它。
<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>
有人可以建议是否有更好的方法吗?
答案 0 :(得分:3)
我会直接查询information_schema
。
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTableName'
AND COLUMN_NAME = 'idLang'
如果您要检查多个列名称,可以将=
更改为IN
,然后执行您现在正在执行的相同检查(listFindNoCASE
)。我不知道这两种方式都更快/更好,但我就是这样做的。
您没有指定DBMS,但这适用于SQL Server和MySQL
答案 1 :(得分:3)
如果你有ColdFusion 8+,最好的方法是使用&lt; cfdbinfo&gt;。然后,您可以将它与任何数据库一起使用。
<cfdbinfo datasource="votethisway.com" name="myColumns" type="columns" table="tblPoll" pattern="idLang">
<cfdump var="#myColumns#" label="myColumns">
&LT; cfdbinfo&GT;返回一个查询对象,其中包含有关表中每列的所有信息。 pattern属性可用作过滤器,以将结果简化为您正在测试的列。
这是&lt; cffunction&gt;将它包装在一个漂亮的包装中:
<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>
答案 2 :(得分: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>
答案 3 :(得分: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>
此外,您可能希望将表中的所有列放在List中,您可以使用List Function,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>
答案 4 :(得分:0)
我知道帖子很旧,但是万一有人找它。
这将返回一个布尔值
QueryKeyExists(qSelect, "idLang")