gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:53:19 25 4
gpt4 key购买 nike

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

我有一个名为 myTable 的数据表,其中包含一些列;到目前为止,涉及它的一切都很好。现在,我刚刚添加了一个名为 subTitle 的列;并且我注意到,为给定记录提取数据的 SELECT * 查询不知道该列(它说返回的查询没有 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 在其 subTitle 列中有字符串“test”,上面的关于是

测试

[[因错误而崩溃]]

这对我来说没有意义,除非 SQL Server 2008 以某种方式将 SELECT * 查询与表的前一个化身一起缓存,但奇怪的是,如果我直接从 SQL Management Studio 中运行查询,则没有问题它显示所有列与选择 *

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

我已经使用 SQL Server 2005 多年,从来没有发生过这样的事情,这让我相信它可能涉及 SQL Server 2008 中的一些新内容;但话说回来,查询在管理工作室内部运行良好这一事实也不符合这一点。

===更新===

在 CF admin 中清除模板缓存即可解决问题

最佳答案

是的,ColdFusion 缓存了 <cfquery> SQL 字符串。如果底层表结构发生变化,结果可能是你看到的异常。

解决方法:

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

关于sql - 选择 * 不返回所有列 - Coldfusion/SQL Server 2008,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6360603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com