【问题标题】:Stored procedure output parameter always gives 0 in PHP end存储过程输出参数在 PHP 结束时总是给 0
【发布时间】:2015-03-27 10:02:46
【问题描述】:

存储过程从 MS SQL Server 测试并给出了预期的输出(对于@AID)。但是当从 PHP 调用时,@AID 总是给出 0。我在这里做错了什么?

$stmt = mssql_init('UpdateActivity2', $conn);
mssql_bind($stmt, '@ParentActivity', $PP_ActivityID, SQLINT4, false, false, 8);
mssql_bind($stmt, '@ActivityName', $activityName, SQLVARCHAR, false, false, 255);
mssql_bind($stmt, '@ActivityType', $activityType, SQLINT4, false, false, 4);
mssql_bind($stmt, '@ActivityStatus', $activityStatus, SQLINT4, false, false,4);
mssql_bind($stmt, '@Descr', $descr, SQLVARCHAR, false, false, 255);
mssql_bind($stmt, '@RegistrationDate', $now, SQLVARCHAR, false, false, 255);
mssql_bind($stmt, '@FinishDate', $now, SQLVARCHAR, false, false, 255);
mssql_bind($stmt, '@Owner', $owner, SQLINT4, false, false, 4);
mssql_bind($stmt, '@SourceID', $sourceID, SQLINT4, false, false, 4);
mssql_bind($stmt, '@ContactID', $c, SQLINT4, false, false, 4);
mssql_bind($stmt, '@ActivityAddress',$a, SQLVARCHAR, false, false, 255);
mssql_bind($stmt, '@ExtReference', $e, SQLVARCHAR, false, false, 255);
mssql_bind($stmt, '@ResponsibleCompanyID', $e, SQLINT4, false, false, 4);
mssql_bind($stmt, '@AID', $h, SQLINT4, true);
$proc_result = mssql_execute($stmt);
echo $h;

@AID 是存储过程的输出参数。但是,$h 总是给出 0。 这是 SP:

ALTER PROCEDURE [dbo].[UpdateActivity2]
@ParentActivity int,
@ActivityName varchar(150),
@ActivityType int,
@ActivityStatus int,
@Descr varchar(1024),
@RegistrationDate datetime,
@FinishDate datetime,
@Owner int,
@SourceID int,
@ContactID int,
@ActivityAddress varchar(150),
@ExtReference varchar(50),
@ResponsibleCompanyID int,
@AID int OUTPUT
AS
DECLARE @Value int;
EXEC @Value =  PG_GetSeq @Name = 'Activity'
PRINT('Printing')
PRINT(@Value)
INSERT INTO Activity(
                ActivityID, 
                ParentActivity, 
                ActivityName, 
                ActivityType, 
                ActivityStatus, 
                Descr, 
                RegistrationDate, 
                FinishDate, 
                Owner, 
                SourceID, 
                ContactID, 
                ActivityAddress, 
                ExtReference, 
                ResponsibleCompanyID
            )
            VALUES(
                @Value, 
                @ParentActivity, 
                @ActivityName, 
                @ActivityType, 
                @ActivityStatus, 
                @Descr, 
                @RegistrationDate, 
                @FinishDate, 
                @Owner, 
                @SourceID, 
                @ContactID, 
                @ActivityAddress, 
                @ExtReference, 
                @ResponsibleCompanyID
            )

    SELECT @AID = ActivityID FROM Activity WHERE ActivityID = @Value

Insert 语句为 @Value 获取正确的值,并且该行也正确插入。

【问题讨论】:

    标签: php sql-server stored-procedures


    【解决方案1】:

    根据the documentation

    如果存储过程返回参数或返回值,这些将在调用 mssql_execute() 后可用,除非存储过程返回多个结果集。在这种情况下,使用 mssql_next_result() 来切换结果。处理完最后一个结果后,输出参数和返回值将可用。

    您的打印语句(以及可能的行数)正在干扰结果集,因此看起来好像您有多个,因此您需要调用 mssql_next_result() 直到它返回 false 然后您才能访问输出参数。

    您也可以将true 传递给参数$skip_results

    mssql_execute($stmt, false);
    

    这使您可以立即访问输出参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多