Что заставляет SQL Server возвращаться, сообщение 'Оператор было завершено'?

У меня есть очень простой оператор INSERT, выполняемый из Сценария PHP, работающего на веб-сервере Apache Linux. Я могу выполнить запрос, прекрасный из Studio управления SQL, и он обычно хорошо работает от PHP также. Однако каждый однажды в некоторое время я получаю сообщение об ошибке из своего Сценария PHP, что неудавшийся запрос и mssql_get_last_message () функциональные возвраты 'Оператор был завершен'.

Какие источники могут заставить это сообщение быть возвращенным из SQL Server?

7
задан John Saunders 11 July 2010 в 05:44
поделиться

2 ответа

Вы обнаружили одну из самых раздражающих частей SQL Server. Бывают ситуации, когда может возникнуть ошибка, и SQL сгенерирует два сообщения об ошибке: первое, чтобы объяснить, что это за ошибка, а второе, чтобы сказать что-то полезное, например, «Оператор был прерван» (который, технически, является номером ошибки 3621). Дело в том, что SQL и все остальное, что его касается - например, PHP - может только видеть / подбирать / обрабатывать / или иным образом использовать это последнее сообщение об ошибке unlcear. Тот, который действительно полезен, теряется.

Быстрый способ выяснить, что происходит, - запустить последовательность команд, ведущих к ошибке из SSMS. Это, видимо, у вас не пойдет.

Более сложный способ выяснить это - запустить SQL Profiler для отслеживания события Exception, а затем запустить свой процесс. Это должно показать все произошедшие ошибки. Добавление соответствующих других событий (SP: Starting, SP: StmtStarting, SQL: BatchStarting, все, что применимо к коду, который вы отправляете в базу данных), покажет, какая команда вызывает ошибку.

13
ответ дан 6 December 2019 в 15:18
поделиться

Чтобы получить числовой код ошибки из 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;
    }
}
1
ответ дан 6 December 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: