【问题标题】:SQL Server Procedure not returning output in PHPSQL Server过程未在PHP中返回输出
【发布时间】:2016-06-20 13:11:36
【问题描述】:

我正在尝试执行一个 SQL 过程并在 php.ini 中返回值。我的代码如下:

<?PHP
include "conn.php";
    $myquery= "exec CR_Report @System='Automated Forms'";
    $fetched=sqlsrv_query($conn,$myquery);
    if( $fetched === false ) { die( print_r( sqlsrv_errors(), true ));}
        while($res=sqlsrv_fetch_array($fetched,SQLSRV_FETCH_ASSOC))
        {
            echo $res['ID'];
        }
?>

程序:

CREATE procedure [dbo].[CR_Report]
    @Department varchar(60)  = Null,
    @System varchar(30) = Null,
    @Fromdate date = Null,
    @Todate date = Null
AS
IF @System is Null and 
 @Fromdate is Null and
 @Todate is Null
 BEGIN
 Create table #Temp_ConfigRequest_Department
(
ID int,
Form_No varchar(25),
App_Date smalldatetime,
System  varchar(30)
)

delete #Temp_ConfigRequest_Department

insert into  #Temp_ConfigRequest_Department

SELECT * FROM [SUAF].[dbo].[Config_Request] where Admin_Department = @Department

select * from #Temp_ConfigRequest_Department

DROP TABLE #Temp_ConfigRequest_Department

end
IF @Department is Null and 
 @Fromdate is Null and
 @Todate is Null
 BEGIN

 Create table #Temp_ConfigRequest_System
(
ID int,
Form_No varchar(25),
App_Date smalldatetime,
System  varchar(30)
)

delete #Temp_ConfigRequest_System

insert into  #Temp_ConfigRequest_System

SELECT * FROM [SUAF].[dbo].[Config_Request] where System = @System

select * from #Temp_ConfigRequest_System

DROP TABLE #Temp_ConfigRequest_System

end
IF @Department is NULL and
@System is NULL
BEGIN 
 Create table #Temp_ConfigRequest_Date
(
ID int,
Form_No varchar(25),
App_Date smalldatetime,
System  varchar(30)
)

delete #Temp_ConfigRequest_Date

insert into  #Temp_ConfigRequest_Date

SELECT * FROM [SUAF].[dbo].[Config_Request] where convert(date, App_Date, 103) Between @Fromdate and @Todate

select * from #Temp_ConfigRequest_Date

DROP TABLE #Temp_ConfigRequest_Date

end
IF  @Department is not Null and
    @System is not  Null and
    @Fromdate is not  Null and
    @Todate is not  Null
    BEGIN 
Create table #Temp_ConfigRequest_All
(
ID int,
Form_No varchar(25),
App_Date smalldatetime,
System  varchar(30)
)

delete #Temp_ConfigRequest_All

insert into  #Temp_ConfigRequest_All

SELECT * FROM [SUAF].[dbo].[Config_Request] where convert(date, App_Date, 103) Between @Fromdate and @Todate and Admin_Department = @Department and System = @System

select * from #Temp_ConfigRequest_All

DROP TABLE #Temp_ConfigRequest_All

end

它不返回任何值,并且错误日志中也没有记录任何错误。我尝试在数据库中测试 sql 查询,它确实返回了记录。为了测试连接,我在同一个文件中为另一个过程编写了代码,它正在返回值。第二个代码如下:

<?PHP
$myquery="exec Configuration_Request @IDtemp='4275'";   
    $fetched=sqlsrv_query($conn,$myquery) ; 
    if( $fetched === false ) { die( print_r( sqlsrv_errors(), true ));}
        while($res=sqlsrv_fetch_array($fetched,SQLSRV_FETCH_ASSOC))
        {
            echo $res['Form_No'];
            echo $res['Administrator'];
        }
?>

程序:

create procedure Configuration_Request (@IDtemp int)
as
begin
select * from Config_Request where ID=@IDtemp
end

问题出在哪里?为什么第一个代码没有返回任何值?非常感谢任何帮助/建议。

【问题讨论】:

  • 第一个存储过程中的查询是否返回一个名为“ID”的列?
  • @SimonSellick 是的.. :)
  • 我不是 PHP 专家,但除了存储的 proc 名称之外,我能看到的唯一区别是第二个示例不包括 conn.php。 (另外,缩进看起来有点乱,不影响执行。)如果没有人提出更好的建议,你能发布两个存储过程的源代码吗?
  • @SimonSellick 它们都在同一个文件中,这就是为什么第二个不包含 conn.php 的原因。我可以发布它.. 但它们都在 sql server 中执行时工作..
  • 天啊....这个过程是一个很好的例子,可以避免复杂化的事情。你为什么要创建一个临时表,然后立即删除它?然后你做一个简单的插入,然后选择刚刚插入的数据,然后删除临时表。这应该比一个简单的 select 语句更复杂。

标签: php sql-server stored-procedures


【解决方案1】:

您可以大大简化该过程。它会做同样的事情,但速度更快,因为您不会创建和删除无用的临时表。

CREATE procedure [dbo].[CR_Report]
    @Department varchar(60)  = Null,
    @System varchar(30) = Null,
    @Fromdate date = Null,
    @Todate date = Null
AS

IF @System is Null 
    and @Fromdate is Null 
    and @Todate is Null

    SELECT * FROM [SUAF].[dbo].[Config_Request] where Admin_Department = @Department

IF @Department is Null 
    and @Fromdate is Null 
    and @Todate is Null

    SELECT * FROM [SUAF].[dbo].[Config_Request] where System = @System

IF @Department is NULL 
    and @System is NULL

    SELECT * FROM [SUAF].[dbo].[Config_Request] where convert(date, App_Date, 103) Between @Fromdate and @Todate

IF  @Department is not Null 
    and @System is not Null 
    and @Fromdate is not Null 
    and @Todate is not Null

    SELECT * FROM [SUAF].[dbo].[Config_Request] where convert(date, App_Date, 103) Between @Fromdate and @Todate and Admin_Department = @Department and System = @System

【讨论】:

  • 我不知道我在我的程序中给出的某些参数是错误的还是什么!但这完全成功了:) 非常感谢你!我虽然临时表是从数据库中检索数据的更快方法,但我想我错了.. :) 感谢您的帮助。
  • 临时表可以快速但有效地制作数据副本以仅选择它然后删除临时表。很高兴这有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 2016-10-17
相关资源
最近更新 更多