Hallo,
Ich versuche gerade die Anwendung bzw. die Datenbank zu MS SQL bzw. SQL Server 2008 Express zu portieren.
Jetzt stellt sich die Frage was tun bezüglich "LastInsertID()".
In einigen Stellen meiner Scripte habe ich z.b. folgenden Code:
$sql = "INSERT INTO groups (SystemsID,ElementsID,TabsID) VALUES ('{systems_id}','88','19')";
$DBO->exec($sql);
$lastid = $DBO->lastInsertId();
$sqlcat = "INSERT INTO values (GroupID,Value,TextID,SystemsID) VALUES ('$lastid','not','1079','$systems_id')";
$DBO->exec($sqlcat);
> Beim ersten Insert wird der Primary (auto\_increment) Key "GroupID" erzeugt und diese ID wird in der zweiten Tabelle gespeichert.
> Die Frage ist nun; was ist die beste Lösung für MSSQL? Hier gibt es ja keine LastInsertID() Funktion.
> Wäre ein Select nach dem Insert wie folgt eine Lösung?
> ~~~sql
SELECT id FROM tbl_newsletter ORDER BY id DESC LIMIT 1
>
Oder ein Select mit max() ?
SELECT max(id) FROM table;
Nein. Das ist *keine* Lösung.
In vielen Forenbeiträgen habe ich gelesen man soll "@@IDENTITY" verwenden oder besser noch SCOPE_IDENTITY()
select @@IDENTITY as NewID from tbl_newsletter
SELECT scope_identity()
Hier habe ich gelesen das die unter Umständen nicht zuverlässig ist.
https://connect.microsoft.com/SQL/feedback/ViewFeedback.aspx?FeedbackID=328811&wa=wsignin1.0
Du hast ein einzelnes INSERT. Ein Problem mit @@IDENTITY und SCOPE_IDENTITY() tritt laut verlinkter Ressource *nur* auf, wenn ein paralleler Ausführungsplan vorhanden ist, nicht bei einzelnen INSERTS, auch nicht, wenn in verschiedenen Sitzungen paralles einzelne INSERTS vorgenommen werden.
Du könntest IDENT_CURRENT('table_name') nutzen.
Du könntest die OUTPUT-Klausel des INSERT-INTO-Statement verwenden (falls PDO das kann). Du könntest einen der anderen Workarounds nutzen, die vorgeschlagen werden.
Freundliche Grüße
Vinzenz