У меня есть очень простой оператор INSERT, выполняемый из Сценария PHP, работающего на веб-сервере Apache Linux. Я могу выполнить запрос, прекрасный из Studio управления SQL, и он обычно хорошо работает от PHP также. Однако каждый однажды в некоторое время я получаю сообщение об ошибке из своего Сценария PHP, что неудавшийся запрос и mssql_get_last_message () функциональные возвраты 'Оператор был завершен'.
Какие источники могут заставить это сообщение быть возвращенным из SQL Server?
Вы обнаружили одну из самых раздражающих частей SQL Server. Бывают ситуации, когда может возникнуть ошибка, и SQL сгенерирует два сообщения об ошибке: первое, чтобы объяснить, что это за ошибка, а второе, чтобы сказать что-то полезное, например, «Оператор был прерван» (который, технически, является номером ошибки 3621). Дело в том, что SQL и все остальное, что его касается - например, PHP - может только видеть / подбирать / обрабатывать / или иным образом использовать это последнее сообщение об ошибке unlcear. Тот, который действительно полезен, теряется.
Быстрый способ выяснить, что происходит, - запустить последовательность команд, ведущих к ошибке из SSMS. Это, видимо, у вас не пойдет.
Более сложный способ выяснить это - запустить SQL Profiler для отслеживания события Exception, а затем запустить свой процесс. Это должно показать все произошедшие ошибки. Добавление соответствующих других событий (SP: Starting, SP: StmtStarting, SQL: BatchStarting, все, что применимо к коду, который вы отправляете в базу данных), покажет, какая команда вызывает ошибку.
Чтобы получить числовой код ошибки из mssql, вы можете выбрать что-то вроде
SELECT @@ ERROR AS ErrorCode
Который ДОЛЖЕН возвращать правильный код ошибки.
Вы также можете попробовать этот код, который размещен на PHP.NET.
function query($sQuery, $hDb_conn, $sError, $bDebug)
{
if(!$rQuery = @mssql_query($sQuery, $hDb_conn))
{
$sMssql_get_last_message = mssql_get_last_message();
$sQuery_added = "BEGIN TRY\n";
$sQuery_added .= "\t".$sQuery."\n";
$sQuery_added .= "END TRY\n";
$sQuery_added .= "BEGIN CATCH\n";
$sQuery_added .= "\tSELECT 'Error: ' + ERROR_MESSAGE()\n";
$sQuery_added .= "END CATCH";
$rRun2= @mssql_query($sQuery_added, $hDb_conn);
$aReturn = @mssql_fetch_assoc($rRun2);
if(empty($aReturn))
{
echo $sError.'. MSSQL returned: '.$sMssql_get_last_message.'.<br>Executed query: '.nl2br($sQuery);
}
elseif(isset($aReturn['computed']))
{
echo $sError.'. MSSQL returned: '.$aReturn['computed'].'.<br>Executed query: '.nl2br($sQuery);
}
return FALSE;
}
else
{
return $rQuery;
}
}