6

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

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 

UPDATE 虽然最初的应用是在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> 
+0

上面的INSERT的实际CF代码是什么? – Leigh

回答

7

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

注:实现可以在以后的版本已经改变。

作为beloitdavisja mentioned in the comments,请查找具有result属性的cfquery标签。 Result是一个包含有关执行的查询的详细信息的结构。在CF8中,生成的记录ID将在关键字IDENTITYCOL下返回。在更高版本中,它还包含数据库不可知的版本GENERATEDKEY

+4

这也是我的猜测。 @nam - 查找具有'result'属性的'cfquery'标签。这个结果有一个关键'GENERATEDKEY',CF存储插入的身份 – beloitdavisja

+2

@beloitdavisja - 是的。虽然,CFC中不存在IIRC,即不存在db的“GE​​NERATEDKEY”。它稍后添加。 CF8,只支持MySQL数据库的'GENERATED_KEY'(@nam - 注意下划线)。 – Leigh

+2

不要忘记,还有一点值得检查,因为它们可以执行SQL,而不会在CF代码搜索中看到,所以您没有在数据库中定义任何触发器。 但是,如上所述,存储过程调用与使用cfqueryparam时期望数据库驱动程序为cfquery输出的预准备语句非常相似,而当cfquery结果使用时,预期在CF8中会出现SCOPE_IDENTITY()属性已被指定。 奇怪的是,如果你真的仍然在CF7上。 –

相关问题