SQL Server Profiler显示SCOPE_IDENTITY(),而ColdFusion代码没有在任何查询中使



我正在使用SQL Server 2008 R2 Profiler来调试ColdFusion 7应用程序上的一个问题-这个应用程序是由其他人开发的-运行在Windows 7上,SQL Server 2008 R2作为后端。该应用程序最初使用MS Access 2003作为后端,后来转换为SQL Server 2008 R2。分析器显示了下面使用SCOPE_IDENTITY()的SQL,但是当我使用搜索实用程序搜索应用程序根目录时,没有文件在其SQL查询中使用SCOPE_IDENTITY()函数。应用程序的SQL Server数据库没有任何存储过程、视图、函数等。所有SQL查询都是ColdFusion文件中的嵌入式查询。然后Profiler得到SCOPE_IDENTITY()函数:

declare @p1 int
set @p1=11
exec sp_prepexec @p1 output,N'@P1 datetimeoffset,@P2 varchar(8000),@P3 int,@P4 varchar(8000)',N'insert into ProductItems (item_date , item_description, item_type)
values (
@P1 ,
@P2 ,
@P3 , 
) select SCOPE_IDENTITY()','2015-10-19 00:00:00 +00:00','Test description',1
select @p1

虽然最初的应用程序是在CF 7中开发的,CF 7后来升级到CF9,现在我在有CF 11的本地机器上调试它。我不知道当CF 7被CF 8取代,然后被CF 9取代时,代码是否也进行了升级。在分析器中生成上述SQL的CFquery看起来是这样的:此外,表ProductItems确实有一个标识列,数据库没有使用任何触发器,CFquery标记没有使用结果属性:

<cfquery name="addProductItems" datasource="#dtsource#">
  insert into Productitems (item_date,item_description,item_type)  
  values (
    <cfqueryPARAM value = "#item_dat#" CFSQLType = "CF_SQL_TIMESTAMP" null="#item_dat eq '-1'#">,
    <cfqueryPARAM value = "#item_description#" CFSQLType = "CF_SQL_VARCHAR">,
    <cfqueryPARAM value = "#item_type#" CFSQLType = "CF_SQL_INTEGER">
    )
</cfquery>

我猜是CF服务器自动添加的。我知道你说你用的是MX7,但是…在ColdFusion 8中,引入了一个新特性,可以从简单的INSERT语句中检索生成的ID。在SQL Server中,它是通过将SELECT SCOPE_IDENTITY()附加到INSERT查询来实现的。这在当时确实造成了一些问题。有关详细信息,请参见:

  • CF 8的生成密钥功能的问题
  • 昨天详细介绍了两个重要的CF8 bug/问题

注:实现可能在以后的版本中发生了变化。

正如下面的注释中提到的,寻找具有result属性的cfquery标记。Result是包含所执行查询的详细信息的结构。在CF8中,生成的记录ID在关键字IDENTITYCOL下返回。在以后的版本中,它还包含与数据库无关的版本GENERATEDKEY

相关内容

  • 没有找到相关文章

最新更新