我有一个非常简单的INSERT语句,是从在Linux Apache Web服务器上运行的PHP脚本执行的。我可以在SQL Management Studio中运行查询,它通常也可以从PHP运行。但是,每隔一段时间我就会从我的PHP脚本中收到一条错误消息,指出查询失败并且mssql_get_last_message()函数返回'语句已被终止'。
哪些来源可以导致从SQL Server返回此消息?
答案 0 :(得分:13)
您已经找到了SQL Server中最烦人的部分之一。在某些情况下可能会引发错误,并且SQL将生成两条错误消息:第一个用于解释错误是什么,第二个用于说出有用的内容,例如“语句已被终止”(从技术上讲,这是错误编号) 3621)。问题是SQL,以及触及它的大多数其他东西 - 例如PHP - 只能看到/拾取/处理/或以其他方式利用最后的unlcear错误消息。那个实际有用的东西会丢失。
快速找出正在发生的事情的方法是运行导致SSMS错误的命令序列。显然,这对你不起作用。
解决问题的一种更为简单的方法是启动SQL事件探查器以跟踪异常事件,然后运行您的进程。这应该显示发生的所有错误。抛弃相关的其他事件(SP:Starting,SP:StmtStarting,SQL:BatchStarting,适用于您提交给数据库的代码)将显示哪个命令引发了错误。
答案 1 :(得分:1)
要从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;
}
}
答案 2 :(得分:0)
您可以使用消息中的代码来了解哪个是错误。例如:
[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。
这是一种了解正确的邮件错误的方法。在我的示例中,错误是违反主键