Intereting Posts

Что заставляет SQL Server возвращать сообщение «Заявление завершено»?

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

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

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

Быстрый способ выяснить, что происходит, – запустить последовательность команд, ведущих к ошибке из 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; } } 

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

[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.

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