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

9

问题标题已经说明了一切。使用这样的查询SELECT @@IDENTITY AS ins_id,我需要提供表名或任何其他信息来指定我所讲的是哪个表/数据库吗?

3个回答

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

我也看到过:SELECT CAST(COALESCE(SCOPE_IDENTITY(), @@IDENTITY) AS int) - jjwdesign
1
被踩了。我没有看到任何PHP相关内容,问题是“如何在PHP中获取MSSQL的插入ID”。 - M H

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;
}

我喜欢这个解决方案,因为我相信它涵盖了所有的基础知识,因为你不能使用SCOPE_IDENTITY获取GUID(pk)。但是,在SQL语句中使用mssql_result与OUTPUT INSERTED结合使用可以处理自动递增整数或唯一字符串(如GUID)的pk。 - greaterKing

1

不是的;它的工作方式类似于mysql中的SELECT LAST_INSERT_ID(),检索最后插入的标识值。您可能需要查看这个深入的研究,以了解更多关于它可能涉及到的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接