Ошибка в 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
в начале и в конце соответственно.