如何使用php,SQL SERVER 2005从INSERT语句返回插入的行?

时间:2011-09-16 20:53:25

标签: php sql-server sql-server-2005

在INSERT语句之后插入整个行的最简单/最有效方式是什么?

我很确定我可以这样做:

$aQuery = "INSERT into myTable (a, b, c) VALUES (1, 'Hello', 'Goodbye')";
//the IDENTITY coloumn in myTable is named id
$result = sqlsrv_query($myConn, $aQuery );
if ($result) {
    $res = sqlsrv_query('SELECT LAST_INSERT_ID()');
    $row = sqlsrv_fetch_array($res);
    $lastInsertId = $row[0];
    $subQuery = "SELECT * FROM myTable where id = {$lastInsertId}";
    $subResult = sqlsrv_query($myConn, $subQuery);
    if ($subResult) {
        while($subrow = sqlsrv_fetch_array($subResult)) {
            echo($subrow ['id'] . ', '.
                 $subrow ['a'] . ', '.
                 $subrow ['b']);  //etc...
        }
     }
}

但是,我担心在SELECT LAST_INSERT_ID()之前发生另一个插入的可能性,从而搞乱我的逻辑引导。我怎么能确定最后插入的id是我之前调用过的INSERT,而不是其他地方发生的事情?

是否有更合适的方法,可能是一个完整的SQL解决方案(这样查询会自动返回行而不是使用PHP)?

更新:myTable DOES 有一个明确定义(并自动增加)的标识列,名为id

3 个答案:

答案 0 :(得分:4)

这将有效:

"INSERT into myTable (a, b, c) OUTPUT Inserted.a, Inserted.b, Inserted.c VALUES (1, 'Hello', 'Goodbye')

答案 1 :(得分:1)

在Sql Server中,您可以使用select @lastID=SCOPE_IDENTITY()

@LastID将为当前范围插入最后一个ID;因此,如果中间有另一个插入,您仍然可以在选择中获得正确的记录。

永远不要使用@@Identity,否则您可能会遇到类似于您描述的情况。

答案 2 :(得分:0)

如果您要使用标识字段(也许您应该使用),则会出现一个名为SCOPE_IDENTIY()的命令,您可以在此处找到该信息: http://msdn.microsoft.com/en-us/library/ms190315.aspx

由于您不使用它,因此您在插入时不必选择最新数据,因此只需使用相同的数据而不是选择。