Как вернуть вставленную строку из оператора INSERT с помощью php, SQL SERVER 2005? - PullRequest
2 голосов
/ 17 сентября 2011

Каков самый простой / самый эффективный способ получить всю строку, вставленную после оператора 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() и, таким образом, испортит мою логику для загрузки.Как я могу быть уверен, что последний вставленный идентификатор - это действительно ВСТАВКА, которую я вызывал ранее, а не то, что происходит где-то еще?

Есть ли более подходящий способ сделать это, возможно, полное решение SQL (такое, чтозапрос возвращает строку автоматически, а не с использованием PHP)?

ОБНОВЛЕНИЕ: myTable У DOES есть явно определенный (и автоматически увеличивающийся) столбец идентификаторов с именем id.

Ответы [ 3 ]

4 голосов
/ 17 сентября 2011

Это будет работать:

"INSERT into myTable (a, b, c) OUTPUT Inserted.a, Inserted.b, Inserted.c VALUES (1, 'Hello', 'Goodbye')
1 голос
/ 17 сентября 2011

В Sql Server вы должны использовать select @lastID=SCOPE_IDENTITY()

, а для @LastID будет вставлен последний идентификатор для текущей области;следовательно, если бы была другая вставка в середине, вы все равно получили бы правильную запись на ваш выбор.

Никогда не используйте @@Identity для этого, или вы можете оказаться в ситуации, как вы описали.

0 голосов
/ 17 сентября 2011

Если вы должны использовать поле идентификации (что, возможно, вам следует), есть команда SCOPE_IDENTIY (), информацию о которой вы можете найти здесь: http://msdn.microsoft.com/en-us/library/ms190315.aspx

Так как вы не используете ее, выВам нужно выбрать последние данные, поскольку они у вас есть при вставке, поэтому просто используйте те же данные вместо выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...