2009-02-22 31 views

回答

14

@@IDENTITY返回当前会话中生成的最新身份。在大多数情况下,您可能会想要使用SCOPE_IDENTITY,它将返回当前作用域中生成的最新标识。

例如,如果您插入一行到表1,但插入触发其插入行表2触发,然后@@IDENTITY将从表2返回身份而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)为INT) – jjwdesign 2014-05-14 19:37:47

+0

下投票。我没有看到任何PHP,问题是“如何在MSSQL中获取插入ID在PHP中”。 – 2015-06-27 02:40:49

1

否;它的工作原理与MySQL中的SELECT LAST_INSERT_ID()非常相似,它检索插入的最后一个标识值。您可能需要查看this in-depth examination以了解更多关于您可能想要关注的内容。

1

这是一些基于Joomla代码的代码片段。 $ dbh是数据库连接(mssql_connect()的结果)。如果您传递$ keyName参数,则键名(ID)会更新。

此代码使用MSSQL关键字“OUTPUT”获取插入值的ID(或任何所需值)。

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; 
} 
相关问题