选择*不返回所有列 - Coldfusion / SQL Server 2008

时间:2011-06-15 15:52:28

标签: sql sql-server-2008 coldfusion

我得到了一些涉及数据库查询的奇怪行为,这是我以前从未见过的,我希望你可以阐明这个问题。

我有一个名为myTable的数据表,其中包含一些列;到目前为止,涉及它的一切都很好。现在,我刚刚添加了一个名为subTitle的列;和II注意到,为给定记录提取数据的SELECT *查询不知道该列(它表示返回的查询没有subTitle列),但是如果我明确命名该列(选择subTitle) ) 它是。我想也许Coldfusion服务器可能正在缓存查询,所以我尝试使用cachedwithin="#CreateTimeSpan(0, 0, 0, 0)#",但没有骰子。

考虑以下代码:


<cfquery name="getSub" datasource="#Application.datasourceName#">
     SELECT   subTitle 
     FROM     myTable
     WHERE    RecordID = '674'
 </cfquery> 

 <cfoutput>#getSub.subTitle#</cfoutput>

 <cfquery name="getInfo" datasource="#Application.datasourceName#">
     SELECT   * 
     FROM     myTable
     WHERE    RecordID = '674'
 </cfquery>  

 <cfoutput>#getInfo.subTitle#</cfoutput>

请记住,记录674在其子标题栏中有字符串“test”,上面的内容是

测试

[[崩溃错误]]

这对我没有意义,除非SQL Server 2008以某种方式缓存了SELECT *查询与表的前一个版本,但奇怪的是如果我在SQL Management Studio中运行查询没有问题它使用select *

显示所有列 坦率地说,这让我感到困惑;我知道我可以通过在select查询中明确命名所有所需的列而不是使用*来解决这个问题(这无论如何都是最佳实践),但我想了解为什么会发生这种情况。

我已经使用SQL Server 2005多年了,从来没有发生过这样的事情,这让我相信它可能涉及SQL Server 2008中的一些新东西;但是再一次,查询在管理工作室内工作正常的事实也没有与之相提并论。

=== UPDATE ===

清除CF管理员中的模板缓存将解决问题

2 个答案:

答案 0 :(得分:8)

是的,ColdFusion缓存<cfquery> SQL字符串。如果基础表结构发生更改,则结果可能是您看到的异常。

变通:

  • 推荐的解决方案:
    • 如果您有开发版或企业版,则可以在服务器监视器中查看查询缓存,并仅清除那里的查询。 (来自@Dpolehonski的评论,谢谢)
    • 否则,请单击ColdFusion管理员中的立即清除模板(在服务器设置/缓存下)。
      这将使服务器上的所有缓存CFML模板无效,CF将在必要时重新编译它们。
  • 又快又脏:
    巧妙地更改查询SQL,例如在某处添加空格。当您使用开发机器时,这是解决问题的最快方法 这将使此查询的编译版本无效并强制重新编译 (请注意,删除细微更改会再次触发错误,因为旧的查询文本将保持缓存状态。)
  • 蛮力:
    重新启动ColdFusion服务器。残忍,但有效。

答案 1 :(得分:2)

快速而超级的方法:

<cfquery name="getInfo" datasource="#Application.datasourceName#">
   SELECT 
     *, #createUUID()# as starQueryCacheFix
   FROM 
     myTable
   WHERE 
   RecordID = '674'
 </cfquery>

不要留在生产代码中......它将废弃ColdFusion的所有查询缓存。我确实说它太脏了;)