Как получить идентификатор Insert в MSSQL в PHP?


7

В чем заголовок вопроса. С таким запросом, как SELECT @@IDENTITY AS ins_id, мне нужно указать имя таблицы или любую другую информацию, чтобы указать, в какой таблице/базе данных я говорю?

14

@@IDENTITY возвращает самую последнюю идентификацию, сгенерированную в текущем сеансе. В большинстве случаев вы, вероятно, захотите вместо этого использовать SCOPE_IDENTITY, который возвращает самую последнюю идентификацию, сгенерированную в текущей области.

Например, если вставить строку в table1, но вставка запускает триггер, который вставляет строку в table2, то @@IDENTITY возвращает идентификатор из table2 тогда SCOPE_IDENTITY возвращает идентификатор из таблица1.

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

Я также видел: SELECT CAST (COALESCE (SCOPE_IDENTITY(), @@ IDENTITY) AS межд) 14 май. 142014-05-14 19:37:47

  0

вниз проголосовали. Я не вижу php, вопрос был «Как получить идентификатор Insert в MSSQL в PHP». 27 июн. 152015-06-27 02:40:49


1

Нет; он работает так же, как SELECT LAST_INSERT_ID() в mysql, извлекает последнее вставленное значение. Вы можете взглянуть на this in-depth examination для получения дополнительной информации о том, что вы можете беспокоиться об этом.


1

Ниже приведен фрагмент кода, основанный на коде Joomla. $ dbh - соединение с базой данных (результат mssql_connect()). Имя ключа (ID) обновляется, если вы передаете аргумент $ keyName.

Этот код использует ключевое слово MSSQL «OUTPUT» для получения идентификатора (или любого требуемого значения) вставленного значения.

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

Мне нравится это решение, потому что я считаю, что он охватывает все ваши базы, так как вы не можете получить GUID (pk) с помощью SCOPE_IDENTITY .., но используя mssql_result в сочетании с OUTPUT INSERTED в вашем SQL-заявлении работает с pk, которые являются автоматически увеличивающимися целыми числами или уникальными укусы вроде GUID. 02 авг. 172017-08-02 17:49:58