Ошибка в cakephp при выполнении определенной хранимой процедуры MSSQL

Мы разработали наше приложение на CakePHP, работающем с MYSQL, и это работает нормально. Версия 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, 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-сервер хранится как

    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

Снова, если я удаляю среднюю часть, тогда это работает.

Остальные сохраненные процы работают абсолютно нормально.

Любая помощь будет высоко оценен.

ура

2 ответа

Я думаю, что ваша проблема, возможно, связана с несколькими наборами записей и с тем, как драйвер обрабатывает их отправку (или как он может справиться с этим).

Не могли бы вы попробовать изменить один из ваших сохраненных процедур на этот

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

Удачи

Просто добавьте в начале:

set nocount on;

И в конце:

set nocount off; 

И это даст вам результат.

Это происходит, когда мы используем какие-либо if-else conditions,

Когда вы сталкиваетесь с таким условием, что хранимые процедуры дают результаты в SQL Server Profiler, но не показывают никакого результата в запросе, запущенном из cakephp, тогда просто nocount on off в начале и в конце соответственно.

Другие вопросы по тегам