如何在PHP中的MSSQL中获取插入ID?

时间:2009-02-22 12:37:07

标签: php sql-server

问题标题是什么。使用SELECT @@IDENTITY AS ins_id之类的查询,我是否需要提供表名或任何其他信息来指定我正在谈论的表/数据库?

3 个答案:

答案 0 :(得分:16)

@@IDENTITY返回当前会话中生成的最新标识。在大多数情况下,您可能希望使用SCOPE_IDENTITY代替,它会返回当前范围内生成的最新标识。

例如,如果您在 table1 中插入一行,但该插入会触发一个将行插入 table2 的触发器,那么@@IDENTITY将返回来自 table2 的身份,而SCOPE_IDENTITY将从 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

答案 1 :(得分:1)

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

答案 2 :(得分: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;
}