Что заставляет SQL Server возвращать сообщение «Оператор завершен»? - PullRequest
7 голосов
/ 16 июня 2010

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

Из каких источников это сообщение может быть возвращеноSQL Server?

Ответы [ 3 ]

13 голосов
/ 16 июня 2010

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

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

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

1 голос
/ 16 июня 2010

Чтобы получить числовой код ошибки из 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;
    }
}
0 голосов
/ 03 декабря 2015

Вы можете использовать код в сообщении, чтобы узнать, какая именно ошибка.Например:

[2627: оператор был прерван.]

В этом случае код ошибки - 2627, поэтому, если вы выполните sql под вамиузнаем сообщение

SELECT msg.text
  FROM sys.messages msg 
 INNER JOIN sys.syslanguages lng ON lng.msglangid = msg.language_id
 WHERE msg.message_id = 2627
   AND lng.alias = 'English'

Нарушение ограничения% ls "%. * ls".Невозможно вставить повторяющийся ключ в объект "%. * Ls".Значение повторяющегося ключа% ls.

Это способ узнать правильное сообщение об ошибке.В моем примере ошибка является нарушением первичного ключа

...