Jak uzyskać identyfikator Wstaw w MSSQL w PHP?


7

Co mówi tytuł pytania. W zapytaniu takim jak SELECT @@IDENTITY AS ins_id, czy muszę podać nazwę tabeli lub inne informacje, aby określić, o której tablicy lub bazie mówię?

14

@@IDENTITY zwraca ostatnią tożsamość wygenerowaną w bieżącej sesji. W większości przypadków prawdopodobnie będziesz chciał użyć wartości SCOPE_IDENTITY, która zwraca ostatnią tożsamość wygenerowaną w bieżącym zakresie.

Na przykład, jeśli wstawić wiersz do tabela1, ale że wkładka wystrzeliwuje spust, który wstawia wiersz do Table2, następnie @@IDENTITY powróci tożsamości z Table2 natomiast SCOPE_IDENTITY powróci tożsamości z 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

Widziałem też: SELECT CAST (COALESCE (SCOPE_IDENTITY(), @@ IDENTITY) AS int) 14 maj. 142014-05-14 19:37:47

  0

dół przydatne. Nie widzę żadnego php, pytanie brzmiało "Jak uzyskać Insert id w MSSQL w PHP". 27 cze. 152015-06-27 02:40:49


1

Nie; działa podobnie jak SELECT LAST_INSERT_ID() w mysql, pobierając ostatnią wstawioną wartość tożsamości. Możesz zajrzeć na stronę this in-depth examination, aby dowiedzieć się więcej o tym, co może Cię zainteresować.


1

Oto fragment kodu w pewnym stopniu oparty na kodzie Joomla. $ dbh to połączenie z bazą danych (wynik mssql_connect()). Nazwa klucza (ID) jest aktualizowana, jeśli przekazujesz argument $ keyName.

Ten kod używa słowa kluczowego MSSQL "WYJŚCIE", aby uzyskać identyfikator (lub dowolną wymaganą wartość) wstawionej wartości.

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

Podoba mi się to rozwiązanie, ponieważ wydaje mi się, że obejmuje ono wszystkie twoje bazy, ponieważ nie możesz uzyskać identyfikatora GUID (pk) z SCOPE_IDENTITY .., ale użycie mssql_result w połączeniu z OUTPUT INSERTED w instrukcji sql działa z pk, które są automatycznie zwiększanymi liczbami całkowitymi lub unikalnymi żądła jak GUID. 02 sie. 172017-08-02 17:49:58