Wie bekomme ich ID in MSSQL in PHP einfügen?


7

Was der Titel der Frage sagt. Muss ich bei einer Abfrage wie SELECT @@IDENTITY AS ins_id den Tabellennamen oder andere Informationen angeben, um anzugeben, über welche Tabelle/Datenbank ich spreche?

14

@@IDENTITY gibt die neueste Identität zurück, die in der aktuellen Sitzung generiert wurde. In den meisten Fällen möchten Sie wahrscheinlich stattdessen SCOPE_IDENTITY verwenden, wodurch die neueste Identität zurückgegeben wird, die im aktuellen Bereich generiert wurde.

Zum Beispiel, wenn Sie eine Zeile in tabelle1 einfügen, aber das Insert einen Trigger auslöst, die eine Zeile in table2 einfügt, dann @@IDENTITY wird die Identität von table2 Rückkehr während SCOPE_IDENTITY wird die Identität von zurückkehren table1.

INSERT INTO my_table (my_column) VALUES ('test') 

-- return the identity of the row you just inserted into my_table 
-- regardless of any other inserts made by triggers etc 
SELECT SCOPE_IDENTITY() AS ins_id 
  0

Ich habe auch gesehen: SELECT CAST (COALESCE (SCOPE_IDENTITY() @@ IDENTITY) AS int) 14 mai. 142014-05-14 19:37:47

  0

unten gestimmt. Ich sehe keine PHP, die Frage war "Wie man ID in MSSQL in PHP einfügen". 27 jun. 152015-06-27 02:40:49


1

Nein; Es funktioniert ähnlich wie SELECT LAST_INSERT_ID() in mysql und ruft den letzten eingegebenen Identitätswert ab. Vielleicht möchten Sie einen Blick auf this in-depth examination werfen, um mehr darüber zu erfahren, worüber Sie besorgt sein könnten.


1

Hier ist Code-Schnipsel etwas auf Joomla-Code basiert. $ dbh ist Datenbankverbindung (Ergebnis von mssql_connect()). Der Schlüsselname (ID) wird aktualisiert, wenn Sie $ keyName Argument übergeben.

Dieser Code verwendet das MSSQL-Schlüsselwort "OUTPUT", um die ID (oder einen beliebigen erforderlichen Wert) des eingefügten Werts zu erhalten.

function mssql_insertObject($table, &$object, $keyName = NULL) 
{ 
    global $dbh; 

    if($keyName) { 
     $fmtsql = 'INSERT INTO '. $table .' (%s) OUTPUT INSERTED.' . $keyName . ' VALUES (%s) '; 
    } 
    else { 
     $fmtsql = 'INSERT INTO '. $table .' (%s) VALUES (%s) '; 
    } 

    $fields = array(); 

    foreach (get_object_vars($object) as $k => $v) { 
     if (is_array($v) or is_object($v) or $v === NULL) { 
      continue; 
     } 

     if ($k[0] == '_') { // internal field 
      continue; 
     } 

     $fields[] = $k; 
     $values[] = "'" . str_replace("'", "''", $v) . "'"; 
    } 

    $sql = sprintf($fmtsql, implode(",", $fields) , implode(",", $values)); 

    $query = mssql_query($sql, $dbh); 

    if($query === false) { 
     return false; 
    } 

    if(is_resource($query)) 
    { 
     if($keyName) { 
      $id = mssql_result($query, 0, 0); 

      if($id) { 
       $object->$keyName = $id; 
      } 
     } 

     mssql_free_result($query); 
    } 

    return true; 
} 
  0

Ich mag diese Lösung, weil ich glaube, dass sie alle Ihre Basen abdeckt, da Sie mit SCOPE_IDENTITY keine GUID (pk) erhalten können. Aber die Verwendung von mssql_result in Verbindung mit OUTPUT INSERTED in Ihrer SQL-Anweisung funktioniert mit PKs, die automatisch inkrementiert oder eindeutig sind sticht wie GUIDs. 02 aug. 172017-08-02 17:49:58