Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择*不返回所有列-Coldfusion/SQL Server 2008_Sql_Sql Server 2008_Coldfusion - Fatal编程技术网

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

选择*不返回所有列-Coldfusion/SQL Server 2008,sql,sql-server-2008,coldfusion,Sql,Sql Server 2008,Coldfusion,我得到一些奇怪的行为,涉及数据库查询,我从来没有见过,我希望你能说明这个问题 我有一个名为myTable的数据表,其中包含一些列;到目前为止,一切都很好。现在,我刚刚添加了一个名为subTitle的专栏;我注意到,为给定记录提取数据的SELECT*查询不知道该列,它说返回的查询没有SUBTITE列,但如果我显式地将该列命名为SELECT subTitle,它就是。我认为Coldfusion服务器可能正在缓存查询,所以我尝试使用cachedwithin=CreateTimeSpan0,0,0,0解

我得到一些奇怪的行为,涉及数据库查询,我从来没有见过,我希望你能说明这个问题

我有一个名为myTable的数据表,其中包含一些列;到目前为止,一切都很好。现在,我刚刚添加了一个名为subTitle的专栏;我注意到,为给定记录提取数据的SELECT*查询不知道该列,它说返回的查询没有SUBTITE列,但如果我显式地将该列命名为SELECT subTitle,它就是。我认为Coldfusion服务器可能正在缓存查询,所以我尝试使用cachedwithin=CreateTimeSpan0,0,0,0解决问题,但没有骰子

考虑以下代码:

请记住,记录674的副标题列中有字符串测试,上面的内容是

试验

[[CRASH WITH ERROR]]

除非SQL Server 2008以某种方式将SELECT*查询与表的前一个版本缓存在一起,否则这对我来说没有意义,但奇怪的是,如果我从SQL Management Studio中直接运行查询,则不会出现问题,并且它会显示带有SELECT的所有列*

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

我与SQLServer2005合作多年,从未发生过类似的事情,这让我相信它可能涉及SQLServer2008中的一些新内容;但是,查询在ManagementStudio内部运行良好这一事实也与此不符

==更新===


在CF admin中清除模板缓存将解决此问题

是的,ColdFusion将缓存SQL字符串。如果基础表结构发生更改,则结果可能会像您看到的那样出现异常

解决办法:

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

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

但不要将其留在生产代码中。。。它将淘汰ColdFusion所做的所有查询缓存。我确实说过它超级脏

自第一次执行SELECT*查询以来,您是否更改了基础表?如果是这样,可能有缓存的东西,CF或SQL Server。尝试重新启动每个服务,一次一个并进行测试,以查看它是否缓存在任何位置。注意,SELECT*可能会给您带来麻烦,通常指定列是一种更好的做法。使用on 2nd查询是否会有帮助?我本来就有,为了示例的目的,我只是将其简化为最简单的查询。不确定为什么,但清除模板缓存对我不起作用。最后我重新启动了服务器:是的,这是coldfusion缓存,我只是对添加Where 1=1的查询做了一点小小的更改,结果成功了。很好,至少我现在明白了;但是我认为cachedwithin=CreateTimeSpan0,0,0,0应该绕过这个问题?不,这只是为了查询结果缓存。查询本身绑定的列等被独立缓存。例如,如果查询是在循环中执行的,那么这种方式CF可以重复使用;有没有办法清除查询本身的缓存;实际上,您可以在CF Admin中清除模板缓存。如果您有开发版或企业版,您可以在服务器监视器中查看查询缓存,并仅清除那里的查询;那真是太脏了;
<cfquery name="getInfo" datasource="#Application.datasourceName#">
   SELECT 
     *, #createUUID()# as starQueryCacheFix
   FROM 
     myTable
   WHERE 
   RecordID = '674'
 </cfquery>