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

nam*_*nam 6 sql-server coldfusion sql-server-profiler scope-identity sql-server-2008-r2

我正在使用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
Run Code Online (Sandbox Code Playgroud)

更新 虽然最初的应用程序是在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>
Run Code Online (Sandbox Code Playgroud)

Lei*_*igh 7

我的猜测是CF服务器自动添加它.我知道你说你正在使用MX7,但是......回到ColdFusion 8中,引入了一个新功能,它从简单的INSERT语句中检索生成的ID .在SQL Server中,它是通过附加SELECT SCOPE_IDENTITY()INSERT查询来完成的.这肯定在当时引起了一些问题.有关详细信息,请参阅:

注意:在以后的版本中,实现可能已更改.

正如评论中提到的beloitdavisja,查找cfquery具有该result属性的标签.Result是包含有关所执行查询的详细信息的结构.在CF8中,生成的记录ID在密钥下返回IDENTITYCOL.在以后的版本中,它还包含数据库不可知版本GENERATEDKEY.

  • 这也是我的猜测.@nam - 查找具有`result`属性的`cfquery`标签.这个结果有一个键'GENERATEDKEY`,CF存储插入的标识 (4认同)
  • @beloitdavisja - 是的.虽然,IIRC在CF8中不存在db-agnostic"GENERATEDKEY".它后来被添加.CF8,只支持MySQL db的`GENERATED_KEY`(@nam - 注意下划线). (2认同)
  • 不要忘记它还值得检查你没有在数据库中定义任何触发器,因为它们可以执行你在CF代码搜索中看不到的SQL.但是,如上所述,存储过程调用看起来非常类似于在使用cfqueryparam时您希望DB驱动程序为cfquery输出的预准备语句,并且当cfquery结果属性具有时,CF4中将期望SCOPE_IDENTITY()已被指定.很奇怪,如果你真的还在使用CF7. (2认同)
  • 在CF 9中添加了FWIW,`GENERATEDKEY`. (2认同)