Je tente d'exécuter une requête sur une base de données MSSQL et de renvoyer l'ID d'insertion en utilisant PHP. Auparavant, j'avais été en utilisant le code suivant pour ce qui a bien fonctionné:Comment utiliser PHP pour renvoyer le dernier ID inséré sur une table MSSQL avec Triggers installés
$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);
Cependant, en raison des exigences d'intégration, nous avons ajouté un déclencheur à la table des prix qui copie les données à une table temporaire dans une autre base de données chaque fois une requête INSERT est exécutée. Ce genre de change l'ordre des opérations. D'après ce que je peux dire, ce qui suit se produit:
Web App -> INSERT into Pricing Table
Trigger -> INSERT into Temp Table
Web App -> Get ID
J'avais déjà été en utilisant SCOPE_IDENTITY, il était donc logique que le déclencheur a été le dernier ID écrasant d'insertion. Mais quand j'ai compris cela, je suis passé à IDENT_CURRENT ('Prix') pour être plus explicite dans ma demande. Cependant, il renvoie toujours une valeur nulle.
Je devrais ajouter que si nous désactivons le déclencheur, ce code fonctionne parfaitement.
Est-il possible de renvoyer le dernier ID inséré sur une table qui contient des déclencheurs?
Merci beaucoup pour vos conseils et vos idées.
EDIT: Voici le déclencheur:
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
EDIT: Résolu! Eh bien, je ne comprends toujours pas exactement pourquoi, mais le problème semble avoir été causé par une étrange combinaison des deux en utilisant un déclencheur, et en essayant de combiner les requêtes ensemble. Apparemment, si une table a un déclencheur, vous devez exécuter les requêtes séparément. Voici ce qui a finalement travaillé:
$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'];
Cr @ zy. Sachant que c'est la moitié de la bataille. – granadaCoder
Je pose la question ... parce que c'est une bonne idée pour les futurs lecteurs sur les lignes séparées. – granadaCoder