是什么导致SQL Server返回消息'语句已被终止'?

时间:2010-06-16 13:31:26

标签: php sql sql-server-2000

我有一个非常简单的INSERT语句,是从在Linux Apache Web服务器上运行的PHP脚本执行的。我可以在SQL Management Studio中运行查询,它通常也可以从PHP运行。但是,每隔一段时间我就会从我的PHP脚本中收到一条错误消息,指出查询失败并且mssql_get_last_message()函数返回'语句已被终止'。

哪些来源可以导致从SQL Server返回此消息?

3 个答案:

答案 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。

这是一种了解正确的邮件错误的方法。在我的示例中,错误是违反主键