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上。 –

相關問題