2013-07-29 3 views
0

Мы разработали наше приложение в CakePHP, работающем с MYSQL, и это работает нормально. Версия PHP - 5.4.16, Apache 2.4.4, последняя версия XAMP. Версия CakePHP: 2.3.0Проблема в cakephp при выполнении некоторой хранимой процедуры MSSQL

У нас уже есть аналогичная база данных в MSSQL. Теперь мы также хотим запустить наше приложение с этим MSSQL.

Для этого мы используем php_pdo_sqlsrv_54_ts.dll и php_sqlsrv_54_ts.dll для драйвера MSSQL. Его сервер sql 2005.

Проблема в том, что когда я запускаю определенные хранимые процедуры сервера sql, cakephp ничего не запускает. Я вижу в профилировщике SQL синтаксис вызова хранимой процедуры, и все параметры верны. Я также вижу в профилировщике, что этот хранимый proc работает на сервере SQL совершенно нормально. Но трюк ничего не показывает.

Соответствующие подпрограммы 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 

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

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

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

Приветствие

ответ

0

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

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

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 

удачи

0

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

set nocount on; 

И в конце:

set nocount off; 

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

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

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

Смежные вопросы