2011-04-26 101 views
0

這變得有點棘手。我想輸出剛剛插入的記錄的主鍵。我做的多條記錄的插入:獲取我剛剛插入的記錄的主鍵

我的INSERT語句看起來是這樣的:

<cfquery name="imprtFiles" datasource="#mydsn#" result="#result#"> 
    <cfoutput query="myFileList"> 
     INSERT INTO myTablename (mycolumn) VALUES ('#valuegohere#'); 
    </cfoutput> 
</cfquery> 

<cfset newID = result.IdentityCol> 
<cfoutput>#newID#</cfoutput> 

而這將引發CF錯誤:

"Element IDENTITYCOL is undefined in RESULT."

所以我想有希望以另一種方式獲得我剛剛插入的記錄的PK。有什麼想法嗎?

下面是我根據這個例子中使用的代碼:

<cftransaction> 
    <cfquery name="importFiles" datasource="#dsn#" result="result"> 
     <cfoutput query="myFileList"> 
     INSERT INTO tbl_logfiles (originalFile, originalFileSize) VALUES ('#name#', '#length#'); 
     </cfoutput> 
    </cfquery> 

    <cfquery name="getID" datasource="#dsn#"> 
     select Max(fileID) as NewID from tbl_logfiles; 
    </cfquery> 
</cftransaction> 

<cfset newID = getID.NewID> 
<cfoutput> #newID# </cfoutput> 

我從#newID#得到的輸出是280,也就是在這個時候我的數據庫表中的最高的fileid。奇怪的。

我想要得到的是最後一個我輸入的N記錄。我希望有一種方法可以根據cfquery.resultcfoutput標籤以某種方式輸出。

回答

0

有各種不同的方式來做到這一點ColdFusion的 - 看看這裏:http://tutorial480.easycfm.com/

編輯:

試試這個方法,它將definitly工作:


<cftransaction> 
<cfquery name="imprtFiles" datasource="#mydsn#" result="#result#"> 
<cfoutput query="myFileList"> 
INSERT INTO myTablename (mycolumn) VALUES ('#valuegohere#'); 
</cfoutput> 
</cfquery> 
<cfquery name="getID" datasource="#mydsn#" result="#result#"> 
select Max(id) as NewID from myTablename; 
</cfquery> 
</cftransaction> 
<cfset newID = getID.NewID> 
<cfoutput> 
#newID# 
</cfoutput> 

編輯基於評論:

是的,當然。您在cfquery標記中有一個cfoutput查詢,因此您要逐行插入行,並且您每次都創建一個新ID。如果你需要的ID爲每一個,那麼你需要用你的CFOUTPUT整個事情:


<cftransaction> 
<cfoutput query="myFileList"> 
<cfquery name="imprtFiles" datasource="#mydsn#" result="#result#"> 
INSERT INTO myTablename (mycolumn) VALUES ('#valuegohere#'); 
</cfquery> 
<cfquery name="getID" datasource="#mydsn#" result="#result#"> 
select Max(id) as NewID from myTablename; 
</cfquery> 
<cfset newID = getID.NewID> 
#newID# 
</cfoutput> 
</cftransaction> 
+0

感謝MR的鏈接。我已經發現了這一點,並在我的劇本中嘗試過,但它一直在失敗。這些頁面上的解決方案適用於不同的數據庫類型。我嘗試了MSSQL解決方案,它不起作用,也許是因爲我的版本。 – Robbiegod 2011-04-27 19:53:25

+0

你試過了哪一個?我試過所有這些或其他,他們都工作(在SQL Server 2000中) – 2011-04-27 19:56:16

+0

讓我試試你的編輯,我絕對嘗試類似的東西... – Robbiegod 2011-04-27 21:17:40

1

它將是MSSQL 2000或2005.如果您使用的是2005,則可以在INSERT查詢中使用OUTPUT子句跟蹤插入創建的PK值。

關於OUTPUT的更多信息,請參閱此BOL文章。

要把這個放在你的解決方案中,你可能必須將它設置爲存儲過程並從CF中調用SP。

+0

'OUTPUT'只在2005年和2008年可用,而OP說他在2003年,這可能意味着他真的在2000年:) – 2011-04-27 16:16:18

+0

啊是的,我確定我正在使用MSSQL 2000(運行Windows Server 2003)。 – Robbiegod 2011-04-27 19:49:07

+0

對不起,我忘記提及有關它也需要2005年的部分。 – 2011-04-29 03:27:31

0

我認爲在這種情況下,你需要做的每一個刀片在自己的cfquery標籤。如果您一次只進行一次插入,這不會是一個問題,但是由於您正在執行多次插入(並且您使用的是舊版本的SQL Server),因此無法使用單個插入操作執行此操作。cfquery 。如果你在2005年或2008年,你可能會使用另一個回覆中提到的OUTPUT方法。

3

我知道這是一箇舊線程,但是......從未使用SELECT MAX(Column)來獲取插入的最後一個ID。 It is not thread safe,即使在一個事務中(設置爲默認級別)。

由於result屬性僅返回單個標識值,因此您必須改用單獨的查詢(對於SQL Server 2000,無論如何)。然後,您可以在每個insert之後抓取並存儲新ID。

此外,請務必在所有參數上使用cfqueryparam。除了防止sql注入,它還可以通過鼓勵數據庫reuse the same query plan來提高insert查詢的性能。

<cfset newIDArray = []> 
<cftransaction> 
    <cfloop query="myFileList"> 
     <cfquery result="result" ...> 
      INSERT INTO myTablename (...) VALUES (...); 
     </cfquery> 
     <!--- For CF9+ use generic result.generatedKey instead ---> 
     <cfset arrayAppend(newIDArray, result.identityCol)> 
    </cfloop> 
</cftransaction> 

注:由於尼古拉斯在評論中提到的,CF9 +引入了一個新數據庫無關的鍵名result.generatedKey。因此,如果您使用的是更高版本,那麼該密鑰名稱優於result.identityCol以獲得更大的靈活性。

顯然有better options like OUTPUT for SQL Server 2005

+1

優秀的答案,但爲了使它更新到最新版本的ColdFusion(我相信9+)支持數據庫不可知值:generatedKey。所以result.identityCol可以改爲result.generatedKey。 – Nicholas 2015-04-01 14:13:33

+0

好點。添加到主要答案,所以它更加明顯。 – Leigh 2015-04-02 14:01:07

相關問題