2013-08-26 17 views
1

我的PHP類多行批處理命令創建以下命令:在PHP創建不承認我的聲明的變量

INSERT INTO contacts (firstName, lastName) VALUES ('jon', 'snow') 
DECLARE @IDcontacts VARCHAR(200) 
SET @IDcontacts = @@IDENTITY; 

INSERT INTO emailAddresses (ownerId, emailAddress) VALUES (@IDcontacts, '[email protected]') 
INSERT INTO emailAddresses (ownerId, emailAddress) VALUES (@IDcontacts, '[email protected]') 

INSERT INTO emailAddresses (ownerId, emailAddress) VALUES (@IDcontacts, '[email protected]') 

我創建連接,開始一個事務,並與sqlsrv_query()執行批處理。

執行批處理後,sqlsrv_errors()給了我四個錯誤:[Microsoft][SQL Native Client][SQL Server]Must declare the scalar variable "@IDcontacts".

但是,如果我在SQL Server Management Studio中使用完全相同的同一批次的字符串,它工作正常,所有四個記錄插入正確的標識值從第一次插入。

我正在使用SQL Server Express 2005,php版本5.4.3和最新的sqlsrv驅動程序。在technet或ms論壇上,我一直沒有找到任何有關這方面的信息,任何幫助將不勝感激。

+2

您應該使用SCOPE_IDENTITY()而不是@@ IDENTITY。 –

+0

謝謝,但SCOPE_IDENTITY()和刪除分號給出了相同的結果。仍然在管理服務器上工作,但在PHP中運行時返回相同的錯誤。 – Beartums

+0

@Beartums:我的評論只是一個評論,而不是一個答案。我將使用存儲過程來執行這些INSERT。 –

回答

0

本質上,正如在MSDN論壇上回答此問題所述,即使作爲單個字符串提交,SQL也不會作爲批處理執行。每個命令都由sp_executesql執行,這使得每個命令都在一個單獨的範圍內運行。

我想我可以使用全局臨時表來做同樣的事情,而是選擇重寫PHP來分別處理每個命令,在每個命令嘗試後處理事務,錯誤和反向引用。我希望那不是真的,但我被告知它是。