У меня есть приложение, подобное следующему:
//create table test_table( id int identity, n int )
$connectionInfo = array( "Database"=>$Database, "UID"=>$User, "PWD"=>$Password);
$Conn = sqlsrv_connect( $Server, $connectionInfo) ;
if ( $Conn === false )
{
print "*** CONNECTION FAILED for database $Database, user $User, server $Server ***" ;
die() ;
}
sqlsrv_configure( 'WarningsReturnAsErrors', 0 ) ;
$params = array();
$options = array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
$ExecutedCommand = sqlsrv_query( $Conn, "insert test_table output inserted.id values( 123 )", $params, $options ) ;
//$ExecutedCommand = sqlsrv_query( $Conn, "select count(*) from test_table", $params, $options ) ;
if ( $ExecutedCommand === false )
{
print "*** COMMAND FAILED ***\n" ;
print_r( sqlsrv_errors() ) ;
die() ;
}
print "rows=" . sqlsrv_num_rows( $ExecutedCommand ) . "\n" ;
print_r( sqlsrv_fetch_array( $ExecutedCommand ) ) ;
Идея состоит в том, чтобы вставить строку и вывести вновь вставленное значение идентификатора, чтобы создать несколько дочерних записей.
Результат действительно удивителен:
rows=-1
Array
(
[0] => 4
[id] => 4
)
Другими словами, sqlsrv_fetch_array возвращает ожидаемый результат, но проблема в том, что sqlsrv_num_rows возвращает -1, как это происходит в случае ошибки.
Если я заменю INSERT..OTPUT, например, оператором SELECT (см. Закомментированную строку), все будет работать хорошо.
Обратите внимание, что если я делаю:
$ExecutedCommand = sqlsrv_query( $Conn, "insert test_table values( 123 )", $params, $options ) ;
$ExecutedCommand = sqlsrv_query( $Conn, "select n=SCOPE_IDENTITY()", $params, $options ) ;
Проблема все еще сохраняется. Однако, если проблема не появляются, если я делаю:
$ExecutedCommand = sqlsrv_query( $Conn, "insert test_table values( 123 )", $params, $options ) ;
$ExecutedCommand = sqlsrv_query( $Conn, "select n=SCOPE_IDENTITY() INTO #t", $params, $options ) ;
$ExecutedCommand = sqlsrv_query( $Conn, "select n FROM #t", $params, $options ) ;
Ты хоть представляешь, что происходит?
Подробности:
PHP 7.0.9 (cli) (сборка: 20 июля 2016 г., 11:08:23) (ZTS)
Windows 10
SQL Server 2016
sqlsrv, информация от php -i:
sqlsrv support => enabled
ExtensionVer => 4.0.8629.2
Directive => Local Value => Master Value
sqlsrv.ClientBufferMaxKBSize => 10240 => 10240
sqlsrv.LogSeverity => 0 => 0
sqlsrv.LogSubsystems => 0 => 0
sqlsrv.WarningsReturnAsErrors => On => On
Задача ещё не решена.
Других решений пока нет …