代码之家  ›  专栏  ›  技术社区  ›  geocoin

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

  •  7
  • geocoin  · 技术社区  · 14 年前

    什么源可以导致此消息从SQL Server返回?

    3 回复  |  直到 14 年前
        1
  •  14
  •   Philip Kelley    14 年前

    您发现了SQLServer中最烦人的部分之一。有时会引发错误,SQL将生成两条错误消息:第一条解释错误是什么,第二条说一些有用的信息,如“语句已终止”(从技术上讲,是错误号3621)。问题是,SQL和大多数其他与之相关的东西(如PHP)只能看到/拾取/处理/或以其他方式利用最后一条unlcear错误消息。真正有用的那一个就丢了。

    一种更复杂的方法是启动SQLProfiler来跟踪异常事件,然后运行进程。这应该显示发生的所有错误。抛出相关的其他事件(SP:Starting、SP:StmtStarting、SQL:BatchStarting、任何适用于提交到数据库的代码的事件)将显示哪个命令引发了错误。

        2
  •  1
  •   Gary    14 年前

    要从mssql获取数字错误代码,可以执行如下选择

    选择@@ERROR作为错误代码
    它应该返回正确的错误代码。

    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;
        }
    }
    
        3
  •  0
  •   Vinicius Monteiro Alexandre Parpinelli    9 年前

    您可以使用消息中的代码来知道哪个是错误。例如:

    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'
    

    违反了%1!约束'%3!'。无法在中插入重复键 对象'%1!'。重复的键值是%ls。

    这是一种知道正确消息错误的方法。在我的示例中,错误是违反主键