[英]Getting the id of the last inserted record from an MSSQL table using PDO and PHP
[英]How to use PHP to return the last inserted ID on an MSSQL table with Triggers installed
我試圖在MSSQL數據庫上運行查詢,並使用PHP返回插入ID。 以前,我一直在使用以下代碼來正常工作:
$q = "INSERT INTO Pricing (Products_idProducts,FromQty,ToQty,Price) VALUES((?),(?),(?),(?)); SELECT IDENT_CURRENT('Pricing') AS 'id';";
$params = array( $_POST['idProduct'], $_POST['Pricing-FromQty'], $_POST['Pricing-ToQty'], $_POST['Pricing-Price'] );
$r = sqlsrv_query( $db, $q, $params );
sqlsrv_next_result( $r );
sqlsrv_fetch( $r );
$LastID = sqlsrv_get_field( $r, 0 );
但是,由於集成要求,我們在定價表中添加了一個觸發器,該觸發器在每次運行INSERT查詢時將數據復制到另一個數據庫中的臨時表中。 這種改變操作的順序。 據我所知,正在發生以下情況:
Web App -> INSERT into Pricing Table
Trigger -> INSERT into Temp Table
Web App -> Get ID
我以前一直在使用SCOPE_IDENTITY,因此觸發器覆蓋了最后一個插入ID是有意義的。 但是,當我弄清楚這一點時,我切換到IDENT_CURRENT('Pricing')以便在請求中更加明確。 但是,它仍返回空值。
我應該補充一點,如果我們禁用觸發器,則此代碼將完美運行。
有什么方法可以返回具有觸發器的表上最后插入的ID?
非常感謝您的任何建議或想法。
編輯:這是觸發器:
IF EXISTS (SELECT 1 FROM inserted cp)
BEGIN
INSERT INTO [ProductManager].._PRICESTAGING ([ITEMNUM],[QFR],[QTO],[PRICE])
SELECT PartNumber,[FromQty],[ToQty],Price
FROM inserted cp
END
編輯:解決了!
好吧,我仍然不清楚為什么,但是問題似乎是由使用觸發器和嘗試將查詢組合在一起的奇怪組合造成的。 顯然,如果表上有觸發器,則需要單獨運行查詢。 這是最終有效的方法:
$q = "INSERT INTO Pricing (Products_idProducts,FromQty,ToQty,Price) VALUES((?),(?),(?),(?));";
$params = array( $_POST['idProduct'], $_POST['Pricing-FromQty'], $_POST['Pricing-ToQty'], $_POST['Pricing-Price'] );
$r = sqlsrv_query( $db, $q, $params );
// bypass trigger nonsense
$q = "SELECT IDENT_CURRENT('Pricing') AS 'id';";
$r = sqlsrv_query( $db, $q );
$LastID = sqlsrv_fetch_array( $r );
$LastID = $LastID['id'];
嘗試
http://msdn.microsoft.com/en-us/library/ms175098.aspx
IDENT_CURRENT
這是另一種“味道” ...
IDENT_CURRENT('MyTableName')
編輯 - - - - -
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Vegetable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
DROP TABLE [dbo].[Vegetable]
END
GO
CREATE TABLE [dbo].[Vegetable] (
VegetableKey int IDENTITY (1001 , 1 ) not null
, VegetableName varchar(64) not null
)
GO
ALTER TABLE dbo.Vegetable ADD CONSTRAINT PK_Vegetable_VegetableKey
PRIMARY KEY CLUSTERED (VegetableKey)
GO
ALTER TABLE dbo.Vegetable ADD CONSTRAINT CK_Vegetable_VegetableName_UNIQUE
UNIQUE (VegetableName)
GO
GRANT SELECT , INSERT, UPDATE, DELETE ON [dbo].[Vegetable] TO public
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FoodItem]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
DROP TABLE [dbo].[FoodItem]
END
GO
CREATE TABLE [dbo].[FoodItem] (
FoodItemKey int IDENTITY (2001 , 1 ) not null
, FoodItemName varchar(64) not null
)
GO
ALTER TABLE dbo.FoodItem ADD CONSTRAINT PK_FoodItem_FoodItemKey
PRIMARY KEY CLUSTERED (FoodItemKey)
GO
ALTER TABLE dbo.FoodItem ADD CONSTRAINT CK_FoodItem_FoodItemName_UNIQUE
UNIQUE (FoodItemName)
GO
GRANT SELECT , INSERT, UPDATE, DELETE ON [dbo].[FoodItem] TO public
GO
CREATE TRIGGER CopyVegetableToFoodItemTrigger on dbo.Vegetable
FOR INSERT , UPDATE AS
INSERT into dbo.FoodItem (FoodItemName)
Select i.VegetableName from
inserted i
where not exists ( select null from dbo.FoodItem innerRealTable where innerRealTable.FoodItemName = i.VegetableName )
GO
declare @MyIdentity int
INSERT INTO dbo.Vegetable ( VegetableName ) select 'Pumpkin'
select @MyIdentity = IDENT_CURRENT( '[dbo].[Vegetable]' )
print @MyIdentity
INSERT INTO dbo.Vegetable ( VegetableName ) select 'Tomato'
select @MyIdentity = IDENT_CURRENT( N'[dbo].[Vegetable]' )
print @MyIdentity
select * from dbo.Vegetable
select * from dbo.FoodItem
自從我不得不使用MSSQL以來已經很長時間了,但是我以前經常使用它。
SELECT LAST_INSERT_ID=@@IDENTITY
那還行嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.