【问题标题】:Issue in cakephp when execute certain MSSQL stored procedure执行某些 MSSQL 存储过程时 cakephp 中的问题
【发布时间】:2013-07-29 12:13:31
【问题描述】:

我们已经在运行 MYSQL 的 CakePHP 中开发了我们的应用程序,并且运行良好。 PHP 版本是 5.4.16,Apache 2.4.4,最新的 XAMP。 CakePHP 版本:2.3.0

我们在 MSSQL 中也已经有了类似的数据库。现在我们也想用这个 MSSQL 运行我们的应用程序。

我们为此使用 php_pdo_sqlsrv_54_ts.dll 和 php_sqlsrv_54_ts.dll 作为 MSSQL 驱动程序。它的 sql server 2005。

问题是当我运行某些 sql server 存储过程时,cakephp 什么也没运行。我可以在 SQL 分析器中看到存储过程调用的语法很好,并且所有参数都是正确的。我还可以在分析器中看到这个存储过程在 SQL 服务器中运行得非常好。但是 cakephp 没有显示任何内容。

相应的 MySql 例程工作正常, cakephp 返回正确的数据。

这是存储过程后跟的 php 代码。

    $getCoulmnsInfo =$this->Maintable->query('exec GetColumns_Information 0');          

    print_r($getCoulmnsInfo); // This prints nothing, $getCoulmnsInfo is empty

对应的SQL server存储过程为

    ALTER PROCEDURE [dbo].[GetColumns_Information]
    @GroupOverride midsys_boolean AS
    IF ( @GroupOverride = 1 )
    BEGIN SELECT columns_id, columns_columntypesid, columns_columnname,    
    columns_usercolumnname, 1 FROM ColumnsTable ORDER BY columns_id RETURN END

    SELECT columns_id, columns_columntypesid, columns_columnname,         
    columns_usercolumnname, columns_columnsettings
    FROM ColumnsTable
    ORDER BY columns_id

现在,如果将上面的内容修改为如下,那么它可以正常工作并返回正确的结果。基本上我删除了中间的几行。

    ALTER PROCEDURE [dbo].[GetColumns_Information]
    @GroupOverride midsys_boolean AS

    SELECT columns_id, columns_columntypesid, columns_columnname,         
    columns_usercolumnname, columns_columnsettings
    FROM ColumnsTable
    ORDER BY columns_id

另一个不工作的存储过程示例。

    ALTER PROCEDURE [dbo].[MainStatusesFlow_Next]
    @MainID int AS
    DECLARE @MainStatusesID int

    SELECT @MainStatusesID = main_mainstatusesid
    FROM MainTable
    WHERE main_id = @MainID

    IF EXISTS ( SELECT * FROM MainStatusesTable MainStatuses INNER JOIN         
    MainStatusesFlowTable MainStatusesFlow ON MainStatuses.mainstatuses_id =         
    MainStatusesFlow.mainstatusesflow_nextstatusid WHERE         
    MainStatusesFlow.mainstatusesflow_statusid = 10 )
    BEGIN SELECT MainStatuses.mainstatuses_name FROM MainStatusesTable MainStatuses         
    INNER JOIN MainStatusesFlowTable MainStatusesFlow ON MainStatuses.mainstatuses_id =         
    MainStatusesFlow.mainstatusesflow_nextstatusid WHERE         
    MainStatusesFlow.mainstatusesflow_statusid = 10 RETURN END

    SELECT mainstatuses_name, 1
    FROM MainStatusesTable
    WHERE mainstatuses_id = 10

如果我再次删除中间部分,它就会起作用。

其余的存储过程都工作得很好。

任何帮助将不胜感激。

干杯

【问题讨论】:

    标签: php sql-server cakephp cakephp-2.0 cakephp-model


    【解决方案1】:

    我认为您的问题可能与多个记录集以及驱动程序如何处理发送它们(或者它可能如何处理它)有关。

    您可以尝试将其中一个存储过程更改为此

    ALTER PROCEDURE [dbo].[GetColumns_Information]
    @GroupOverride midsys_boolean AS
    IF ( @GroupOverride = 1 )
    BEGIN 
    SELECT columns_id, columns_columntypesid, columns_columnname,    
    columns_usercolumnname, 1 AS 'columns_columnsettings'
    FROM ColumnsTable 
    ORDER BY columns_id
    END
    
    ELSE
    BEGIN
    SELECT columns_id, columns_columntypesid, columns_columnname,         
    columns_usercolumnname, columns_columnsettings
    FROM ColumnsTable
    ORDER BY columns_id
    END
    

    在这种情况下,您可以简化为一个记录集

    SELECT columns_id, columns_columntypesid, columns_columnname,    
    columns_usercolumnname,
    CASE
    WHEN @GroupOverride = 1 THEN 1
    ELSE columns_columnsettings
    END AS 'columns_columnsettings'
    FROM ColumnsTable 
    ORDER BY columns_id
    

    祝你好运

    【讨论】:

      【解决方案2】:

      只需简单的在开头添加:

      set nocount on;
      

      最后:

      set nocount off; 
      

      它会给你结果。

      当我们使用任何if-else conditions 时会发生这种情况。

      当您遇到存储过程在 sql profiler 中给出结果,但在 cakephp 触发的查询中没有显示任何结果的情况时,只需将 nocount on off 分别放在开头和结尾。

      【讨论】:

        猜你喜欢
        • 2011-04-02
        • 1970-01-01
        • 2020-05-27
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        • 1970-01-01
        • 1970-01-01
        • 2021-05-22
        相关资源
        最近更新 更多