我们在使用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
如果我删除中间部分,那么它会起作用。
其余的存储过程工作正常。
任何帮助都将受到高度赞赏。
干杯
答案 0 :(得分: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
祝你好运
答案 1 :(得分:0)
在开始时添加简单:
set nocount on;
最后:
set nocount off;
它会给你结果。
当我们使用任何if-else conditions
时会发生这种情况。
当你遇到这样的情况,即存储过程在sql profiler中给出结果,但是没有显示从cakephp触发的查询中的任何结果时,只需将nocount on off
分别放在开头和结尾。